Compare 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 # Authorize the user for the requested action
def authorize(ctrl = params[:controller], action = params[:action], global = false) def authorize(ctrl = params[:controller], action = params[:action], global = false)
allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project, :global => global) allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project || @projects, :global => global)
allowed ? true : deny_access allowed ? true : deny_access
end end
@@ -169,6 +169,13 @@ class ApplicationController < ActionController::Base
render_404 render_404
end end
# Find project of id params[:project_id]
def find_project_by_project_id
@project = Project.find(params[:project_id])
rescue ActiveRecord::RecordNotFound
render_404
end
# Find a project based on params[:project_id] # Find a project based on params[:project_id]
# TODO: some subclasses override this, see about merging their logic # TODO: some subclasses override this, see about merging their logic
def find_optional_project def find_optional_project
@@ -206,16 +213,19 @@ class ApplicationController < ActionController::Base
def find_issues def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids]) @issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty? raise ActiveRecord::RecordNotFound if @issues.empty?
projects = @issues.collect(&:project).compact.uniq @projects = @issues.collect(&:project).compact.uniq
if projects.size == 1 @project = @projects.first if @projects.size == 1
@project = projects.first rescue ActiveRecord::RecordNotFound
else 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 # TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects' render_error 'Can not bulk edit/move/destroy issues from different projects'
return false return false
end end
rescue ActiveRecord::RecordNotFound
render_404
end end
# make sure that the user is a member of the project (or admin) if project is private # make sure that the user is a member of the project (or admin) if project is private
+6 -1
View File
@@ -8,6 +8,8 @@ class CalendarsController < ApplicationController
helper :projects helper :projects
helper :queries helper :queries
include QueriesHelper include QueriesHelper
helper :sort
include SortHelper
def show def show
if params[:year] and params[:year].to_i > 1900 if params[:year] and params[:year].to_i > 1900
@@ -32,8 +34,11 @@ class CalendarsController < ApplicationController
@calendar.events = events @calendar.events = events
end end
render :layout => false if request.xhr? render :action => 'show', :layout => false if request.xhr?
end end
def update
show
end
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 @projects = @issues.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1 @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)), :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)), :move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)), :copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => (@project && User.current.allowed_to?(:delete_issues, @project)) :delete => User.current.allowed_to?(:delete_issues, @projects)
} }
if @project if @project
@assignables = @project.assignable_users @assignables = @project.assignable_users
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to) @assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@trackers = @project.trackers @trackers = @project.trackers
else
#when multiple projects, we only keep the intersection of each set
@assignables = @projects.map(&:assignable_users).inject{|memo,a| memo & a}
@trackers = @projects.map(&:trackers).inject{|memo,t| memo & t}
end end
@priorities = IssuePriority.all.reverse @priorities = IssuePriority.all.reverse
+12 -13
View File
@@ -1,7 +1,7 @@
class FilesController < ApplicationController class FilesController < ApplicationController
menu_item :files menu_item :files
before_filter :find_project before_filter :find_project_by_project_id
before_filter :authorize before_filter :authorize
helper :sort helper :sort
@@ -19,19 +19,18 @@ class FilesController < ApplicationController
render :layout => !request.xhr? render :layout => !request.xhr?
end end
# TODO: split method into new (GET) and create (POST)
def new def new
if request.post?
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
attachments = Attachment.attach_files(container, params[:attachments])
render_attachment_warning_if_needed(container)
if !attachments.empty? && !attachments[:files].blank? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments[:files])
end
redirect_to :controller => 'files', :action => 'index', :id => @project
return
end
@versions = @project.versions.sort @versions = @project.versions.sort
end end
def create
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
attachments = Attachment.attach_files(container, params[:attachments])
render_attachment_warning_if_needed(container)
if !attachments.empty? && !attachments[:files].blank? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments[:files])
end
redirect_to project_files_path(@project)
end
end end
+9 -19
View File
@@ -4,6 +4,7 @@ class GanttsController < ApplicationController
rescue_from Query::StatementInvalid, :with => :query_statement_invalid rescue_from Query::StatementInvalid, :with => :query_statement_invalid
helper :gantt
helper :issues helper :issues
helper :projects helper :projects
helper :queries helper :queries
@@ -14,33 +15,22 @@ class GanttsController < ApplicationController
def show def show
@gantt = Redmine::Helpers::Gantt.new(params) @gantt = Redmine::Helpers::Gantt.new(params)
@gantt.project = @project
retrieve_query retrieve_query
@query.group_by = nil @query.group_by = nil
if @query.valid? @gantt.query = @query if @query.valid?
events = []
# Issues that have start and due dates
events += @query.issues(:include => [:tracker, :assigned_to, :priority],
:order => "start_date, due_date",
:conditions => ["(((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?) or (start_date<? and due_date>?)) and start_date is not null and due_date is not null)", @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to]
)
# Issues that don't have a due date but that are assigned to a version with a date
events += @query.issues(:include => [:tracker, :assigned_to, :priority, :fixed_version],
:order => "start_date, effective_date",
:conditions => ["(((start_date>=? and start_date<=?) or (effective_date>=? and effective_date<=?) or (start_date<? and effective_date>?)) and start_date is not null and due_date is null and effective_date is not null)", @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to]
)
# Versions
events += @query.versions(:conditions => ["effective_date BETWEEN ? AND ?", @gantt.date_from, @gantt.date_to])
@gantt.events = events
end
basename = (@project ? "#{@project.identifier}-" : '') + 'gantt' basename = (@project ? "#{@project.identifier}-" : '') + 'gantt'
respond_to do |format| respond_to do |format|
format.html { render :action => "show", :layout => !request.xhr? } format.html { render :action => "show", :layout => !request.xhr? }
format.png { send_data(@gantt.to_image(@project), :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image') 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(@gantt, @project), :type => 'application/pdf', :filename => "#{basename}.pdf") } format.pdf { send_data(@gantt.to_pdf, :type => 'application/pdf', :filename => "#{basename}.pdf") }
end end
end end
def update
show
end
end end
+1 -1
View File
@@ -1,6 +1,6 @@
class IssueMovesController < ApplicationController class IssueMovesController < ApplicationController
default_search_scope :issues default_search_scope :issues
before_filter :find_issues before_filter :find_issues, :check_project_uniqueness
before_filter :authorize before_filter :authorize
def new def new
+7 -3
View File
@@ -21,6 +21,7 @@ class IssuesController < ApplicationController
before_filter :find_issue, :only => [:show, :edit, :update] before_filter :find_issue, :only => [:show, :edit, :update]
before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :move, :perform_move, :destroy] before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :move, :perform_move, :destroy]
before_filter :check_project_uniqueness, :only => [:move, :perform_move]
before_filter :find_project, :only => [:new, :create] before_filter :find_project, :only => [:new, :create]
before_filter :authorize, :except => [:index] before_filter :authorize, :except => [:index]
before_filter :find_optional_project, :only => [:index] before_filter :find_optional_project, :only => [:index]
@@ -47,6 +48,7 @@ class IssuesController < ApplicationController
include SortHelper include SortHelper
include IssuesHelper include IssuesHelper
helper :timelog helper :timelog
helper :gantt
include Redmine::Export::PDF include Redmine::Export::PDF
verify :method => [:post, :delete], verify :method => [:post, :delete],
@@ -192,8 +194,10 @@ class IssuesController < ApplicationController
# Bulk edit a set of issues # Bulk edit a set of issues
def bulk_edit def bulk_edit
@issues.sort! @issues.sort!
@available_statuses = Workflow.available_statuses(@project) @available_statuses = @projects.map{|p|Workflow.available_statuses(p)}.inject{|memo,w|memo & w}
@custom_fields = @project.all_issue_custom_fields @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 end
def bulk_update def bulk_update
@@ -240,7 +244,7 @@ class IssuesController < ApplicationController
end end
@issues.each(&:destroy) @issues.each(&:destroy)
respond_to do |format| 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.xml { head :ok }
format.json { head :ok } format.json { head :ok }
end end
+3 -7
View File
@@ -54,7 +54,7 @@ class MyController < ApplicationController
@pref = @user.pref @pref = @user.pref
if request.post? if request.post?
@user.attributes = params[:user] @user.attributes = params[:user]
@user.mail_notification = (params[:notification_option] == 'all') @user.mail_notification = params[:notification_option] || 'only_my_events'
@user.pref.attributes = params[:pref] @user.pref.attributes = params[:pref]
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1') @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
if @user.save if @user.save
@@ -66,12 +66,8 @@ class MyController < ApplicationController
return return
end end
end end
@notification_options = [[l(:label_user_mail_option_all), 'all'], @notification_options = @user.valid_notification_options
[l(:label_user_mail_option_none), 'none']] @notification_option = @user.mail_notification #? ? 'all' : (@user.notified_projects_ids.empty? ? 'none' : 'selected')
# Only users that belong to more than 1 project can select projects for which they are notified
# Note that @user.membership.size would fail since AR ignores :include association option when doing a count
@notification_options.insert 1, [l(:label_user_mail_option_selected), 'selected'] if @user.memberships.length > 1
@notification_option = @user.mail_notification? ? 'all' : (@user.notified_projects_ids.empty? ? 'none' : 'selected')
end end
# Manage user's password # Manage user's password
+16 -27
View File
@@ -18,10 +18,10 @@
class NewsController < ApplicationController class NewsController < ApplicationController
default_search_scope :news default_search_scope :news
model_object News model_object News
before_filter :find_model_object, :except => [:new, :index, :preview] before_filter :find_model_object, :except => [:new, :create, :index]
before_filter :find_project_from_association, :except => [:new, :index, :preview] before_filter :find_project_from_association, :except => [:new, :create, :index]
before_filter :find_project, :only => [:new, :preview] before_filter :find_project, :only => [:new, :create]
before_filter :authorize, :except => [:index, :preview] before_filter :authorize, :except => [:index]
before_filter :find_optional_project, :only => :index before_filter :find_optional_project, :only => :index
accept_key_auth :index accept_key_auth :index
@@ -46,49 +46,38 @@ class NewsController < ApplicationController
def new def new
@news = News.new(:project => @project, :author => User.current) @news = News.new(:project => @project, :author => User.current)
end
def create
@news = News.new(:project => @project, :author => User.current)
if request.post? if request.post?
@news.attributes = params[:news] @news.attributes = params[:news]
if @news.save if @news.save
flash[:notice] = l(:notice_successful_create) flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'news', :action => 'index', :project_id => @project redirect_to :controller => 'news', :action => 'index', :project_id => @project
else
render :action => 'new'
end end
end end
end end
def edit 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) flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'show', :id => @news 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 else
show render :action => 'edit'
render :action => 'show'
end end
end end
def destroy_comment
@news.comments.find(params[:comment_id]).destroy
redirect_to :action => 'show', :id => @news
end
def destroy def destroy
@news.destroy @news.destroy
redirect_to :action => 'index', :project_id => @project redirect_to :action => 'index', :project_id => @project
end end
def preview
@text = (params[:news] ? params[:news][:description] : nil)
render :partial => 'common/preview'
end
private private
def find_project def find_project
@project = Project.find(params[:project_id]) @project = Project.find(params[:project_id])
+5
View File
@@ -16,6 +16,11 @@ class PreviewsController < ApplicationController
render :layout => false render :layout => false
end end
def news
@text = (params[:news] ? params[:news][:description] : nil)
render :partial => 'common/preview'
end
private private
def find_project def find_project
@@ -1,9 +1,9 @@
class ProjectEnumerationsController < ApplicationController class ProjectEnumerationsController < ApplicationController
before_filter :find_project before_filter :find_project_by_project_id
before_filter :authorize before_filter :authorize
def save def update
if request.post? && params[:enumerations] if request.put? && params[:enumerations]
Project.transaction do Project.transaction do
params[:enumerations].each do |id, activity| params[:enumerations].each do |id, activity|
@project.update_or_create_time_entry_activity(id, activity) @project.update_or_create_time_entry_activity(id, activity)
+1 -1
View File
@@ -26,7 +26,7 @@ class SettingsController < ApplicationController
end end
def edit 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) if request.post? && params[:settings] && params[:settings].is_a?(Hash)
settings = (params[:settings] || {}).dup.symbolize_keys settings = (params[:settings] || {}).dup.symbolize_keys
settings.each do |name, value| settings.each do |name, value|
@@ -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 class TimelogController < ApplicationController
menu_item :issues menu_item :issues
before_filter :find_project, :authorize, :only => [:edit, :destroy] before_filter :find_project, :authorize, :only => [:new, :create, :edit, :update, :destroy]
before_filter :find_optional_project, :only => [:report, :details] before_filter :find_optional_project, :only => [:index]
before_filter :load_available_criterias, :only => [:report]
verify :method => :post, :only => :destroy, :redirect_to => { :action => :details }
helper :sort helper :sort
include SortHelper include SortHelper
helper :issues helper :issues
@@ -30,83 +27,7 @@ class TimelogController < ApplicationController
helper :custom_fields helper :custom_fields
include CustomFieldsHelper include CustomFieldsHelper
def report def index
@criterias = params[:criterias] || []
@criterias = @criterias.select{|criteria| @available_criterias.has_key? criteria}
@criterias.uniq!
@criterias = @criterias[0,3]
@columns = (params[:columns] && %w(year month week day).include?(params[:columns])) ? params[:columns] : 'month'
retrieve_date_range
unless @criterias.empty?
sql_select = @criterias.collect{|criteria| @available_criterias[criteria][:sql] + " AS " + criteria}.join(', ')
sql_group_by = @criterias.collect{|criteria| @available_criterias[criteria][:sql]}.join(', ')
sql_condition = ''
if @project.nil?
sql_condition = Project.allowed_to_condition(User.current, :view_time_entries)
elsif @issue.nil?
sql_condition = @project.project_condition(Setting.display_subprojects_issues?)
else
sql_condition = "#{Issue.table_name}.root_id = #{@issue.root_id} AND #{Issue.table_name}.lft >= #{@issue.lft} AND #{Issue.table_name}.rgt <= #{@issue.rgt}"
end
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours"
sql << " FROM #{TimeEntry.table_name}"
sql << time_report_joins
sql << " WHERE"
sql << " (%s) AND" % sql_condition
sql << " (spent_on BETWEEN '%s' AND '%s')" % [ActiveRecord::Base.connection.quoted_date(@from), ActiveRecord::Base.connection.quoted_date(@to)]
sql << " GROUP BY #{sql_group_by}, tyear, tmonth, tweek, spent_on"
@hours = ActiveRecord::Base.connection.select_all(sql)
@hours.each do |row|
case @columns
when 'year'
row['year'] = row['tyear']
when 'month'
row['month'] = "#{row['tyear']}-#{row['tmonth']}"
when 'week'
row['week'] = "#{row['tyear']}-#{row['tweek']}"
when 'day'
row['day'] = "#{row['spent_on']}"
end
end
@total_hours = @hours.inject(0) {|s,k| s = s + k['hours'].to_f}
@periods = []
# Date#at_beginning_of_ not supported in Rails 1.2.x
date_from = @from.to_time
# 100 columns max
while date_from <= @to.to_time && @periods.length < 100
case @columns
when 'year'
@periods << "#{date_from.year}"
date_from = (date_from + 1.year).at_beginning_of_year
when 'month'
@periods << "#{date_from.year}-#{date_from.month}"
date_from = (date_from + 1.month).at_beginning_of_month
when 'week'
@periods << "#{date_from.year}-#{date_from.to_date.cweek}"
date_from = (date_from + 7.day).at_beginning_of_week
when 'day'
@periods << "#{date_from.to_date}"
date_from = date_from + 1.day
end
end
end
respond_to do |format|
format.html { render :layout => !request.xhr? }
format.csv { send_data(report_to_csv(@criterias, @periods, @hours), :type => 'text/csv; header=present', :filename => 'timelog.csv') }
end
end
def details
sort_init 'spent_on', 'desc' sort_init 'spent_on', 'desc'
sort_update 'spent_on' => 'spent_on', sort_update 'spent_on' => 'spent_on',
'user' => 'user_id', 'user' => 'user_id',
@@ -162,21 +83,53 @@ class TimelogController < ApplicationController
end end
end end
end end
def edit def new
(render_403; return) if @time_entry && !@time_entry.editable_by?(User.current) @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
@time_entry.attributes = params[:time_entry]
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
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 ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
@time_entry.attributes = params[:time_entry] @time_entry.attributes = params[:time_entry]
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry }) call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
if request.post? and @time_entry.save if @time_entry.save
flash[:notice] = l(:notice_successful_update) flash[:notice] = l(:notice_successful_update)
redirect_back_or_default :action => 'details', :project_id => @time_entry.project redirect_back_or_default :action => 'index', :project_id => @time_entry.project
return else
render :action => 'edit'
end end
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 def destroy
(render_404; return) unless @time_entry (render_404; return) unless @time_entry
(render_403; return) unless @time_entry.editable_by?(User.current) (render_403; return) unless @time_entry.editable_by?(User.current)
@@ -187,7 +140,7 @@ class TimelogController < ApplicationController
end end
redirect_to :back redirect_to :back
rescue ::ActionController::RedirectBackError rescue ::ActionController::RedirectBackError
redirect_to :action => 'details', :project_id => @time_entry.project redirect_to :action => 'index', :project_id => @time_entry.project
end end
private private
@@ -264,61 +217,4 @@ private
@to ||= (TimeEntry.latest_date_for_project(@project) || Date.today) @to ||= (TimeEntry.latest_date_for_project(@project) || Date.today)
end end
def load_available_criterias
@available_criterias = { 'project' => {:sql => "#{TimeEntry.table_name}.project_id",
:klass => Project,
:label => :label_project},
'version' => {:sql => "#{Issue.table_name}.fixed_version_id",
:klass => Version,
:label => :label_version},
'category' => {:sql => "#{Issue.table_name}.category_id",
:klass => IssueCategory,
:label => :field_category},
'member' => {:sql => "#{TimeEntry.table_name}.user_id",
:klass => User,
:label => :label_member},
'tracker' => {:sql => "#{Issue.table_name}.tracker_id",
:klass => Tracker,
:label => :label_tracker},
'activity' => {:sql => "#{TimeEntry.table_name}.activity_id",
:klass => TimeEntryActivity,
:label => :label_activity},
'issue' => {:sql => "#{TimeEntry.table_name}.issue_id",
:klass => Issue,
:label => :label_issue}
}
# Add list and boolean custom fields as available criterias
custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields)
custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id)",
:format => cf.field_format,
:label => cf.name}
end if @project
# Add list and boolean time entry custom fields
TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id)",
:format => cf.field_format,
:label => cf.name}
end
# Add list and boolean time entry activity custom fields
TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id)",
:format => cf.field_format,
:label => cf.name}
end
call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project })
@available_criterias
end
def time_report_joins
sql = ''
sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id"
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
call_hook(:controller_timelog_time_report_joins, {:sql => sql} )
sql
end
end end
+80 -37
View File
@@ -71,53 +71,96 @@ class UsersController < ApplicationController
render_404 render_404
end end
def add def new
if request.get? @notification_options = User::MAIL_NOTIFICATION_OPTIONS
@user = User.new(:language => Setting.default_language) @notification_option = Setting.default_notification_option
else
@user = User.new(params[:user]) @user = User.new(:language => Setting.default_language)
@user.admin = params[:user][:admin] || false
@user.login = params[:user][:login]
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless @user.auth_source_id
if @user.save
Mailer.deliver_account_information(@user, params[:password]) if params[:send_information]
flash[:notice] = l(:notice_successful_create)
redirect_to(params[:continue] ? {:controller => 'users', :action => 'add'} :
{:controller => 'users', :action => 'edit', :id => @user})
return
end
end
@auth_sources = AuthSource.find(:all) @auth_sources = AuthSource.find(:all)
end 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 def edit
@user = User.find(params[:id]) @user = User.find(params[:id])
if request.post? @notification_options = @user.valid_notification_options
@user.admin = params[:user][:admin] if params[:user][:admin] @notification_option = @user.mail_notification
@user.login = params[:user][:login] if params[:user][:login]
if params[:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?)
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
end
@user.group_ids = params[:user][:group_ids] if params[:user][:group_ids]
@user.attributes = params[:user]
# Was the account actived ? (do it before User#save clears the change)
was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE])
if @user.save
if was_activated
Mailer.deliver_account_activated(@user)
elsif @user.active? && params[:send_information] && !params[:password].blank? && @user.auth_source_id.nil?
Mailer.deliver_account_information(@user, params[:password])
end
flash[:notice] = l(:notice_successful_update)
redirect_to :back
end
end
@auth_sources = AuthSource.find(:all) @auth_sources = AuthSource.find(:all)
@membership ||= Member.new @membership ||= Member.new
end
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
def update
@user = User.find(params[:id])
@notification_options = @user.valid_notification_options
@notification_option = @user.mail_notification
@user.admin = params[:user][:admin] if params[:user][:admin]
@user.login = params[:user][:login] if params[:user][:login]
if params[:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?)
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
end
@user.group_ids = params[:user][:group_ids] if params[:user][:group_ids]
@user.attributes = params[:user]
# Was the account actived ? (do it before User#save clears the change)
was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE])
# TODO: Similar to My#account
@user.mail_notification = params[:notification_option] || 'only_my_events'
@user.pref.attributes = params[:pref]
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
if @user.save
@user.pref.save
@user.notified_project_ids = (params[:notification_option] == 'selected' ? params[:notified_project_ids] : [])
if was_activated
Mailer.deliver_account_activated(@user)
elsif @user.active? && params[:send_information] && !params[:password].blank? && @user.auth_source_id.nil?
Mailer.deliver_account_information(@user, params[:password])
end
flash[:notice] = l(:notice_successful_update)
redirect_to :back
else
@auth_sources = AuthSource.find(:all)
@membership ||= Member.new
render :action => :edit
end
rescue ::ActionController::RedirectBackError rescue ::ActionController::RedirectBackError
redirect_to :controller => 'users', :action => 'edit', :id => @user redirect_to :controller => 'users', :action => 'edit', :id => @user
end end
def edit_membership def edit_membership
@user = User.find(params[:id]) @user = User.find(params[:id])
@membership = Member.edit_membership(params[:membership_id], params[:membership], @user) @membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
+2 -2
View File
@@ -103,7 +103,7 @@ class VersionsController < ApplicationController
end end
def update def update
if request.post? && params[:version] if request.put? && params[:version]
attributes = params[:version].dup attributes = params[:version].dup
attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing']) attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
if @version.update_attributes(attributes) if @version.update_attributes(attributes)
@@ -114,7 +114,7 @@ class VersionsController < ApplicationController
end end
def close_completed def close_completed
if request.post? if request.put?
@project.close_completed_versions @project.close_completed_versions
end end
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
+71 -58
View File
@@ -22,14 +22,14 @@ class WikiController < ApplicationController
before_filter :find_wiki, :authorize before_filter :find_wiki, :authorize
before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy] before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy]
verify :method => :post, :only => [:destroy, :protect], :redirect_to => { :action => :index } verify :method => :post, :only => [:destroy, :protect], :redirect_to => { :action => :show }
helper :attachments helper :attachments
include AttachmentsHelper include AttachmentsHelper
helper :watchers helper :watchers
# display a page (in editing mode if it doesn't exist) # display a page (in editing mode if it doesn't exist)
def index def show
page_title = params[:page] page_title = params[:page]
@page = @wiki.find_or_new_page(page_title) @page = @wiki.find_or_new_page(page_title)
if @page.new_record? if @page.new_record?
@@ -71,34 +71,48 @@ class WikiController < ApplicationController
@content.text = initial_page_content(@page) if @content.text.blank? @content.text = initial_page_content(@page) if @content.text.blank?
# don't keep previous comment # don't keep previous comment
@content.comments = nil @content.comments = nil
if request.get?
# To prevent StaleObjectError exception when reverting to a previous version # To prevent StaleObjectError exception when reverting to a previous version
@content.version = @page.content.version @content.version = @page.content.version
else
if !@page.new_record? && @content.text == params[:content][:text]
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
# don't save if text wasn't changed
redirect_to :action => 'index', :id => @project, :page => @page.title
return
end
#@content.text = params[:content][:text]
#@content.comments = params[:content][:comments]
@content.attributes = params[:content]
@content.author = User.current
# if page is new @page.save will also save content, but not if page isn't a new record
if (@page.new_record? ? @page.save : @content.save)
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
call_hook(:controller_wiki_edit_after_save, { :params => params, :page => @page})
redirect_to :action => 'index', :id => @project, :page => @page.title
end
end
rescue ActiveRecord::StaleObjectError rescue ActiveRecord::StaleObjectError
# Optimistic locking exception # Optimistic locking exception
flash[:error] = l(:notice_locking_conflict) flash[:error] = l(:notice_locking_conflict)
end end
verify :method => :post, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
# Creates a new page or updates an existing one
def update
@page = @wiki.find_or_new_page(params[:page])
return render_403 unless editable?
@page.content = WikiContent.new(:page => @page) if @page.new_record?
@content = @page.content_for_version(params[:version])
@content.text = initial_page_content(@page) if @content.text.blank?
# don't keep previous comment
@content.comments = nil
if !@page.new_record? && params[:content].present? && @content.text == params[:content][:text]
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
# don't save if text wasn't changed
redirect_to :action => 'show', :project_id => @project, :page => @page.title
return
end
@content.attributes = params[:content]
@content.author = User.current
# if page is new @page.save will also save content, but not if page isn't a new record
if (@page.new_record? ? @page.save : @content.save)
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
call_hook(:controller_wiki_edit_after_save, { :params => params, :page => @page})
redirect_to :action => 'show', :project_id => @project, :page => @page.title
end
rescue ActiveRecord::StaleObjectError
# Optimistic locking exception
flash[:error] = l(:notice_locking_conflict)
end
# rename a page # rename a page
def rename def rename
return render_403 unless editable? return render_403 unless editable?
@@ -107,13 +121,13 @@ class WikiController < ApplicationController
@original_title = @page.pretty_title @original_title = @page.pretty_title
if request.post? && @page.update_attributes(params[:wiki_page]) if request.post? && @page.update_attributes(params[:wiki_page])
flash[:notice] = l(:notice_successful_update) flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'index', :id => @project, :page => @page.title redirect_to :action => 'show', :project_id => @project, :page => @page.title
end end
end end
def protect def protect
@page.update_attribute :protected, params[:protected] @page.update_attribute :protected, params[:protected]
redirect_to :action => 'index', :id => @project, :page => @page.title redirect_to :action => 'show', :project_id => @project, :page => @page.title
end end
# show page history # show page history
@@ -166,37 +180,26 @@ class WikiController < ApplicationController
end end
end end
@page.destroy @page.destroy
redirect_to :action => 'special', :id => @project, :page => 'Page_index' redirect_to :action => 'page_index', :project_id => @project
end end
# display special pages # Export wiki to a single html file
def special def export
page_title = params[:page].downcase if User.current.allowed_to?(:export_wiki_pages, @project)
case page_title @pages = @wiki.pages.find :all, :order => 'title'
# show pages index, sorted by title export = render_to_string :action => 'export_multiple', :layout => false
when 'page_index', 'date_index' send_data(export, :type => 'text/html', :filename => "wiki.html")
# eager load information about last updates, without loading text
@pages = @wiki.pages.find :all, :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on",
:joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id",
:order => 'title'
@pages_by_date = @pages.group_by {|p| p.updated_on.to_date}
@pages_by_parent_id = @pages.group_by(&:parent_id)
# export wiki to a single html file
when 'export'
if User.current.allowed_to?(:export_wiki_pages, @project)
@pages = @wiki.pages.find :all, :order => 'title'
export = render_to_string :action => 'export_multiple', :layout => false
send_data(export, :type => 'text/html', :filename => "wiki.html")
else
redirect_to :action => 'index', :id => @project, :page => nil
end
return
else else
# requested special page doesn't exist, redirect to default page redirect_to :action => 'show', :project_id => @project, :page => nil
redirect_to :action => 'index', :id => @project, :page => nil
return
end 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 end
def preview def preview
@@ -215,13 +218,13 @@ class WikiController < ApplicationController
return render_403 unless editable? return render_403 unless editable?
attachments = Attachment.attach_files(@page, params[:attachments]) attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page) render_attachment_warning_if_needed(@page)
redirect_to :action => 'index', :page => @page.title redirect_to :action => 'show', :page => @page.title
end end
private private
def find_wiki def find_wiki
@project = Project.find(params[:id]) @project = Project.find(params[:project_id])
@wiki = @project.wiki @wiki = @project.wiki
render_404 unless @wiki render_404 unless @wiki
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
@@ -245,4 +248,14 @@ private
extend helper unless self.instance_of?(helper) extend helper unless self.instance_of?(helper)
helper.instance_method(:initial_page_content).bind(self).call(page) helper.instance_method(:initial_page_content).bind(self).call(page)
end end
# eager load information about last updates, without loading text
def load_pages_grouped_by_date_without_content
@pages = @wiki.pages.find :all, :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on",
:joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id",
:order => 'title'
@pages_by_date = @pages.group_by {|p| p.updated_on.to_date}
@pages_by_parent_id = @pages.group_by(&:parent_id)
end
end end
+6 -18
View File
@@ -34,25 +34,11 @@ module ApplicationHelper
# Display a link if user is authorized # Display a link if user is authorized
# #
# @param [String] name Anchor text (passed to link_to) # @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). # @param [Hash] options Hash params. This will checked by authorize_for to see if the user is authorized
# 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] html_options Options passed to link_to
# @param [optional, Hash] parameters_for_method_reference Extra parameters for link_to # @param [optional, Hash] parameters_for_method_reference Extra parameters for link_to
def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference) def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
if options.is_a?(String) link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
begin
route = ActionController::Routing::Routes.recognize_path(options.gsub(/\?.*/,''), :method => options[:method] || :get)
link_controller = route[:controller]
link_action = route[:action]
rescue ActionController::RoutingError # Parse failed, not a route
link_controller, link_action = nil, nil
end
else
link_controller = options[:controller] || params[:controller]
link_action = options[:action]
end
link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(link_controller, link_action)
end end
# Display a link to remote if user is authorized # Display a link to remote if user is authorized
@@ -191,7 +177,7 @@ module ApplicationHelper
content << "<ul class=\"pages-hierarchy\">\n" content << "<ul class=\"pages-hierarchy\">\n"
pages[node].each do |page| pages[node].each do |page|
content << "<li>" content << "<li>"
content << link_to(h(page.pretty_title), {:controller => 'wiki', :action => '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)) :title => (page.respond_to?(:updated_on) ? l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on)) : nil))
content << "\n" + render_page_hierarchy(pages, page.id) if pages[page.id] content << "\n" + render_page_hierarchy(pages, page.id) if pages[page.id]
content << "</li>\n" content << "</li>\n"
@@ -560,7 +546,7 @@ module ApplicationHelper
when :local; "#{title}.html" when :local; "#{title}.html"
when :anchor; "##{title}" # used for single-file wiki export when :anchor; "##{title}" # used for single-file wiki export
else else
url_for(:only_path => only_path, :controller => 'wiki', :action => '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 end
link_to((title || page), url, :class => ('wiki-page' + (wiki_page ? '' : ' new'))) link_to((title || page), url, :class => ('wiki-page' + (wiki_page ? '' : ' new')))
else else
@@ -832,6 +818,8 @@ module ApplicationHelper
email = $1 email = $1
end end
return gravatar(email.to_s.downcase, options) unless email.blank? rescue nil return gravatar(email.to_s.downcase, options) unless email.blank? rescue nil
else
''
end end
end end
+16 -9
View File
@@ -1,5 +1,5 @@
module CalendarsHelper module CalendarsHelper
def link_to_previous_month(year, month) def link_to_previous_month(year, month, options={})
target_year, target_month = if month == 1 target_year, target_month = if month == 1
[year - 1, 12] [year - 1, 12]
else else
@@ -11,13 +11,11 @@ module CalendarsHelper
else else
"#{month_name(target_month)}" "#{month_name(target_month)}"
end end
link_to_remote ('&#171; ' + name), link_to_month(('&#171; ' + name), target_year, target_month, options)
{:update => "content", :url => { :year => target_year, :month => target_month }},
{:href => url_for(:action => 'show', :year => target_year, :month => target_month)}
end end
def link_to_next_month(year, month) def link_to_next_month(year, month, options={})
target_year, target_month = if month == 12 target_year, target_month = if month == 12
[year + 1, 1] [year + 1, 1]
else else
@@ -30,9 +28,18 @@ module CalendarsHelper
"#{month_name(target_month)}" "#{month_name(target_month)}"
end end
link_to_remote (name + ' &#187;'), link_to_month((name + ' &#187;'), target_year, target_month, options)
{:update => "content", :url => { :year => target_year, :month => target_month }}, end
{:href => url_for(:action => 'show', :year => target_year, :month =>target_month)}
def link_to_month(link_name, year, month, options={})
project_id = options[:project].present? ? options[:project].to_param : nil
link_target = calendar_path(:year => year, :month => month, :project_id => project_id)
link_to_remote(link_name,
{:update => "content", :url => link_target, :method => :put},
{:href => link_target})
end end
end end
+24
View File
@@ -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_due_date ||= l(:field_due_date)
@cached_label_assigned_to ||= l(:field_assigned_to) @cached_label_assigned_to ||= l(:field_assigned_to)
@cached_label_priority ||= l(:field_priority) @cached_label_priority ||= l(:field_priority)
@cached_label_project ||= l(:field_project)
link_to_issue(issue) + "<br /><br />" + link_to_issue(issue) + "<br /><br />" +
"<strong>#{@cached_label_project}</strong>: #{link_to_project(issue.project)}<br />" +
"<strong>#{@cached_label_status}</strong>: #{issue.status.name}<br />" + "<strong>#{@cached_label_status}</strong>: #{issue.status.name}<br />" +
"<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" + "<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" +
"<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" + "<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" +
@@ -252,7 +254,7 @@ module IssuesHelper
when :in when :in
if gantt.zoom < 4 if gantt.zoom < 4
link_to_remote(l(:text_zoom_in) + image_tag('zoom_in.png', img_attributes.merge(:alt => l(:text_zoom_in))), link_to_remote(l(:text_zoom_in) + image_tag('zoom_in.png', img_attributes.merge(:alt => l(:text_zoom_in))),
{:url => gantt.params.merge(:zoom => (gantt.zoom+1)), :update => 'content'}, {:url => gantt.params.merge(:zoom => (gantt.zoom+1)), :method => :get, :update => 'content'},
{:href => url_for(gantt.params.merge(:zoom => (gantt.zoom+1)))}) {:href => url_for(gantt.params.merge(:zoom => (gantt.zoom+1)))})
else else
l(:text_zoom_in) + l(:text_zoom_in) +
@@ -262,7 +264,7 @@ module IssuesHelper
when :out when :out
if gantt.zoom > 1 if gantt.zoom > 1
link_to_remote(l(:text_zoom_out) + image_tag('zoom_out.png', img_attributes.merge(:alt => l(:text_zoom_out))), link_to_remote(l(:text_zoom_out) + image_tag('zoom_out.png', img_attributes.merge(:alt => l(:text_zoom_out))),
{:url => gantt.params.merge(:zoom => (gantt.zoom-1)), :update => 'content'}, {:url => gantt.params.merge(:zoom => (gantt.zoom-1)), :method => :get, :update => 'content'},
{:href => url_for(gantt.params.merge(:zoom => (gantt.zoom-1)))}) {:href => url_for(gantt.params.merge(:zoom => (gantt.zoom-1)))})
else else
l(:text_zoom_out) + l(:text_zoom_out) +
+10
View File
@@ -71,4 +71,14 @@ module SettingsHelper
label = options.delete(:label) label = options.delete(:label)
label != false ? content_tag("label", l(label || "setting_#{setting}")) : '' label != false ? content_tag("label", l(label || "setting_#{setting}")) : ''
end end
# Renders a notification field for a Redmine::Notifiable option
def notification_field(notifiable)
return content_tag(:label,
check_box_tag('settings[notified_events][]',
notifiable.name,
Setting.notified_events.include?(notifiable.name)) +
l_or_humanize(notifiable.name, :prefix => 'label_'),
:class => notifiable.parent.present? ? "parent" : '')
end
end end
+4 -4
View File
@@ -34,14 +34,14 @@ module UsersHelper
end end
def change_status_link(user) def change_status_link(user)
url = {:controller => 'users', :action => '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? 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? 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 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
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 :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 :with_limit, lambda { |limit| { :limit => limit} }
named_scope :on_active_project, :include => [:status, :project, :tracker], named_scope :on_active_project, :include => [:status, :project, :tracker],
:conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"] :conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"]
named_scope :for_gantt, lambda {
{
:include => [:tracker, :status, :assigned_to, :priority, :project, :fixed_version],
:order => "#{Issue.table_name}.due_date ASC, #{Issue.table_name}.start_date ASC, #{Issue.table_name}.id ASC"
}
}
named_scope :without_version, lambda {
{
:conditions => { :fixed_version_id => nil}
}
}
named_scope :with_query, lambda {|query|
{
:conditions => Query.merge_conditions(query.statement)
}
}
before_create :default_assign before_create :default_assign
before_save :reschedule_following_issues, :close_duplicates, :update_done_ratio_from_issue_status before_save :close_duplicates, :update_done_ratio_from_issue_status
after_save :update_nested_set_attributes, :update_parent_attributes, :create_journal after_save :reschedule_following_issues, :update_nested_set_attributes, :update_parent_attributes, :create_journal
after_destroy :destroy_children after_destroy :destroy_children
after_destroy :update_parent_attributes after_destroy :update_parent_attributes
@@ -358,6 +376,13 @@ class Issue < ActiveRecord::Base
!due_date.nil? && (due_date < Date.today) && !status.is_closed? !due_date.nil? && (due_date < Date.today) && !status.is_closed?
end end
# Is the amount of work done less than it should for the due date
def behind_schedule?
return false if start_date.nil? || due_date.nil?
done_date = start_date + ((due_date - start_date+1)* done_ratio/100).floor
return done_date <= Date.today
end
# Does this issue have children? # Does this issue have children?
def children? def children?
!leaf? !leaf?
@@ -365,7 +390,9 @@ class Issue < ActiveRecord::Base
# Users the issue can be assigned to # Users the issue can be assigned to
def assignable_users def assignable_users
project.assignable_users users = project.assignable_users
users << author if author
users.uniq.sort
end end
# Versions that the issue can be assigned to # 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 # Returns the mail adresses of users that should be notified
def recipients def recipients
notified = project.notified_users notified = project.notified_users
# Author and assignee are always notified unless they have been locked # Author and assignee are always notified unless they have been
notified << author if author && author.active? # locked or don't want to be notified
notified << assigned_to if assigned_to && assigned_to.active? 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! notified.uniq!
# Remove users that can not view the issue # Remove users that can not view the issue
notified.reject! {|user| !visible?(user)} notified.reject! {|user| !visible?(user)}
+6 -1
View File
@@ -17,6 +17,11 @@
class JournalObserver < ActiveRecord::Observer class JournalObserver < ActiveRecord::Observer
def after_create(journal) 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
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 # Returns the mail adresses of users that should be always notified on project events
def recipients def recipients
members.select {|m| m.mail_notification? || m.user.mail_notification?}.collect {|m| m.user.mail} notified_users.collect {|user| user.mail}
end end
# Returns the users that should be notified on project events # Returns the users that should be notified on project events
def notified_users def notified_users
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 end
# Returns an array of all custom fields enabled for project issues # Returns an array of all custom fields enabled for project issues
@@ -421,6 +422,50 @@ class Project < ActiveRecord::Base
s s
end end
# The earliest start date of a project, based on it's issues and versions
def start_date
if module_enabled?(:issue_tracking)
[
issues.minimum('start_date'),
shared_versions.collect(&:effective_date),
shared_versions.collect {|v| v.fixed_issues.minimum('start_date')}
].flatten.compact.min
end
end
# The latest due date of an issue or version
def due_date
if module_enabled?(:issue_tracking)
[
issues.maximum('due_date'),
shared_versions.collect(&:effective_date),
shared_versions.collect {|v| v.fixed_issues.maximum('due_date')}
].flatten.compact.max
end
end
def overdue?
active? && !due_date.nil? && (due_date < Date.today)
end
# Returns the percent completed for this project, based on the
# progress on it's versions.
def completed_percent(options={:include_subprojects => false})
if options.delete(:include_subprojects)
total = self_and_descendants.collect(&:completed_percent).sum
total / self_and_descendants.count
else
if versions.count > 0
total = versions.collect(&:completed_pourcent).sum
total / versions.count
else
100
end
end
end
# Return true if this project is allowed to do the specified action. # Return true if this project is allowed to do the specified action.
# action can be: # action can be:
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
+47
View File
@@ -195,6 +195,12 @@ class Query < ActiveRecord::Base
end end
@available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty? @available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty?
@available_filters["author_id"] = { :type => :list, :order => 5, :values => user_values } unless user_values.empty? @available_filters["author_id"] = { :type => :list, :order => 5, :values => user_values } unless user_values.empty?
group_values = Group.all.collect {|g| [g.name, g.id.to_s] }
@available_filters["member_of_group"] = { :type => :list_optional, :order => 6, :values => group_values } unless group_values.empty?
role_values = Role.givable.collect {|r| [r.name, r.id.to_s] }
@available_filters["assigned_to_role"] = { :type => :list_optional, :order => 7, :values => role_values } unless role_values.empty?
if User.current.logged? if User.current.logged?
@available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] } @available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] }
@@ -432,6 +438,47 @@ class Query < ActiveRecord::Base
db_field = 'user_id' db_field = 'user_id'
sql << "#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='Issue' AND " sql << "#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='Issue' AND "
sql << sql_for_field(field, '=', v, db_table, db_field) + ')' sql << sql_for_field(field, '=', v, db_table, db_field) + ')'
elsif field == "member_of_group" # named field
if operator == '*' # Any group
groups = Group.all
operator = '=' # Override the operator since we want to find by assigned_to
elsif operator == "!*"
groups = Group.all
operator = '!' # Override the operator since we want to find by assigned_to
else
groups = Group.find_all_by_id(v)
end
groups ||= []
members_of_groups = groups.inject([]) {|user_ids, group|
if group && group.user_ids.present?
user_ids << group.user_ids
end
user_ids.flatten.uniq.compact
}.sort.collect(&:to_s)
sql << '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')'
elsif field == "assigned_to_role" # named field
if operator == "*" # Any Role
roles = Role.givable
operator = '=' # Override the operator since we want to find by assigned_to
elsif operator == "!*" # No role
roles = Role.givable
operator = '!' # Override the operator since we want to find by assigned_to
else
roles = Role.givable.find_all_by_id(v)
end
roles ||= []
members_of_roles = roles.inject([]) {|user_ids, role|
if role && role.members
user_ids << role.members.collect(&:user_id)
end
user_ids.flatten.uniq.compact
}.sort.collect(&:to_s)
sql << '(' + sql_for_field("assigned_to_id", operator, members_of_roles, Issue.table_name, "assigned_to_id", false) + ')'
else else
# regular field # regular field
db_table = Issue.table_name db_table = Issue.table_name
+76 -9
View File
@@ -33,6 +33,15 @@ class User < Principal
:username => '#{login}' :username => '#{login}'
} }
MAIL_NOTIFICATION_OPTIONS = [
[:all, :label_user_mail_option_all],
[:selected, :label_user_mail_option_selected],
[:none, :label_user_mail_option_none],
[:only_my_events, :label_user_mail_option_only_my_events],
[:only_assigned, :label_user_mail_option_only_assigned],
[:only_owner, :label_user_mail_option_only_owner]
]
has_and_belongs_to_many :groups, :after_add => Proc.new {|user, group| group.user_added(user)}, has_and_belongs_to_many :groups, :after_add => Proc.new {|user, group| group.user_added(user)},
:after_remove => Proc.new {|user, group| group.user_removed(user)} :after_remove => Proc.new {|user, group| group.user_removed(user)}
has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify
@@ -65,7 +74,7 @@ class User < Principal
validates_confirmation_of :password, :allow_nil => true validates_confirmation_of :password, :allow_nil => true
def before_create def before_create
self.mail_notification = false self.mail_notification = Setting.default_notification_option if self.mail_notification.blank?
true true
end end
@@ -250,6 +259,17 @@ class User < Principal
notified_projects_ids notified_projects_ids
end end
# Only users that belong to more than 1 project can select projects for which they are notified
def valid_notification_options
# Note that @user.membership.size would fail since AR ignores
# :include association option when doing a count
if memberships.length < 1
MAIL_NOTIFICATION_OPTIONS.delete_if {|option| option.first == :selected}
else
MAIL_NOTIFICATION_OPTIONS
end
end
# Find a user account by matching the exact login and then a case-insensitive # Find a user account by matching the exact login and then a case-insensitive
# version. Exact matches will be given priority. # version. Exact matches will be given priority.
def self.find_by_login(login) def self.find_by_login(login)
@@ -324,23 +344,35 @@ class User < Principal
!roles_for_project(project).detect {|role| role.member?}.nil? !roles_for_project(project).detect {|role| role.member?}.nil?
end end
# Return true if the user is allowed to do the specified action on project # Return true if the user is allowed to do the specified action on a specific context
# action can be: # Action can be:
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
# * a permission Symbol (eg. :edit_project) # * a permission Symbol (eg. :edit_project)
def allowed_to?(action, project, options={}) # Context can be:
if project # * 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 # No action allowed on archived projects
return false unless project.active? return false unless context.active?
# No action allowed on disabled modules # 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 # Admin users are authorized for anything else
return true if admin? return true if admin?
roles = roles_for_project(project) roles = roles_for_project(context)
return false unless roles 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] elsif options[:global]
# Admin users are always authorized # Admin users are always authorized
return true if admin? return true if admin?
@@ -359,6 +391,41 @@ class User < Principal
allowed_to?(action, nil, options.reverse_merge(:global => true)) allowed_to?(action, nil, options.reverse_merge(:global => true))
end end
# Utility method to help check if a user should be notified about an
# event.
#
# TODO: only supports Issue events currently
def notify_about?(object)
case mail_notification.to_sym
when :all
true
when :selected
# Handled by the Project
when :none
false
when :only_my_events
if object.is_a?(Issue) && (object.author == self || object.assigned_to == self)
true
else
false
end
when :only_assigned
if object.is_a?(Issue) && object.assigned_to == self
true
else
false
end
when :only_owner
if object.is_a?(Issue) && object.author == self
true
else
false
end
else
false
end
end
def self.current=(user) def self.current=(user)
@current_user = user @current_user = user
end end
+16
View File
@@ -73,6 +73,18 @@ class Version < ActiveRecord::Base
def completed? def completed?
effective_date && (effective_date <= Date.today) && (open_issues_count == 0) effective_date && (effective_date <= Date.today) && (open_issues_count == 0)
end end
def behind_schedule?
if completed_pourcent == 100
return false
elsif due_date && fixed_issues.present? && fixed_issues.minimum('start_date') # TODO: should use #start_date but that method is wrong...
start_date = fixed_issues.minimum('start_date')
done_date = start_date + ((due_date - start_date+1)* completed_pourcent/100).floor
return done_date <= Date.today
else
false # No issues so it's not late
end
end
# Returns the completion percentage of this version based on the amount of open/closed issues # Returns the completion percentage of this version based on the amount of open/closed issues
# and the time spent on the open issues. # and the time spent on the open issues.
@@ -123,6 +135,10 @@ class Version < ActiveRecord::Base
end end
def to_s; name end def to_s; name end
def to_s_with_project
"#{project} - #{name}"
end
# Versions are sorted by effective_date and "Project Name - Version name" # Versions are sorted by effective_date and "Project Name - Version name"
# Those with no effective_date are at the end, sorted by "Project Name - Version name" # Those with no effective_date are at the end, sorted by "Project Name - Version name"
+2 -4
View File
@@ -19,7 +19,6 @@
<table class="list"> <table class="list">
<thead><tr> <thead><tr>
<th><%=l(:label_project)%></th> <th><%=l(:label_project)%></th>
<th><%=l(:field_description)%></th>
<th><%=l(:field_is_public)%></th> <th><%=l(:field_is_public)%></th>
<th><%=l(:field_created_on)%></th> <th><%=l(:field_created_on)%></th>
<th></th> <th></th>
@@ -27,15 +26,14 @@
<tbody> <tbody>
<% project_tree(@projects) do |project, level| %> <% project_tree(@projects) do |project, level| %>
<tr class="<%= cycle("odd", "even") %> <%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>"> <tr class="<%= cycle("odd", "even") %> <%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="name"><%= link_to_project(project, :action => 'settings') %></td> <td class="name"><span><%= link_to_project(project, {:action => 'settings'}, :title => project.short_description) %></span></td>
<td><%= textilizable project.short_description, :project => project %></td>
<td align="center"><%= checked_image project.is_public? %></td> <td align="center"><%= checked_image project.is_public? %></td>
<td align="center"><%= format_date(project.created_on) %></td> <td align="center"><%= format_date(project.created_on) %></td>
<td class="buttons"> <td class="buttons">
<%= link_to(l(:button_archive), { :controller => 'projects', :action => 'archive', :id => project, :status => params[:status] }, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-lock') if project.active? %> <%= link_to(l(:button_archive), { :controller => 'projects', :action => 'archive', :id => project, :status => params[:status] }, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-lock') if project.active? %>
<%= link_to(l(:button_unarchive), { :controller => 'projects', :action => 'unarchive', :id => project, :status => params[:status] }, :method => :post, :class => 'icon icon-unlock') if !project.active? && (project.parent.nil? || project.parent.active?) %> <%= link_to(l(:button_unarchive), { :controller => 'projects', :action => 'unarchive', :id => project, :status => params[:status] }, :method => :post, :class => 'icon icon-unlock') if !project.active? && (project.parent.nil? || project.parent.active?) %>
<%= link_to(l(:button_copy), { :controller => 'projects', :action => 'copy', :id => project }, :class => 'icon icon-copy') %> <%= link_to(l(:button_copy), { :controller => 'projects', :action => 'copy', :id => project }, :class => 'icon icon-copy') %>
<%= link_to(l(:button_delete), { :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> </td>
</tr> </tr>
<% end %> <% end %>
+8 -6
View File
@@ -1,6 +1,7 @@
<h2><%= l(:label_calendar) %></h2> <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"> <fieldset id="filters" class="collapsible">
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend> <legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
<div> <div>
@@ -9,7 +10,7 @@
</fieldset> </fieldset>
<p style="float:right;"> <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>
<p class="buttons"> <p class="buttons">
@@ -25,7 +26,8 @@
}, :class => 'icon icon-checked' %> }, :class => 'icon icon-checked' %>
<%= link_to_remote l(:button_clear), <%= 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", :update => "content",
}, :class => 'icon icon-reload' if @query.new_record? %> }, :class => 'icon icon-reload' if @query.new_record? %>
</p> </p>
@@ -36,9 +38,9 @@
<%= render :partial => 'common/calendar', :locals => {:calendar => @calendar} %> <%= render :partial => 'common/calendar', :locals => {:calendar => @calendar} %>
<p class="legend cal"> <p class="legend cal">
<span class="starting"><%= l(:text_tip_task_begin_day) %></span> <span class="starting"><%= l(:text_tip_issue_begin_day) %></span>
<span class="ending"><%= l(:text_tip_task_end_day) %></span> <span class="ending"><%= l(:text_tip_issue_end_day) %></span>
<span class="starting ending"><%= l(:text_tip_task_begin_end_day) %></span> <span class="starting ending"><%= l(:text_tip_issue_begin_end_day) %></span>
</p> </p>
<% end %> <% end %>
+3 -4
View File
@@ -33,7 +33,6 @@
</li> </li>
<% end %> <% end %>
<% if @projects.size == 1 %>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_priority) %></a> <a href="#" class="submenu"><%= l(:field_priority) %></a>
<ul> <ul>
@@ -43,8 +42,8 @@
<% end -%> <% end -%>
</ul> </ul>
</li> </li>
<% end %>
<% #TODO: allow editing versions when multiple projects %>
<% unless @project.nil? || @project.shared_versions.open.empty? -%> <% unless @project.nil? || @project.shared_versions.open.empty? -%>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_fixed_version) %></a> <a href="#" class="submenu"><%= l(:field_fixed_version) %></a>
@@ -85,7 +84,7 @@
</li> </li>
<% end -%> <% end -%>
<% if Issue.use_field_for_done_ratio? && @projects.size == 1 %> <% if Issue.use_field_for_done_ratio? %>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_done_ratio) %></a> <a href="#" class="submenu"><%= l(:field_done_ratio) %></a>
<ul> <ul>
@@ -115,7 +114,7 @@
:class => 'icon-copy', :disabled => !@can[:move] %></li> :class => 'icon-copy', :disabled => !@can[:move] %></li>
<li><%= context_menu_link l(:button_move), new_issue_move_path(:ids => @issues.collect(&:id)), <li><%= context_menu_link l(:button_move), new_issue_move_path(:ids => @issues.collect(&:id)),
:class => 'icon-move', :disabled => !@can[:move] %></li> :class => 'icon-move', :disabled => !@can[:move] %></li>
<li><%= context_menu_link l(:button_delete), {:controller => 'issues', :action => 'destroy', :ids => @issues.collect(&:id)}, <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> :method => :post, :confirm => l(:text_issues_destroy_confirmation), :class => 'icon-del', :disabled => !@can[:delete] %></li>
<%= call_hook(:view_issues_context_menu_end, {:issues => @issues, :can => @can, :back => @back }) %> <%= call_hook(:view_issues_context_menu_end, {:issues => @issues, :can => @can, :back => @back }) %>
+1 -1
View File
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to_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> </div>
<h2><%=l(:label_attachment_plural)%></h2> <h2><%=l(:label_attachment_plural)%></h2>
+1 -1
View File
@@ -2,7 +2,7 @@
<%= error_messages_for 'attachment' %> <%= error_messages_for 'attachment' %>
<div class="box"> <div class="box">
<% form_tag({ :action => 'new', :id => @project }, :multipart => true, :class => "tabular") do %> <% form_tag(project_files_path(@project), :multipart => true, :class => "tabular") do %>
<% if @versions.any? %> <% if @versions.any? %>
<p><label for="version_id"><%=l(:field_version)%></label> <p><label for="version_id"><%=l(:field_version)%></label>
+17 -73
View File
@@ -1,6 +1,8 @@
<% @gantt.view = self %>
<h2><%= l(:label_gantt) %></h2> <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"> <fieldset id="filters" class="collapsible">
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend> <legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
<div> <div>
@@ -27,7 +29,8 @@
}, :class => 'icon icon-checked' %> }, :class => 'icon icon-checked' %>
<%= link_to_remote l(:button_clear), <%= 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", :update => "content",
}, :class => 'icon icon-reload' if @query.new_record? %> }, :class => 'icon icon-reload' if @query.new_record? %>
</p> </p>
@@ -54,11 +57,12 @@ if @gantt.zoom >1
end end
end end
# Width of the entire chart
g_width = (@gantt.date_to - @gantt.date_from + 1)*zoom g_width = (@gantt.date_to - @gantt.date_from + 1)*zoom
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 t_height = g_height + headers_height
%> %>
<table width="100%" style="border:0; border-collapse: collapse;"> <table width="100%" style="border:0; border-collapse: collapse;">
<tr> <tr>
<td style="width:<%= subject_width %>px; padding:0px;"> <td style="width:<%= subject_width %>px; padding:0px;">
@@ -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="position:relative;height:<%= t_height + 24 %>px;width:<%= subject_width + 1 %>px;">
<div style="right:-2px;width:<%= subject_width %>px;height:<%= headers_height %>px;background: #eee;" class="gantt_hdr"></div> <div style="right:-2px;width:<%= subject_width %>px;height:<%= headers_height %>px;background: #eee;" class="gantt_hdr"></div>
<div style="right:-2px;width:<%= subject_width %>px;height:<%= t_height %>px;border-left: 1px solid #c0c0c0;overflow:hidden;" class="gantt_hdr"></div> <div style="right:-2px;width:<%= subject_width %>px;height:<%= t_height %>px;border-left: 1px solid #c0c0c0;overflow:hidden;" class="gantt_hdr"></div>
<% <% top = headers_height + 8 %>
#
# Tasks subjects <%= @gantt.subjects(:headers_height => headers_height, :top => top, :g_width => g_width) %>
#
top = headers_height + 8
@gantt.events.each do |i|
left = 4 + (i.is_a?(Issue) ? i.level * 16 : 0)
%>
<div style="position: absolute;line-height:1.2em;height:16px;top:<%= top %>px;left:<%= left %>px;overflow:hidden;"><small>
<% if i.is_a? Issue %>
<%= h("#{i.project} -") unless @project && @project == i.project %>
<%= link_to_issue i %>
<% else %>
<span class="icon icon-package">
<%= link_to_version i %>
</span>
<% end %>
</small></div>
<% top = top + 20
end %>
</div> </div>
</td> </td>
<td> <td>
@@ -163,53 +151,9 @@ if show_days
end end
end %> end %>
<% <% top = headers_height + 10 %>
#
# Tasks <%= @gantt.lines(:top => top, :zoom => zoom, :g_width => g_width ) %>
#
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 %>
<% <%
# #
@@ -226,8 +170,8 @@ if Date.today >= @gantt.date_from and Date.today <= @gantt.date_to %>
<table width="100%"> <table width="100%">
<tr> <tr>
<td align="left"><%= link_to_remote ('&#171; ' + l(:label_previous)), {:url => @gantt.params_previous, :update => 'content', :complete => 'window.scrollTo(0,0)'}, {:href => url_for(@gantt.params_previous)} %></td> <td align="left"><%= link_to_remote ('&#171; ' + l(:label_previous)), {:url => @gantt.params_previous, :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, :update => 'content', :complete => 'window.scrollTo(0,0)'}, {:href => url_for(@gantt.params_next)} %></td> <td align="right"><%= link_to_remote (l(:label_next) + ' &#187;'), {:url => @gantt.params_next, :method => :get, :update => 'content', :complete => 'window.scrollTo(0,0)'}, {:href => url_for(@gantt.params_next)} %></td>
</tr> </tr>
</table> </table>
+3 -3
View File
@@ -1,10 +1,10 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %> <%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => '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' %> <% replace_watcher ||= 'watcher' %>
<%= watcher_tag(@issue, User.current, {:id => replace_watcher, :replace => ['watcher','watcher2']}) %> <%= watcher_tag(@issue, User.current, {:id => replace_watcher, :replace => ['watcher','watcher2']}) %>
<%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %> <%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %>
<%= link_to_if_authorized l(:button_copy), new_issue_move_path(:id => @issue, :copy_options => {:copy => 't'}), :class => 'icon icon-copy' %> <%= 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), new_issue_move_path(:id => @issue), :class => 'icon icon-move' %> <%= 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' %> <%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => (@issue.leaf? ? l(:text_are_you_sure) : l(:text_are_you_sure_with_children)), :method => :post, :class => 'icon icon-del' %>
</div> </div>
+7 -2
View File
@@ -11,7 +11,7 @@
<div class="splitcontentleft"> <div class="splitcontentleft">
<p> <p>
<label><%= l(:field_tracker) %></label> <label><%= l(:field_tracker) %></label>
<%= select_tag('issue[tracker_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@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> </p>
<% if @available_statuses.any? %> <% if @available_statuses.any? %>
<p> <p>
@@ -27,20 +27,25 @@
<label><%= l(:field_assigned_to) %></label> <label><%= l(:field_assigned_to) %></label>
<%= select_tag('issue[assigned_to_id]', content_tag('option', l(:label_no_change_option), :value => '') + <%= select_tag('issue[assigned_to_id]', content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:label_nobody), :value => 'none') + content_tag('option', l(:label_nobody), :value => 'none') +
options_from_collection_for_select(@project.assignable_users, :id, :name)) %> options_from_collection_for_select(@assignables, :id, :name)) %>
</p> </p>
<% if @project %>
<p> <p>
<label><%= l(:field_category) %></label> <label><%= l(:field_category) %></label>
<%= select_tag('issue[category_id]', content_tag('option', l(:label_no_change_option), :value => '') + <%= select_tag('issue[category_id]', content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:label_none), :value => 'none') + content_tag('option', l(:label_none), :value => 'none') +
options_from_collection_for_select(@project.issue_categories, :id, :name)) %> options_from_collection_for_select(@project.issue_categories, :id, :name)) %>
</p> </p>
<% end %>
<% #TODO: allow editing versions when multiple projects %>
<% if @project %>
<p> <p>
<label><%= l(:field_fixed_version) %></label> <label><%= l(:field_fixed_version) %></label>
<%= select_tag('issue[fixed_version_id]', content_tag('option', l(:label_no_change_option), :value => '') + <%= select_tag('issue[fixed_version_id]', content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:label_none), :value => 'none') + content_tag('option', l(:label_none), :value => 'none') +
version_options_for_select(@project.shared_versions.open)) %> version_options_for_select(@project.shared_versions.open)) %>
</p> </p>
<% end %>
<% @custom_fields.each do |custom_field| %> <% @custom_fields.each do |custom_field| %>
<p><label><%= h(custom_field.name) %></label> <%= custom_field_tag_for_bulk_edit('issue', custom_field) %></p> <p><label><%= h(custom_field.name) %></label> <%= custom_field_tag_for_bulk_edit('issue', custom_field) %></p>
+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> <th class="category"><%=l(:field_category)%>:</th><td class="category"><%=h @issue.category ? @issue.category.name : "-" %></td>
<% if User.current.allowed_to?(:view_time_entries, @project) %> <% if User.current.allowed_to?(:view_time_entries, @project) %>
<th class="spent-time"><%=l(:label_spent_time)%>:</th> <th class="spent-time"><%=l(:label_spent_time)%>:</th>
<td class="spent-time"><%= @issue.spent_hours > 0 ? (link_to l_hours(@issue.spent_hours), {:controller => 'timelog', :action => '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 %> <% end %>
</tr> </tr>
<tr> <tr>
@@ -44,18 +44,19 @@
<%= render_custom_fields_rows(@issue) %> <%= render_custom_fields_rows(@issue) %>
<%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %> <%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
</table> </table>
<hr />
<% if @issue.description? || @issue.attachments.any? -%>
<hr />
<div class="contextual"> <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> </div>
<p><strong><%=l(:field_description)%></strong></p>
<div class="wiki"> <div class="wiki">
<%= textilizable @issue, :description, :attachments => @issue.attachments %> <%= textilizable @issue, :description, :attachments => @issue.attachments %>
</div> </div>
<%= link_to_attachments @issue %> <%= link_to_attachments @issue %>
<% end -%>
<%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %> <%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %>
+2 -14
View File
@@ -32,24 +32,12 @@
<div class="splitcontentright"> <div class="splitcontentright">
<h3><%=l(:field_mail_notification)%></h3> <h3><%=l(:field_mail_notification)%></h3>
<div class="box"> <div class="box">
<%= select_tag 'notification_option', options_for_select(@notification_options, @notification_option), <%= render :partial => 'users/mail_notifications' %>
:onchange => 'if ($("notification_option").value == "selected") {Element.show("notified-projects")} else {Element.hide("notified-projects")}' %>
<% content_tag 'div', :id => 'notified-projects', :style => (@notification_option == 'selected' ? '' : 'display:none;') do %>
<p><% User.current.projects.each do |project| %>
<label><%= check_box_tag 'notified_project_ids[]', project.id, @user.notified_projects_ids.include?(project.id) %> <%=h project.name %></label><br />
<% end %></p>
<p><em><%= l(:text_user_mail_option) %></em></p>
<% end %>
<p><label><%= check_box_tag 'no_self_notified', 1, @user.pref[:no_self_notified] %> <%= l(:label_user_mail_no_self_notified) %></label></p>
</div> </div>
<h3><%=l(:label_preferences)%></h3> <h3><%=l(:label_preferences)%></h3>
<div class="box tabular"> <div class="box tabular">
<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %> <%= render :partial => 'users/preferences' %>
<p><%= pref_fields.check_box :hide_mail %></p>
<p><%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
<p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
<% end %>
</div> </div>
</div> </div>
+1 -1
View File
@@ -40,7 +40,7 @@ entries_by_day = entries.group_by(&:spent_on)
:title => l(:button_edit) %> :title => l(:button_edit) %>
<%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry}, <%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry},
:confirm => l(:text_are_you_sure), :confirm => l(:text_are_you_sure),
:method => :post, :method => :delete,
:title => l(:button_delete) %> :title => l(:button_delete) %>
<% end -%> <% end -%>
</td> </td>
+1 -1
View File
@@ -1,5 +1,5 @@
<p><%= link_to_project(news.project) + ': ' unless @project %> <p><%= link_to_project(news.project) + ': ' unless @project %>
<%= link_to h(news.title), :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 %> <%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %>
<br /> <br />
<% unless news.summary.blank? %><span class="summary"><%=h news.summary %></span><br /><% end %> <% unless news.summary.blank? %><span class="summary"><%=h news.summary %></span><br /><% end %>
+4 -4
View File
@@ -1,12 +1,12 @@
<h2><%=l(:label_news)%></h2> <h2><%=l(:label_news)%></h2>
<% labelled_tabular_form_for :news, @news, :url => { :action => "edit" }, <% labelled_tabular_form_for :news, @news, :url => news_path(@news),
:html => { :id => 'news-form' } do |f| %> :html => { :id => 'news-form', :method => :put } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => { :controller => 'news', :action => 'preview', :project_id => @project }, { :url => preview_news_path(:project_id => @project),
:method => 'post', :method => 'get',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('news-form')" :with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %> }, :accesskey => accesskey(:preview) %>
+8 -8
View File
@@ -1,19 +1,19 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized(l(:label_news_new), <%= link_to(l(:label_news_new),
{:controller => 'news', :action => 'new', :project_id => @project}, new_project_news_path(@project),
:class => 'icon icon-add', :class => 'icon icon-add',
:onclick => 'Element.show("add-news"); Form.Element.focus("news_title"); return false;') if @project %> :onclick => 'Element.show("add-news"); Form.Element.focus("news_title"); return false;') if @project && User.current.allowed_to?(:manage_news, @project) %>
</div> </div>
<div id="add-news" style="display:none;"> <div id="add-news" style="display:none;">
<h2><%=l(:label_news_new)%></h2> <h2><%=l(:label_news_new)%></h2>
<% labelled_tabular_form_for :news, @news, :url => { :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| %> :html => { :id => 'news-form' } do |f| %>
<%= render :partial => 'news/form', :locals => { :f => f } %> <%= render :partial => 'news/form', :locals => { :f => f } %>
<%= submit_tag l(:button_create) %> <%= submit_tag l(:button_create) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => { :controller => 'news', :action => 'preview', :project_id => @project }, { :url => preview_news_path(:project_id => @project),
:method => 'post', :method => 'get',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('news-form')" :with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %> | }, :accesskey => accesskey(:preview) %> |
@@ -29,7 +29,7 @@
<% else %> <% else %>
<% @newss.each do |news| %> <% @newss.each do |news| %>
<h3><%= link_to_project(news.project) + ': ' unless news.project == @project %> <h3><%= link_to_project(news.project) + ': ' unless news.project == @project %>
<%= link_to h(news.title), :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> <%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %></h3>
<p class="author"><%= authoring news.created_on, news.author %></p> <p class="author"><%= authoring news.created_on, news.author %></p>
<div class="wiki"> <div class="wiki">
+3 -3
View File
@@ -1,12 +1,12 @@
<h2><%=l(:label_news_new)%></h2> <h2><%=l(:label_news_new)%></h2>
<% labelled_tabular_form_for :news, @news, :url => { :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| %> :html => { :id => 'news-form' } do |f| %>
<%= render :partial => 'news/form', :locals => { :f => f } %> <%= render :partial => 'news/form', :locals => { :f => f } %>
<%= submit_tag l(:button_create) %> <%= submit_tag l(:button_create) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => { :controller => 'news', :action => 'preview', :project_id => @project }, { :url => preview_news_path(:project_id => @project),
:method => 'post', :method => 'get',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('news-form')" :with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %> }, :accesskey => accesskey(:preview) %>
+10 -10
View File
@@ -1,23 +1,23 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized l(:button_edit), <%= link_to_if_authorized l(:button_edit),
{:controller => 'news', :action => 'edit', :id => @news}, edit_news_path(@news),
:class => 'icon icon-edit', :class => 'icon icon-edit',
:accesskey => accesskey(:edit), :accesskey => accesskey(:edit),
:onclick => 'Element.show("edit-news"); return false;' %> :onclick => 'Element.show("edit-news"); return false;' %>
<%= link_to_if_authorized l(:button_delete), {: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> </div>
<h2><%= avatar(@news.author, :size => "24") %><%=h @news.title %></h2> <h2><%= avatar(@news.author, :size => "24") %><%=h @news.title %></h2>
<% if authorize_for('news', 'edit') %> <% if authorize_for('news', 'edit') %>
<div id="edit-news" style="display:none;"> <div id="edit-news" style="display:none;">
<% labelled_tabular_form_for :news, @news, :url => { :action => "edit", :id => @news }, <% labelled_tabular_form_for :news, @news, :url => news_path(@news),
:html => { :id => 'news-form' } do |f| %> :html => { :id => 'news-form', :method => :put } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => { :controller => 'news', :action => 'preview', :project_id => @project }, { :url => preview_news_path(:project_id => @project),
:method => 'post', :method => 'get',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('news-form')" :with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %> | }, :accesskey => accesskey(:preview) %> |
@@ -39,17 +39,17 @@
<% @comments.each do |comment| %> <% @comments.each do |comment| %>
<% next if comment.new_record? %> <% next if comment.new_record? %>
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized image_tag('delete.png'), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment}, <%= link_to_if_authorized image_tag('delete.png'), {:controller => 'comments', :action => 'destroy', :id => @news, :comment_id => comment},
:confirm => l(:text_are_you_sure), :method => :post, :title => l(:button_delete) %> :confirm => l(:text_are_you_sure), :method => :delete, :title => l(:button_delete) %>
</div> </div>
<h4><%= avatar(comment.author, :size => "24") %><%= authoring comment.created_on, comment.author %></h4> <h4><%= avatar(comment.author, :size => "24") %><%= authoring comment.created_on, comment.author %></h4>
<%= textilizable(comment.comments) %> <%= textilizable(comment.comments) %>
<% end if @comments.any? %> <% end if @comments.any? %>
</div> </div>
<% if authorize_for 'news', 'add_comment' %> <% if authorize_for 'comments', 'create' %>
<p><%= toggle_link l(:label_comment_add), "add_comment_form", :focus => "comment_comments" %></p> <p><%= toggle_link l(:label_comment_add), "add_comment_form", :focus => "comment_comments" %></p>
<% form_tag({: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"> <div class="box">
<%= text_area 'comment', 'comments', :cols => 80, :rows => 15, :class => 'wiki-edit' %> <%= text_area 'comment', 'comments', :cols => 80, :rows => 15, :class => 'wiki-edit' %>
<%= wikitoolbar_for 'comment_comments' %> <%= wikitoolbar_for 'comment_comments' %>
+1 -1
View File
@@ -1,4 +1,4 @@
<% labelled_tabular_form_for :project, @project, :url => { :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 } %> <%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<% end %> <% end %>
+1 -1
View File
@@ -8,7 +8,7 @@
<% end %> <% end %>
</p> </p>
<p> <p>
<% form_tag({: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> <label><%= check_box_tag 'confirm', 1 %> <%= l(:general_text_Yes) %></label>
<%= submit_tag l(:button_delete) %> <%= submit_tag l(:button_delete) %>
<% end %> <% end %>
@@ -1,4 +1,4 @@
<% form_tag({: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"> <table class="list">
<thead><tr> <thead><tr>
@@ -32,7 +32,7 @@
</table> </table>
<div class="contextual"> <div class="contextual">
<%= link_to(l(:button_reset), {:controller => 'project_enumerations', :action => 'destroy', :id => @project}, <%= link_to(l(:button_reset), project_project_enumerations_path(@project),
:method => :delete, :method => :delete,
:confirm => l(:text_are_you_sure), :confirm => l(:text_are_you_sure),
:class => 'icon icon-del') %> :class => 'icon icon-del') %>
+2 -2
View File
@@ -21,7 +21,7 @@
<td class="buttons"> <td class="buttons">
<% if version.project == @project %> <% if version.project == @project %>
<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %> <%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %>
<%= link_to_if_authorized l(:button_delete), {:controller => 'versions', :action => 'destroy', :id => version}, :confirm => l(:text_are_you_sure), :method => :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 %> <% end %>
</td> </td>
</tr> </tr>
@@ -34,7 +34,7 @@
<div class="contextual"> <div class="contextual">
<% if @project.versions.any? %> <% if @project.versions.any? %>
<%= link_to l(:label_close_versions), {: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 %> <% end %>
</div> </div>
+2 -2
View File
@@ -67,8 +67,8 @@
<% if @total_hours && User.current.allowed_to?(:view_time_entries, @project) %> <% if @total_hours && User.current.allowed_to?(:view_time_entries, @project) %>
<h3><%= l(:label_spent_time) %></h3> <h3><%= l(:label_spent_time) %></h3>
<p><span class="icon icon-time"><%= l_hours(@total_hours) %></span></p> <p><span class="icon icon-time"><%= l_hours(@total_hours) %></span></p>
<p><%= link_to(l(:label_details), {:controller => 'timelog', :action => 'details', :project_id => @project}) %> | <p><%= link_to(l(:label_details), {:controller => 'timelog', :action => 'index', :project_id => @project}) %> |
<%= link_to(l(:label_report), {:controller => 'timelog', :action => 'report', :project_id => @project}) %></p> <%= link_to(l(:label_report), {:controller => 'time_entry_reports', :action => 'report', :project_id => @project}) %></p>
<% end %> <% end %>
<%= call_hook(:view_projects_show_sidebar_bottom, :project => @project) %> <%= call_hook(:view_projects_show_sidebar_bottom, :project => @project) %>
<% end %> <% end %>
+10 -5
View File
@@ -7,13 +7,18 @@
<p><%= setting_check_box :bcc_recipients %></p> <p><%= setting_check_box :bcc_recipients %></p>
<p><%= setting_check_box :plain_text_mail %></p> <p><%= setting_check_box :plain_text_mail %></p>
<p><%= setting_select(:default_notification_option, User::MAIL_NOTIFICATION_OPTIONS.collect {|o| [l(o.last), o.first.to_s]}) %></p>
</div> </div>
<fieldset class="box settings" id="notified_events"><legend><%=l(:text_select_mail_notifications)%></legend> <fieldset class="box" id="notified_events"><legend><%=l(:text_select_mail_notifications)%></legend>
<%= setting_multiselect(:notified_events, <%= hidden_field_tag 'settings[notified_events][]', '' %>
@notifiables.collect {|notifiable| [l_or_humanize(notifiable, :prefix => 'label_'), notifiable]}, :label => false) %> <% @notifiables.each do |notifiable| %>
<%= notification_field notifiable %>
<p><%= check_all_links('notified_events') %></p> <br />
<% end %>
<p><%= check_all_links('notified_events') %></p>
</fieldset> </fieldset>
<fieldset class="box"><legend><%= l(:setting_emails_footer) %></legend> <fieldset class="box"><legend><%= l(:setting_emails_footer) %></legend>
@@ -1,5 +1,5 @@
<div class="contextual"> <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> </div>
<%= render_timelog_breadcrumb %> <%= render_timelog_breadcrumb %>
@@ -13,7 +13,7 @@
<%# TODO: get rid of the project_id field, that should already be in the URL %> <%# TODO: get rid of the project_id field, that should already be in the URL %>
<%= hidden_field_tag('project_id', params[:project_id]) if @project %> <%= hidden_field_tag('project_id', params[:project_id]) if @project %>
<%= hidden_field_tag('issue_id', params[:issue_id]) if @issue %> <%= hidden_field_tag('issue_id', params[:issue_id]) if @issue %>
<%= render :partial => 'date_range' %> <%= render :partial => 'timelog/date_range' %>
<p><%= l(:label_details) %>: <%= select_tag 'columns', options_for_select([[l(:label_year), 'year'], <p><%= l(:label_details) %>: <%= select_tag 'columns', options_for_select([[l(:label_year), 'year'],
[l(:label_month), 'month'], [l(:label_month), 'month'],
+3 -3
View File
@@ -28,9 +28,9 @@
<div class="tabs"> <div class="tabs">
<% url_params = @free_period ? { :from => @from, :to => @to } : { :period => params[:period] } %> <% url_params = @free_period ? { :from => @from, :to => @to } : { :period => params[:period] } %>
<ul> <ul>
<li><%= link_to(l(:label_details), url_params.merge({:controller => 'timelog', :action => 'details', :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 == 'details' ? 'selected' : nil)) %></li> :class => (@controller.action_name == 'index' ? '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_report), url_params.merge({:controller => 'time_entry_reports', :action => 'report', :project_id => @project, :issue_id => @issue}),
:class => (@controller.action_name == 'report' ? 'selected' : nil)) %></li> :class => (@controller.action_name == 'report' ? 'selected' : nil)) %></li>
</ul> </ul>
</div> </div>
+1 -1
View File
@@ -31,7 +31,7 @@
:title => l(:button_edit) %> :title => l(:button_edit) %>
<%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry, :project_id => nil}, <%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry, :project_id => nil},
:confirm => l(:text_are_you_sure), :confirm => l(:text_are_you_sure),
:method => :post, :method => :delete,
:title => l(:button_delete) %> :title => l(:button_delete) %>
<% end -%> <% end -%>
</td> </td>
+6 -1
View File
@@ -1,6 +1,11 @@
<h2><%= l(:label_spent_time) %></h2> <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' %> <%= error_messages_for 'time_entry' %>
<%= back_url_hidden_field_tag %> <%= back_url_hidden_field_tag %>
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => '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> </div>
<%= render_timelog_breadcrumb %> <%= render_timelog_breadcrumb %>
+10
View File
@@ -32,4 +32,14 @@
<%= password_field_tag 'password_confirmation', nil, :size => 25 %></p> <%= password_field_tag 'password_confirmation', nil, :size => 25 %></p>
</div> </div>
</div> </div>
<div class="box">
<h3><%=l(:field_mail_notification)%></h3>
<%= render :partial => 'users/mail_notifications' %>
</div>
<div class="box tabular">
<h3><%=l(:label_preferences)%></h3>
<%= render :partial => 'users/preferences' %>
</div>
<!--[eoform:user]--> <!--[eoform:user]-->
+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 } %> <%= render :partial => 'form', :locals => { :f => f } %>
<% if @user.active? -%> <% if @user.active? -%>
<p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label> <p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label></p>
<% end -%> <% end -%>
<p><%= submit_tag l(:button_save) %></p> <p><%= submit_tag l(:button_save) %></p>
<% end %> <% 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"> <div class="box">
<% Group.all.sort.each do |group| %> <% Group.all.sort.each do |group| %>
<label><%= check_box_tag 'user[group_ids][]', group.id, @user.groups.include?(group) %> <%=h group %></label><br /> <label><%= check_box_tag 'user[group_ids][]', group.id, @user.groups.include?(group) %> <%=h group %></label><br />
@@ -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"> <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) %> <%= change_status_link(@user) %>
</div> </div>
+2 -2
View File
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to l(:label_user_new), {:action => 'add'}, :class => 'icon icon-add' %> <%= link_to l(:label_user_new), {:action => 'new'}, :class => 'icon icon-add' %>
</div> </div>
<h2><%=l(:label_user_plural)%></h2> <h2><%=l(:label_user_plural)%></h2>
@@ -30,7 +30,7 @@
<tbody> <tbody>
<% for user in @users -%> <% for user in @users -%>
<tr class="user <%= cycle("odd", "even") %> <%= %w(anon active registered locked)[user.status] %>"> <tr class="user <%= cycle("odd", "even") %> <%= %w(anon active registered locked)[user.status] %>">
<td class="username"><%= avatar(user, :size => "14") %><%= link_to h(user.login), :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="firstname"><%= h(user.firstname) %></td>
<td class="lastname"><%= h(user.lastname) %></td> <td class="lastname"><%= h(user.lastname) %></td>
<td class="email"><%= mail_to(h(user.mail)) %></td> <td class="email"><%= mail_to(h(user.mail)) %></td>
@@ -1,6 +1,6 @@
<h2><%= link_to l(:label_user_plural), :controller => 'users', :action => 'index' %> &#187; <%=l(:label_user_new)%></h2> <h2><%= link_to l(:label_user_plural), :controller => 'users', :action => 'index' %> &#187; <%=l(:label_user_new)%></h2>
<% labelled_tabular_form_for :user, @user, :url => { :action => "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 } %> <%= render :partial => 'form', :locals => { :f => f } %>
<p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label></p> <p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label></p>
<p> <p>
+1 -1
View File
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to(l(: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> </div>
<h2><%= avatar @user, :size => "50" %> <%=h @user.name %></h2> <h2><%= avatar @user, :size => "50" %> <%=h @user.name %></h2>
+1 -1
View File
@@ -5,7 +5,7 @@
select_tag('status_by', select_tag('status_by',
status_by_options_for_select(criteria), status_by_options_for_select(criteria),
:id => 'status_by_select', :id => 'status_by_select',
:onchange => remote_function(:url => { :action => :status_by, :id => version }, :onchange => remote_function(:url => status_by_project_version_path(version.project, version),
:with => "Form.serialize('status_by_form')"))) %> :with => "Form.serialize('status_by_form')"))) %>
</legend> </legend>
<% if counts.empty? %> <% if counts.empty? %>
+1 -1
View File
@@ -1,6 +1,6 @@
<h2><%=l(:label_version)%></h2> <h2><%=l(:label_version)%></h2>
<% labelled_tabular_form_for :version, @version, :url => { :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 } %> <%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<% end %> <% end %>
+1 -1
View File
@@ -1,6 +1,6 @@
<h2><%=l(:label_version_new)%></h2> <h2><%=l(:label_version_new)%></h2>
<% labelled_tabular_form_for :version, @version, :url => { :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 } %> <%= render :partial => 'versions/form', :locals => { :f => f } %>
<%= submit_tag l(:button_create) %> <%= submit_tag l(:button_create) %>
<% end %> <% end %>
+1
View File
@@ -1,5 +1,6 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %> <%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %>
<%= link_to_if_authorized(l(:button_edit_associated_wikipage, :page_title => @version.wiki_page_title), {:controller => 'wiki', :action => 'edit', :page => Wiki.titleize(@version.wiki_page_title)}, :class => 'icon icon-edit') unless @version.wiki_page_title.blank? || @project.wiki.nil? %>
<%= call_hook(:view_versions_show_contextual, { :version => @version, :project => @project }) %> <%= call_hook(:view_versions_show_contextual, { :version => @version, :project => @project }) %>
</div> </div>
+3 -3
View File
@@ -4,6 +4,6 @@
<h3><%= l(:label_wiki) %></h3> <h3><%= l(:label_wiki) %></h3>
<%= link_to l(:field_start_page), {:action => 'index', :page => nil} %><br /> <%= link_to l(:field_start_page), {:action => 'show', :page => nil} %><br />
<%= link_to l(:label_index_by_title), {:action => 'special', :page => 'Page_index'} %><br /> <%= link_to l(:label_index_by_title), {:action => 'page_index'} %><br />
<%= link_to l(:label_index_by_date), {:action => 'special', :page => 'Date_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> <h2><%= @page.pretty_title %></h2>
<p> <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> <em>(<%= @annotate.content.author ? @annotate.content.author.name : "anonyme" %>, <%= format_time(@annotate.content.updated_on) %>)</em>
</p> </p>
@@ -18,7 +18,7 @@
<% @annotate.lines.each do |line| -%> <% @annotate.lines.each do |line| -%>
<tr class="bloc-<%= colors[line[0]] %>"> <tr class="bloc-<%= colors[line[0]] %>">
<th class="line-num"><%= line_num %></th> <th class="line-num"><%= line_num %></th>
<td class="revision"><%= link_to line[0], :controller => 'wiki', :action => '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="author"><%= h(line[1]) %></td>
<td class="line-code"><pre><%=h line[2] %></pre></td> <td class="line-code"><pre><%=h line[2] %></pre></td>
</tr> </tr>
@@ -12,7 +12,7 @@
<h3><%= format_date(date) %></h3> <h3><%= format_date(date) %></h3>
<ul> <ul>
<% @pages_by_date[date].each do |page| %> <% @pages_by_date[date].each do |page| %>
<li><%= link_to page.pretty_title, :action => 'index', :page => page.title %></li> <li><%= link_to page.pretty_title, :action => 'show', :page => page.title %></li>
<% end %> <% end %>
</ul> </ul>
<% end %> <% end %>
@@ -23,11 +23,11 @@
<% unless @pages.empty? %> <% unless @pages.empty? %>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %> <%= 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 => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %> <%= f.link_to('HTML', :url => {:action => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% end %> <% end %>
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => '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 %> <% end %>
+1 -1
View File
@@ -15,5 +15,5 @@
</div> </div>
<%= submit_tag l(:button_apply) %> <%= submit_tag l(:button_apply) %>
<%= link_to l(:button_cancel), :controller => 'wiki', :action => 'index', :id => @project, :page => @page.title %> <%= link_to l(:button_cancel), :controller => 'wiki', :action => 'show', :project_id => @project, :page => @page.title %>
<% end %> <% end %>
+2 -2
View File
@@ -5,10 +5,10 @@
<h2><%= @page.pretty_title %></h2> <h2><%= @page.pretty_title %></h2>
<p> <p>
<%= l(:label_version) %> <%= link_to @diff.content_from.version, :action => '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> <em>(<%= @diff.content_from.author ? @diff.content_from.author.name : "anonyme" %>, <%= format_time(@diff.content_from.updated_on) %>)</em>
&#8594; &#8594;
<%= l(:label_version) %> <%= link_to @diff.content_to.version, :action => '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> <em>(<%= @diff.content_to.author ? @diff.content_to.author.name : "anonyme" %>, <%= format_time(@diff.content_to.updated_on) %>)</em>
</p> </p>
+2 -2
View File
@@ -1,6 +1,6 @@
<h2><%=h @page.pretty_title %></h2> <h2><%=h @page.pretty_title %></h2>
<% form_for :content, @content, :url => {:action => '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 %> <%= f.hidden_field :version %>
<%= error_messages_for 'content' %> <%= error_messages_for 'content' %>
@@ -10,7 +10,7 @@
<p><%= submit_tag l(:button_save) %> <p><%= submit_tag l(:button_save) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => { :controller => 'wiki', :action => 'preview', :id => @project, :page => @page.title }, { :url => { :controller => 'wiki', :action => 'preview', :project_id => @project, :page => @page.title },
:method => 'post', :method => 'post',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('wiki_form')", :with => "Form.serialize('wiki_form')",
+2 -1
View File
@@ -3,6 +3,7 @@
<h3><%= l(:label_history) %></h3> <h3><%= l(:label_history) %></h3>
<% form_tag({:action => "diff"}, :method => :get) do %> <% form_tag({:action => "diff"}, :method => :get) do %>
<%= hidden_field_tag('project_id', h(@project.to_param)) %>
<table class="list"> <table class="list">
<thead><tr> <thead><tr>
<th>#</th> <th>#</th>
@@ -18,7 +19,7 @@
<% line_num = 1 %> <% line_num = 1 %>
<% @versions.each do |ver| %> <% @versions.each do |ver| %>
<tr class="<%= cycle("odd", "even") %>"> <tr class="<%= cycle("odd", "even") %>">
<td class="id"><%= link_to ver.version, :action => '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', ver.version, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('cbto-#{line_num+1}').checked=true;") if show_diff && (line_num < @versions.size) %></td>
<td class="checkbox"><%= radio_button_tag('version_from', ver.version, (line_num==2), :id => "cbto-#{line_num}") if show_diff && (line_num > 1) %></td> <td class="checkbox"><%= radio_button_tag('version_from', ver.version, (line_num==2), :id => "cbto-#{line_num}") if show_diff && (line_num > 1) %></td>
<td align="center"><%= format_time(ver.updated_on) %></td> <td align="center"><%= format_time(ver.updated_on) %></td>
@@ -16,11 +16,11 @@
<% unless @pages.empty? %> <% unless @pages.empty? %>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %> <%= 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 => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %> <%= f.link_to('HTML', :url => {:action => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% end %> <% end %>
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => '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 %> <% end %>
+3 -3
View File
@@ -15,11 +15,11 @@
<% if @content.version != @page.content.version %> <% if @content.version != @page.content.version %>
<p> <p>
<%= link_to(('&#171; ' + l(:label_previous)), :action => '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}" %> <%= "#{l(:label_version)} #{@content.version}/#{@page.content.version}" %>
<%= '(' + link_to('diff', :controller => 'wiki', :action => 'diff', :page => @page.title, :version => @content.version) + ')' if @content.version > 1 %> - <%= '(' + link_to('diff', :controller => 'wiki', :action => 'diff', :page => @page.title, :version => @content.version) + ')' if @content.version > 1 %> -
<%= link_to((l(:label_next) + ' &#187;'), :action => 'index', :page => @page.title, :version => (@content.version + 1)) + " - " if @content.version < @page.content.version %> <%= 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 => 'index', :page => @page.title) %> <%= link_to(l(:label_current_version), :action => 'show', :page => @page.title) %>
<br /> <br />
<em><%= @content.author ? @content.author.name : "anonyme" %>, <%= format_time(@content.updated_on) %> </em><br /> <em><%= @content.author ? @content.author.name : "anonyme" %>, <%= format_time(@content.updated_on) %> </em><br />
<%=h @content.comments %> <%=h @content.comments %>
+7 -5
View File
@@ -562,9 +562,9 @@ bg:
text_project_destroy_confirmation: Сигурни ли сте, че искате да изтриете проекта и данните в него? text_project_destroy_confirmation: Сигурни ли сте, че искате да изтриете проекта и данните в него?
text_workflow_edit: Изберете роля и тракер за да редактирате работния процес text_workflow_edit: Изберете роля и тракер за да редактирате работния процес
text_are_you_sure: Сигурни ли сте? text_are_you_sure: Сигурни ли сте?
text_tip_task_begin_day: задача започваща този ден text_tip_issue_begin_day: задача започваща този ден
text_tip_task_end_day: задача завършваща този ден text_tip_issue_end_day: задача завършваща този ден
text_tip_task_begin_end_day: задача започваща и завършваща този ден text_tip_issue_begin_end_day: задача започваща и завършваща този ден
text_project_identifier_info: 'Позволени са малки букви (a-z), цифри и тирета.<br />Невъзможна промяна след запис.' text_project_identifier_info: 'Позволени са малки букви (a-z), цифри и тирета.<br />Невъзможна промяна след запис.'
text_caracters_maximum: "До {{count}} символа." text_caracters_maximum: "До {{count}} символа."
text_length_between: "От {{min}} до {{max}} символа." text_length_between: "От {{min}} до {{max}} символа."
@@ -622,7 +622,6 @@ bg:
text_user_mail_option: "За неизбраните проекти, ще получавате известия само за наблюдавани дейности или в които участвате (т.е. автор или назначени на мен)." text_user_mail_option: "За неизбраните проекти, ще получавате известия само за наблюдавани дейности или в които участвате (т.е. автор или назначени на мен)."
label_user_mail_option_selected: "За всички събития само в избраните проекти..." label_user_mail_option_selected: "За всички събития само в избраните проекти..."
label_user_mail_option_all: "За всяко събитие в проектите, в които участвам" label_user_mail_option_all: "За всяко събитие в проектите, в които участвам"
label_user_mail_option_none: "Само за наблюдавани или в които участвам (автор или назначени на мен)"
setting_emails_footer: Подтекст за e-mail setting_emails_footer: Подтекст за e-mail
label_float: Дробно label_float: Дробно
button_copy: Копиране button_copy: Копиране
@@ -912,4 +911,7 @@ bg:
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_search_titles_only: Pretraži samo naslove
label_user_mail_option_all: "Za bilo koji događaj na svim mojim projektima" label_user_mail_option_all: "Za bilo koji događaj na svim mojim projektima"
label_user_mail_option_selected: "Za bilo koji događaj na odabranim projektima..." label_user_mail_option_selected: "Za bilo koji događaj na odabranim projektima..."
label_user_mail_option_none: "Samo za stvari koje ja gledam ili sam u njih uključen"
label_user_mail_no_self_notified: "Ne želim notifikaciju za promjene koje sam ja napravio" label_user_mail_no_self_notified: "Ne želim notifikaciju za promjene koje sam ja napravio"
label_registration_activation_by_email: aktivacija korisničkog računa email-om label_registration_activation_by_email: aktivacija korisničkog računa email-om
label_registration_manual_activation: ručna aktivacija korisničkog računa label_registration_manual_activation: ručna aktivacija korisničkog računa
@@ -750,9 +749,9 @@ bs:
text_subprojects_destroy_warning: "Podprojekt(i): {{value}} će takođe biti izbrisani." 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_workflow_edit: Odaberite ulogu i područje aktivnosti za ispravku toka promjena na aktivnosti
text_are_you_sure: Da li ste sigurni ? text_are_you_sure: Da li ste sigurni ?
text_tip_task_begin_day: zadatak počinje danas text_tip_issue_begin_day: zadatak počinje danas
text_tip_task_end_day: zadatak završava danas text_tip_issue_end_day: zadatak završava danas
text_tip_task_begin_end_day: zadatak započinje i 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_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_maximum: "maksimum {{count}} karaktera."
text_caracters_minimum: "Dužina mora biti najmanje {{count}} znakova." 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}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_search_titles_only: Cerca només en els títols
label_user_mail_option_all: "Per qualsevol esdeveniment en tots els meus projectes" label_user_mail_option_all: "Per qualsevol esdeveniment en tots els meus projectes"
label_user_mail_option_selected: "Per qualsevol esdeveniment en els projectes seleccionats..." label_user_mail_option_selected: "Per qualsevol esdeveniment en els projectes seleccionats..."
label_user_mail_option_none: "Només per les coses que vigilo o hi estic implicat"
label_user_mail_no_self_notified: "No vull ser notificat pels canvis que faig jo mateix" label_user_mail_no_self_notified: "No vull ser notificat pels canvis que faig jo mateix"
label_registration_activation_by_email: activació del compte per correu electrònic label_registration_activation_by_email: activació del compte per correu electrònic
label_registration_manual_activation: activació del compte manual label_registration_manual_activation: activació del compte manual
@@ -842,9 +841,9 @@ ca:
text_journal_set_to: "{{label}} s'ha establert a {{value}}" text_journal_set_to: "{{label}} s'ha establert a {{value}}"
text_journal_deleted: "{{label}} s'ha suprimit ({{old}})" text_journal_deleted: "{{label}} s'ha suprimit ({{old}})"
text_journal_added: "S'ha afegit {{label}} {{value}}" text_journal_added: "S'ha afegit {{label}} {{value}}"
text_tip_task_begin_day: "tasca que s'inicia aquest dia" text_tip_issue_begin_day: "tasca que s'inicia aquest dia"
text_tip_task_end_day: tasca que finalitza aquest dia text_tip_issue_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_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_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_maximum: "{{count}} caràcters com a màxim."
text_caracters_minimum: "Com a mínim ha de tenir {{count}} caràcters." 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_doc_categories: Categories del document
enumeration_activities: Activitats (seguidor de temps) enumeration_activities: Activitats (seguidor de temps)
enumeration_system_activity: Activitat del sistema enumeration_system_activity: Activitat del sistema
field_member_of_group: Member of Group field_member_of_group: Member of Group
field_assigned_to_role: Member of Role field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_search_titles_only: Vyhledávat pouze v názvech
label_user_mail_option_all: "Pro všechny události všech mých projektů" label_user_mail_option_all: "Pro všechny události všech mých projektů"
label_user_mail_option_selected: "Pro všechny události vybraných projektů..." label_user_mail_option_selected: "Pro všechny události vybraných projektů..."
label_user_mail_option_none: "Pouze pro události které sleduji nebo které se mne týkají"
label_user_mail_no_self_notified: "Nezasílat informace o mnou vytvořených změnách" label_user_mail_no_self_notified: "Nezasílat informace o mnou vytvořených změnách"
label_registration_activation_by_email: aktivace účtu emailem label_registration_activation_by_email: aktivace účtu emailem
label_registration_manual_activation: manuální aktivace účtu label_registration_manual_activation: manuální aktivace účtu
@@ -655,9 +654,9 @@ cs:
text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ? text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ?
text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce
text_are_you_sure: Jste si jisti? text_are_you_sure: Jste si jisti?
text_tip_task_begin_day: úkol začíná v tento den text_tip_issue_begin_day: úkol začíná v tento den
text_tip_task_end_day: úkol končí v tento den text_tip_issue_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_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_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_maximum: "{{count}} znaků maximálně."
text_caracters_minimum: "Musí být alespoň {{count}} znaků dlouhé." text_caracters_minimum: "Musí být alespoň {{count}} znaků dlouhé."
@@ -918,3 +917,7 @@ cs:
button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: {{page_title}}" button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: {{page_title}}"
text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů? text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
field_text: Textové pole field_text: Textové pole
label_user_mail_option_only_owner: Only for things I am the owner of
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_search_titles_only: Søg kun i titler
label_user_mail_option_all: "For alle hændelser på mine projekter" label_user_mail_option_all: "For alle hændelser på mine projekter"
label_user_mail_option_selected: "For alle hændelser på de valgte projekter..." label_user_mail_option_selected: "For alle hændelser på de valgte projekter..."
label_user_mail_option_none: "Kun for ting jeg overvåger eller jeg er involveret i"
label_user_mail_no_self_notified: "Jeg ønsker ikke besked om ændring foretaget af mig selv" label_user_mail_no_self_notified: "Jeg ønsker ikke besked om ændring foretaget af mig selv"
label_registration_activation_by_email: kontoaktivering på email label_registration_activation_by_email: kontoaktivering på email
label_registration_manual_activation: manuel kontoaktivering label_registration_manual_activation: manuel kontoaktivering
@@ -657,9 +656,9 @@ da:
text_project_destroy_confirmation: Er du sikker på at du vil slette dette projekt og alle relaterede data? 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_workflow_edit: Vælg en rolle samt en type, for at redigere arbejdsgangen
text_are_you_sure: Er du sikker? text_are_you_sure: Er du sikker?
text_tip_task_begin_day: opgaven begynder denne dag text_tip_issue_begin_day: opgaven begynder denne dag
text_tip_task_end_day: opaven slutter denne dag text_tip_issue_end_day: opaven slutter denne dag
text_tip_task_begin_end_day: opgaven begynder og 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_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_maximum: "max {{count}} karakterer."
text_caracters_minimum: "Skal være mindst {{count}} karakterer lang." 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}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_search_titles_only: Nur Titel durchsuchen
label_user_mail_option_all: "Für alle Ereignisse in all meinen Projekten" label_user_mail_option_all: "Für alle Ereignisse in all meinen Projekten"
label_user_mail_option_selected: "Für alle Ereignisse in den ausgewählten Projekten..." label_user_mail_option_selected: "Für alle Ereignisse in den ausgewählten Projekten..."
label_user_mail_option_none: "Nur für Dinge, die ich beobachte oder an denen ich beteiligt bin"
label_user_mail_no_self_notified: "Ich möchte nicht über Änderungen benachrichtigt werden, die ich selbst durchführe." label_user_mail_no_self_notified: "Ich möchte nicht über Änderungen benachrichtigt werden, die ich selbst durchführe."
label_registration_activation_by_email: Kontoaktivierung durch E-Mail label_registration_activation_by_email: Kontoaktivierung durch E-Mail
label_registration_manual_activation: Manuelle Kontoaktivierung label_registration_manual_activation: Manuelle Kontoaktivierung
@@ -800,9 +799,10 @@ de:
button_uncheck_all: Alles abwählen button_uncheck_all: Alles abwählen
button_delete: Löschen button_delete: Löschen
button_create: Anlegen button_create: Anlegen
button_create_and_continue: Anlegen + nächstes Ticket button_create_and_continue: Anlegen und weiter
button_test: Testen button_test: Testen
button_edit: Bearbeiten button_edit: Bearbeiten
button_edit_associated_wikipage: "Zugehörige Wikiseite bearbeiten: {{page_title}}"
button_add: Hinzufügen button_add: Hinzufügen
button_change: Wechseln button_change: Wechseln
button_apply: Anwenden button_apply: Anwenden
@@ -858,9 +858,9 @@ de:
text_journal_set_to: "{{label}} wurde auf {{value}} gesetzt" text_journal_set_to: "{{label}} wurde auf {{value}} gesetzt"
text_journal_deleted: "{{label}} {{old}} wurde gelöscht" text_journal_deleted: "{{label}} {{old}} wurde gelöscht"
text_journal_added: "{{label}} {{value}} wurde hinzugefügt" text_journal_added: "{{label}} {{value}} wurde hinzugefügt"
text_tip_task_begin_day: Aufgabe, die an diesem Tag beginnt text_tip_issue_begin_day: Aufgabe, die an diesem Tag beginnt
text_tip_task_end_day: Aufgabe, die an diesem Tag endet text_tip_issue_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_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_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_maximum: "Max. {{count}} Zeichen."
text_caracters_minimum: "Muss mindestens {{count}} Zeichen lang sein." text_caracters_minimum: "Muss mindestens {{count}} Zeichen lang sein."
@@ -936,4 +936,7 @@ de:
field_assigned_to_role: Member of Role field_assigned_to_role: Member of Role
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_search_titles_only: Αναζήτηση τίτλων μόνο
label_user_mail_option_all: "Για όλες τις εξελίξεις σε όλα τα έργα μου" label_user_mail_option_all: "Για όλες τις εξελίξεις σε όλα τα έργα μου"
label_user_mail_option_selected: "Για όλες τις εξελίξεις μόνο στα επιλεγμένα έργα..." label_user_mail_option_selected: "Για όλες τις εξελίξεις μόνο στα επιλεγμένα έργα..."
label_user_mail_option_none: "Μόνο για πράγματα που παρακολουθώ ή συμμετέχω ενεργά"
label_user_mail_no_self_notified: "Δεν θέλω να ειδοποιούμαι για τις δικές μου αλλαγές" label_user_mail_no_self_notified: "Δεν θέλω να ειδοποιούμαι για τις δικές μου αλλαγές"
label_registration_activation_by_email: ενεργοποίηση λογαριασμού με email label_registration_activation_by_email: ενεργοποίηση λογαριασμού με email
label_registration_manual_activation: χειροκίνητη ενεργοποίηση λογαριασμού label_registration_manual_activation: χειροκίνητη ενεργοποίηση λογαριασμού
@@ -761,9 +760,9 @@ el:
text_subprojects_destroy_warning: "Επίσης το(α) επιμέρους έργο(α): {{value}} θα διαγραφούν." text_subprojects_destroy_warning: "Επίσης το(α) επιμέρους έργο(α): {{value}} θα διαγραφούν."
text_workflow_edit: Επιλέξτε ένα ρόλο και έναν ανιχνευτή για να επεξεργαστείτε τη ροή εργασίας text_workflow_edit: Επιλέξτε ένα ρόλο και έναν ανιχνευτή για να επεξεργαστείτε τη ροή εργασίας
text_are_you_sure: Είστε σίγουρος ; text_are_you_sure: Είστε σίγουρος ;
text_tip_task_begin_day: καθήκοντα που ξεκινάνε σήμερα text_tip_issue_begin_day: καθήκοντα που ξεκινάνε σήμερα
text_tip_task_end_day: καθήκοντα που τελειώνουν σήμερα text_tip_issue_end_day: καθήκοντα που τελειώνουν σήμερα
text_tip_task_begin_end_day: καθήκοντα που ξεκινάνε και τελειώνουν σήμερα text_tip_issue_begin_end_day: καθήκοντα που ξεκινάνε και τελειώνουν σήμερα
text_project_identifier_info: 'Επιτρέπονται μόνο μικρά πεζά γράμματα (a-z), αριθμοί και παύλες. <br /> Μετά την αποθήκευση, το αναγνωριστικό δεν μπορεί να αλλάξει.' text_project_identifier_info: 'Επιτρέπονται μόνο μικρά πεζά γράμματα (a-z), αριθμοί και παύλες. <br /> Μετά την αποθήκευση, το αναγνωριστικό δεν μπορεί να αλλάξει.'
text_caracters_maximum: "μέγιστος αριθμός {{count}} χαρακτήρες." text_caracters_maximum: "μέγιστος αριθμός {{count}} χαρακτήρες."
text_caracters_minimum: "Πρέπει να περιέχει τουλάχιστον {{count}} χαρακτήρες." text_caracters_minimum: "Πρέπει να περιέχει τουλάχιστον {{count}} χαρακτήρες."
@@ -918,4 +917,7 @@ el:
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_tracker: Tracker
field_subject: Subject field_subject: Subject
field_due_date: Due date field_due_date: Due date
field_assigned_to: Assigned to field_assigned_to: Assignee
field_priority: Priority field_priority: Priority
field_fixed_version: Target version field_fixed_version: Target version
field_user: User field_user: User
@@ -711,7 +711,7 @@ en-GB:
label_search_titles_only: Search titles only label_search_titles_only: Search titles only
label_user_mail_option_all: "For any event on all my projects" 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_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_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_activation_by_email: account activation by email
label_registration_manual_activation: manual account activation label_registration_manual_activation: manual account activation
@@ -825,9 +825,9 @@ en-GB:
text_journal_set_to: "{{label}} set to {{value}}" text_journal_set_to: "{{label}} set to {{value}}"
text_journal_deleted: "{{label}} deleted ({{old}})" text_journal_deleted: "{{label}} deleted ({{old}})"
text_journal_added: "{{label}} {{value}} added" text_journal_added: "{{label}} {{value}} added"
text_tip_task_begin_day: task beginning this day text_tip_issue_begin_day: task beginning this day
text_tip_task_end_day: task ending this day text_tip_issue_end_day: task ending this day
text_tip_task_begin_end_day: task beginning and 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_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_maximum: "{{count}} characters maximum."
text_caracters_minimum: "Must be at least {{count}} characters long." 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}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_tracker: Tracker
field_subject: Subject field_subject: Subject
field_due_date: Due date field_due_date: Due date
field_assigned_to: Assigned to field_assigned_to: Assignee
field_priority: Priority field_priority: Priority
field_fixed_version: Target version field_fixed_version: Target version
field_user: User field_user: User
@@ -350,6 +350,7 @@ en:
setting_start_of_week: Start calendars on setting_start_of_week: Start calendars on
setting_rest_api_enabled: Enable REST web service setting_rest_api_enabled: Enable REST web service
setting_cache_formatted_text: Cache formatted text setting_cache_formatted_text: Cache formatted text
setting_default_notification_option: Default notification option
permission_add_project: Create project permission_add_project: Create project
permission_add_subprojects: Create subprojects permission_add_subprojects: Create subprojects
@@ -725,7 +726,10 @@ en:
label_search_titles_only: Search titles only label_search_titles_only: Search titles only
label_user_mail_option_all: "For any event on all my projects" 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_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_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_activation_by_email: account activation by email
label_registration_manual_activation: manual account activation label_registration_manual_activation: manual account activation
@@ -787,6 +791,7 @@ en:
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
button_test: Test button_test: Test
button_edit: Edit button_edit: Edit
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
button_add: Add button_add: Add
button_change: Change button_change: Change
button_apply: Apply button_apply: Apply
@@ -843,9 +848,9 @@ en:
text_journal_set_to: "{{label}} set to {{value}}" text_journal_set_to: "{{label}} set to {{value}}"
text_journal_deleted: "{{label}} deleted ({{old}})" text_journal_deleted: "{{label}} deleted ({{old}})"
text_journal_added: "{{label}} {{value}} added" text_journal_added: "{{label}} {{value}} added"
text_tip_task_begin_day: task beginning this day text_tip_issue_begin_day: issue beginning this day
text_tip_task_end_day: task ending this day text_tip_issue_end_day: issue ending this day
text_tip_task_begin_end_day: task beginning and 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_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_maximum: "{{count}} characters maximum."
text_caracters_minimum: "Must be at least {{count}} characters long." 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_activity: "Actividad de {{value}}"
label_user_mail_no_self_notified: "No quiero ser avisado de cambios hechos por mí" 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_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_mail_option_selected: "Para cualquier evento de los proyectos seleccionados..."
label_user_new: Nuevo usuario label_user_new: Nuevo usuario
label_user_plural: Usuarios label_user_plural: Usuarios
@@ -821,9 +820,9 @@ es:
text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:' text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:'
text_status_changed_by_changeset: "Aplicado en los cambios {{value}}" text_status_changed_by_changeset: "Aplicado en los cambios {{value}}"
text_subprojects_destroy_warning: "Los proyectos secundarios: {{value}} también se eliminarán" 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_issue_begin_day: tarea que comienza este día
text_tip_task_begin_end_day: tarea que comienza y termina este día text_tip_issue_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_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_tracker_no_workflow: No hay ningún flujo de trabajo definido para este tipo de petición
text_unallowed_characters: Caracteres no permitidos 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)." 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}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_search_titles_only: Izenburuetan bakarrik bilatu
label_user_mail_option_all: "Nire proiektu guztietako gertakari guztientzat" label_user_mail_option_all: "Nire proiektu guztietako gertakari guztientzat"
label_user_mail_option_selected: "Hautatutako proiektuetako edozein gertakarientzat..." 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_user_mail_no_self_notified: "Ez dut nik egiten ditudan aldeketen jakinarazpenik jaso nahi"
label_registration_activation_by_email: kontuak epostaz gaitu label_registration_activation_by_email: kontuak epostaz gaitu
label_registration_manual_activation: kontuak eskuz 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_set_to: "{{label}}-k {{value}} balioa hartu du"
text_journal_deleted: "{{label}} ezabatuta ({{old}})" text_journal_deleted: "{{label}} ezabatuta ({{old}})"
text_journal_added: "{{label}} {{value}} gehituta" text_journal_added: "{{label}} {{value}} gehituta"
text_tip_task_begin_day: gaur hasten diren atazak text_tip_issue_begin_day: gaur hasten diren atazak
text_tip_task_end_day: gaur bukatzen diren atazak text_tip_issue_end_day: gaur bukatzen diren atazak
text_tip_task_begin_end_day: gaur hasi eta 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_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_maximum: "{{count}} karaktere gehienez."
text_caracters_minimum: "Gutxienez {{count}} karaktereetako luzerakoa izan behar du." 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}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_search_titles_only: Hae vain otsikot
label_user_mail_option_all: "Kaikista tapahtumista kaikissa projekteistani" label_user_mail_option_all: "Kaikista tapahtumista kaikissa projekteistani"
label_user_mail_option_selected: "Kaikista tapahtumista vain valitsemistani projekteista..." 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_user_mail_no_self_notified: "En halua muistutusta muutoksista joita itse teen"
label_registration_activation_by_email: tilin aktivointi sähköpostitse label_registration_activation_by_email: tilin aktivointi sähköpostitse
label_registration_manual_activation: tilin aktivointi käsin 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_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_workflow_edit: Valitse rooli ja tapahtuma muokataksesi työnkulkua
text_are_you_sure: Oletko varma? text_are_you_sure: Oletko varma?
text_tip_task_begin_day: tehtävä joka alkaa tänä päivänä text_tip_issue_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_issue_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_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_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_maximum: "{{count}} merkkiä enintään."
text_caracters_minimum: "Täytyy olla vähintään {{count}} merkkiä pitkä." 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}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_wiki: Wiki
project_module_repository: Dépôt de sources project_module_repository: Dépôt de sources
project_module_boards: Forums de discussion project_module_boards: Forums de discussion
project_module_gantt: Gantt
project_module_calendar: Calendar
label_user: Utilisateur label_user: Utilisateur
label_user_plural: Utilisateurs label_user_plural: Utilisateurs
@@ -720,7 +718,6 @@ fr:
label_search_titles_only: Uniquement dans les titres 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_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_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_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_activation_by_email: activation du compte par email
label_registration_manual_activation: activation manuelle du compte 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_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_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow
text_are_you_sure: Êtes-vous sûr ? text_are_you_sure: Êtes-vous sûr ?
text_tip_task_begin_day: tâche commençant ce jour text_tip_issue_begin_day: tâche commençant ce jour
text_tip_task_end_day: tâche finissant ce jour text_tip_issue_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_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_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_maximum: "{{count}} caractères maximum."
text_caracters_minimum: "{{count}} caractères minimum." text_caracters_minimum: "{{count}} caractères minimum."
@@ -919,11 +916,11 @@ fr:
enumeration_system_activity: Activité système enumeration_system_activity: Activité système
label_board_sticky: Sticky label_board_sticky: Sticky
label_board_locked: Verrouillé label_board_locked: Verrouillé
error_unable_delete_issue_status: Unable to delete issue status error_unable_delete_issue_status: Impossible de supprimer le statut de demande
error_can_not_delete_custom_field: Unable to delete custom field error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisé
error_unable_to_connect: Unable to connect ({{value}}) error_unable_to_connect: Connexion impossible ({{value}})
error_can_not_remove_role: This role is in use and can not be deleted. error_can_not_remove_role: Ce rôle est utilisé et ne peut pas être supprimé.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted. error_can_not_delete_tracker: Ce tracker contient des demandes et ne peut pas être supprimé.
field_principal: Principal field_principal: Principal
notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: {{errors}}." notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: {{errors}}."
text_zoom_out: Zoom arrière text_zoom_out: Zoom arrière
@@ -931,9 +928,14 @@ fr:
notice_unable_delete_time_entry: Impossible de supprimer le temps passé. notice_unable_delete_time_entry: Impossible de supprimer le temps passé.
label_overall_spent_time: Temps passé global label_overall_spent_time: Temps passé global
field_time_entries: Log time field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
field_member_of_group: Member of Group field_member_of_group: Member of Group
field_assigned_to_role: Member of Role field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Modifier la page de Wiki associée: {{page_title}}" 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? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_activity: "Actividade de {{value}}"
label_user_mail_no_self_notified: "Non quero ser avisado de cambios feitos por min" 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_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_mail_option_selected: "Para calquera evento dos proxectos seleccionados..."
label_user_new: Novo usuario label_user_new: Novo usuario
label_user_plural: Usuarios label_user_plural: Usuarios
@@ -798,9 +797,9 @@ gl:
text_select_project_modules: 'Seleccione os módulos a activar para este proxecto:' text_select_project_modules: 'Seleccione os módulos a activar para este proxecto:'
text_status_changed_by_changeset: "Aplicado nos cambios {{value}}" text_status_changed_by_changeset: "Aplicado nos cambios {{value}}"
text_subprojects_destroy_warning: "Os proxectos secundarios: {{value}} tamén se eliminarán" 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_issue_begin_day: tarefa que comeza este día
text_tip_task_begin_end_day: tarefa que comeza e remata este día text_tip_issue_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_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_tracker_no_workflow: Non hai ningún fluxo de traballo definido para este tipo de petición
text_unallowed_characters: Caracteres non permitidos 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)." 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}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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: "לא נכלל ברשימה" inclusion: "לא נכלל ברשימה"
exclusion: "לא זמין" exclusion: "לא זמין"
invalid: "לא ולידי" invalid: "לא ולידי"
confirmation: "לא תואם לאישורו" confirmation: "לא תואם לאישור"
accepted: "חייב באישור" accepted: "חייב באישור"
empty: "חייב להכלל" empty: "חייב להכלל"
blank: "חייב להכלל" blank: "חייב להכלל"
@@ -122,8 +122,8 @@ he:
even: "חייב להיות זוגי" even: "חייב להיות זוגי"
greater_than_start_date: "חייב להיות מאוחר יותר מתאריך ההתחלה" greater_than_start_date: "חייב להיות מאוחר יותר מתאריך ההתחלה"
not_same_project: "לא שייך לאותו הפרויקט" not_same_project: "לא שייך לאותו הפרויקט"
circular_dependency: "הקשר הזה יצור תלות מעגלית" circular_dependency: "קשר זה יצור תלות מעגלית"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" cant_link_an_issue_with_a_descendant: "לא ניתן לקשר נושא לתת־משימה שלו"
actionview_instancetag_blank_option: בחר בבקשה actionview_instancetag_blank_option: בחר בבקשה
@@ -144,7 +144,7 @@ he:
notice_account_wrong_password: סיסמה שגויה notice_account_wrong_password: סיסמה שגויה
notice_account_register_done: החשבון נוצר בהצלחה. להפעלת החשבון לחץ על הקישור שנשלח לדוא"ל שלך. notice_account_register_done: החשבון נוצר בהצלחה. להפעלת החשבון לחץ על הקישור שנשלח לדוא"ל שלך.
notice_account_unknown_email: משתמש לא מוכר. notice_account_unknown_email: משתמש לא מוכר.
notice_can_t_change_password: החשבון הזה משתמש במקור אימות חיצוני. שינוי סיסמה הינו בילתי אפשר notice_can_t_change_password: החשבון הזה משתמש במקור הזדהות חיצוני. שינוי סיסמה הינו בילתי אפשר
notice_account_lost_email_sent: דוא"ל עם הוראות לבחירת סיסמה חדשה נשלח אליך. notice_account_lost_email_sent: דוא"ל עם הוראות לבחירת סיסמה חדשה נשלח אליך.
notice_account_activated: חשבונך הופעל. אתה יכול להתחבר כעת. notice_account_activated: חשבונך הופעל. אתה יכול להתחבר כעת.
notice_successful_create: יצירה מוצלחת. notice_successful_create: יצירה מוצלחת.
@@ -155,7 +155,7 @@ he:
notice_locking_conflict: המידע עודכן על ידי משתמש אחר. notice_locking_conflict: המידע עודכן על ידי משתמש אחר.
notice_not_authorized: אינך מורשה לראות דף זה. notice_not_authorized: אינך מורשה לראות דף זה.
notice_email_sent: "דואל נשלח לכתובת {{value}}" notice_email_sent: "דואל נשלח לכתובת {{value}}"
notice_email_error: "ארעה שגיאה בעט שליחת הדואל ({{value}})" notice_email_error: "ארעה שגיאה בעת שליחת הדואל ({{value}})"
notice_feeds_access_key_reseted: מפתח ה־RSS שלך אופס. notice_feeds_access_key_reseted: מפתח ה־RSS שלך אופס.
notice_api_access_key_reseted: מפתח הגישה שלך ל־API אופס. notice_api_access_key_reseted: מפתח הגישה שלך ל־API אופס.
notice_failed_to_save_issues: "נכשרת בשמירת {{count}} נושא\ים ב {{total}} נבחרו: {{ids}}." notice_failed_to_save_issues: "נכשרת בשמירת {{count}} נושא\ים ב {{total}} נבחרו: {{ids}}."
@@ -168,7 +168,7 @@ he:
notice_issue_done_ratios_updated: אחוזי התקדמות לנושא עודכנו. notice_issue_done_ratios_updated: אחוזי התקדמות לנושא עודכנו.
error_can_t_load_default_data: "אפשרויות ברירת המחדל לא הצליחו להיטען: {{value}}" error_can_t_load_default_data: "אפשרויות ברירת המחדל לא הצליחו להיטען: {{value}}"
error_scm_not_found: כניסה ו\או גירסה אינם קיימים במאגר. error_scm_not_found: כניסה ו\או מהדורה אינם קיימים במאגר.
error_scm_command_failed: "ארעה שגיאה בעת ניסון גישה למאגר: {{value}}" error_scm_command_failed: "ארעה שגיאה בעת ניסון גישה למאגר: {{value}}"
error_scm_annotate: "הכניסה לא קיימת או שלא ניתן לתאר אותה." error_scm_annotate: "הכניסה לא קיימת או שלא ניתן לתאר אותה."
error_issue_not_found_in_project: 'הנושאים לא נמצאו או אינם שיכים לפרויקט' error_issue_not_found_in_project: 'הנושאים לא נמצאו או אינם שיכים לפרויקט'
@@ -194,7 +194,7 @@ he:
mail_body_account_information: פרטי החשבון שלך mail_body_account_information: פרטי החשבון שלך
mail_subject_account_activation_request: "בקשת הפעלה לחשבון {{value}}" mail_subject_account_activation_request: "בקשת הפעלה לחשבון {{value}}"
mail_body_account_activation_request: "משתמש חדש ({{value}}) נרשם. החשבון שלו מחכה לאישור שלך:" mail_body_account_activation_request: "משתמש חדש ({{value}}) נרשם. החשבון שלו מחכה לאישור שלך:"
mail_subject_reminder: "{{count}} נושאים מיעדים להגשה בימים הקרובים ({{days}})" mail_subject_reminder: "{{count}} נושאים מיועדים להגשה בימים הקרובים ({{days}})"
mail_body_reminder: "{{count}} נושאים שמיועדים אליך מיועדים להגשה בתוך {{days}} ימים:" mail_body_reminder: "{{count}} נושאים שמיועדים אליך מיועדים להגשה בתוך {{days}} ימים:"
mail_subject_wiki_content_added: "דף ה־wiki ‏'{{page}}' נוסף" mail_subject_wiki_content_added: "דף ה־wiki ‏'{{page}}' נוסף"
mail_body_wiki_content_added: דף ה־wiki ‏'{{page}}' נוסף ע"י {{author}}. mail_body_wiki_content_added: דף ה־wiki ‏'{{page}}' נוסף ע"י {{author}}.
@@ -248,7 +248,7 @@ he:
field_login: שם משתמש field_login: שם משתמש
field_mail_notification: הודעות דוא"ל field_mail_notification: הודעות דוא"ל
field_admin: ניהול field_admin: ניהול
field_last_login_on: חיבור אחרון field_last_login_on: התחברות אחרונה
field_language: שפה field_language: שפה
field_effective_date: תאריך field_effective_date: תאריך
field_password: סיסמה field_password: סיסמה
@@ -267,7 +267,7 @@ he:
field_onthefly: יצירת משתמשים זריזה field_onthefly: יצירת משתמשים זריזה
field_start_date: תאריך התחלה field_start_date: תאריך התחלה
field_done_ratio: % גמור field_done_ratio: % גמור
field_auth_source: מצב אימות field_auth_source: מקור הזדהות
field_hide_mail: החבא את כתובת הדוא"ל שלי field_hide_mail: החבא את כתובת הדוא"ל שלי
field_comments: הערות field_comments: הערות
field_url: URL field_url: URL
@@ -284,6 +284,7 @@ he:
field_redirect_existing_links: העבר קישורים קיימים field_redirect_existing_links: העבר קישורים קיימים
field_estimated_hours: זמן משוער field_estimated_hours: זמן משוער
field_column_names: עמודות field_column_names: עמודות
field_time_entries: רישום זמנים
field_time_zone: איזור זמן field_time_zone: איזור זמן
field_searchable: ניתן לחיפוש field_searchable: ניתן לחיפוש
field_default_value: ערך ברירת מחדל field_default_value: ערך ברירת מחדל
@@ -296,13 +297,16 @@ he:
field_group_by: קבץ את התוצאות לפי field_group_by: קבץ את התוצאות לפי
field_sharing: שיתוף field_sharing: שיתוף
field_parent_issue: משימת אב field_parent_issue: משימת אב
field_member_of_group: חבר בקבוצה
field_assigned_to_role: בעל תפקיד
field_text: שדה טקסט
setting_app_title: כותרת ישום setting_app_title: כותרת ישום
setting_app_subtitle: תת־כותרת ישום setting_app_subtitle: תת־כותרת ישום
setting_welcome_text: טקסט "ברוך הבא" setting_welcome_text: טקסט "ברוך הבא"
setting_default_language: שפת ברירת מחדל setting_default_language: שפת ברירת מחדל
setting_login_required: דרוש אימות setting_login_required: דרושה הזדהות
setting_self_registration: אפשר הרשמות עצמית setting_self_registration: אפשר הרשמה עצמית
setting_attachment_max_size: גודל דבוקה מקסימאלי setting_attachment_max_size: גודל דבוקה מקסימאלי
setting_issues_export_limit: גבול יצוא נושאים setting_issues_export_limit: גבול יצוא נושאים
setting_mail_from: כתובת שליחת דוא"ל setting_mail_from: כתובת שליחת דוא"ל
@@ -310,14 +314,14 @@ he:
setting_plain_text_mail: טקסט פשוט בלבד (ללא HTML) setting_plain_text_mail: טקסט פשוט בלבד (ללא HTML)
setting_host_name: שם שרת setting_host_name: שם שרת
setting_text_formatting: עיצוב טקסט setting_text_formatting: עיצוב טקסט
setting_wiki_compression: כיווץ היסטורית WIKI setting_wiki_compression: כיווץ היסטורית wiki
setting_feeds_limit: גבול תוכן הזנות setting_feeds_limit: גבול תוכן הזנות
setting_default_projects_public: פרויקטים חדשים הינם פומביים כברירת מחדל setting_default_projects_public: פרויקטים חדשים הינם פומביים כברירת מחדל
setting_autofetch_changesets: משיכה אוטומטית של עידכונים setting_autofetch_changesets: משיכה אוטומטית של שינויים
setting_sys_api_enabled: אפשר שירות רשת לניהול המאגר setting_sys_api_enabled: אפשר שירות רשת לניהול המאגר
setting_commit_ref_keywords: מילות מפתח מקשרות setting_commit_ref_keywords: מילות מפתח מקשרות
setting_commit_fix_keywords: מילות מפתח מתקנות setting_commit_fix_keywords: מילות מפתח מתקנות
setting_autologin: חיבור אוטומטי setting_autologin: התחברות אוטומטית
setting_date_format: פורמט תאריך setting_date_format: פורמט תאריך
setting_time_format: פורמט זמן setting_time_format: פורמט זמן
setting_cross_project_issue_relations: הרשה קישור נושאים בין פרויקטים setting_cross_project_issue_relations: הרשה קישור נושאים בין פרויקטים
@@ -339,17 +343,18 @@ he:
setting_gravatar_default: תמונת Gravatar ברירת מחדל setting_gravatar_default: תמונת Gravatar ברירת מחדל
setting_diff_max_lines_displayed: מספר מירבי של שורות בתצוגת שינויים setting_diff_max_lines_displayed: מספר מירבי של שורות בתצוגת שינויים
setting_file_max_size_displayed: גודל מירבי של מלל המוצג בתוך השורה setting_file_max_size_displayed: גודל מירבי של מלל המוצג בתוך השורה
setting_repository_log_display_limit: מספר מירבי של גירסאות המוצגות ביומן קובץ setting_repository_log_display_limit: מספר מירבי של מהדורות המוצגות ביומן קובץ
setting_openid: אפשר התחברות ורישום באמצעות OpenID setting_openid: אפשר התחברות ורישום באמצעות OpenID
setting_password_min_length: אורך סיסמא מינימאלי setting_password_min_length: אורך סיסמה מינימאלי
setting_new_project_user_role_id: התפקיד שמוגדר למשתמש פשוט אשר יוצר פרויקט setting_new_project_user_role_id: התפקיד שמוגדר למשתמש פשוט אשר יוצר פרויקט
setting_default_projects_modules: מודולים מאופשרים בברירת מחדל עבור פרויקטים חדשים setting_default_projects_modules: מודולים מאופשרים בברירת מחדל עבור פרויקטים חדשים
setting_issue_done_ratio: חשב אחוז התקדמות בנושא עם setting_issue_done_ratio: חשב אחוז התקדמות בנושא עם
setting_issue_done_ratio_issue_field: השתמש בשדה הנושא setting_issue_done_ratio_issue_field: השתמש בשדה הנושא
setting_issue_done_ratio_issue_status: השתמש במצב הנושא setting_issue_done_ratio_issue_status: השתמש במצב הנושא
setting_start_of_week: התחל יומנים לפי setting_start_of_week: השבוע מתחיל ביום
setting_rest_api_enabled: אפשר שירות רשת REST setting_rest_api_enabled: אפשר שירות רשת REST
setting_cache_formatted_text: שמור טקסט מעוצב במטמון setting_cache_formatted_text: שמור טקסט מעוצב במטמון
setting_default_notification_option: אפשרות התראה ברירת־מחדל
permission_add_project: יצירת פרויקט permission_add_project: יצירת פרויקט
permission_add_subprojects: יצירת תתי־פרויקט permission_add_subprojects: יצירת תתי־פרויקט
@@ -376,9 +381,9 @@ he:
permission_add_issue_watchers: הוספת צופים permission_add_issue_watchers: הוספת צופים
permission_delete_issue_watchers: הסרת צופים permission_delete_issue_watchers: הסרת צופים
permission_log_time: תיעוד זמן שהושקע permission_log_time: תיעוד זמן שהושקע
permission_view_time_entries: צפיה בזמן שהושקע permission_view_time_entries: צפיה ברישום זמנים
permission_edit_time_entries: עריכת רישום זמנים permission_edit_time_entries: עריכת רישום זמנים
permission_edit_own_time_entries: עריכת לוג הזמן של עצמו permission_edit_own_time_entries: עריכת רישום הזמנים של עצמו
permission_manage_news: ניהול חדשות permission_manage_news: ניהול חדשות
permission_comment_news: תגובה לחדשות permission_comment_news: תגובה לחדשות
permission_manage_documents: ניהול מסמכים permission_manage_documents: ניהול מסמכים
@@ -395,7 +400,7 @@ he:
permission_protect_wiki_pages: הגנה על כל דפי wiki permission_protect_wiki_pages: הגנה על כל דפי wiki
permission_manage_repository: ניהול מאגר permission_manage_repository: ניהול מאגר
permission_browse_repository: סיור במאגר permission_browse_repository: סיור במאגר
permission_view_changesets: צפיה בקבוצות שינויים permission_view_changesets: צפיה בסדרות שינויים
permission_commit_access: אישור הפקדות permission_commit_access: אישור הפקדות
permission_manage_boards: ניהול לוחות permission_manage_boards: ניהול לוחות
permission_view_messages: צפיה בהודעות permission_view_messages: צפיה בהודעות
@@ -415,6 +420,8 @@ he:
project_module_wiki: Wiki project_module_wiki: Wiki
project_module_repository: מאגר project_module_repository: מאגר
project_module_boards: לוחות project_module_boards: לוחות
project_module_calendar: לוח שנה
project_module_gantt: גאנט
label_user: משתמש label_user: משתמש
label_user_plural: משתמשים label_user_plural: משתמשים
@@ -439,7 +446,7 @@ he:
label_document: מסמך label_document: מסמך
label_document_new: מסמך חדש label_document_new: מסמך חדש
label_document_plural: מסמכים label_document_plural: מסמכים
label_document_added: מוסמך נוסף label_document_added: מסמך נוסף
label_role: תפקיד label_role: תפקיד
label_role_plural: תפקידים label_role_plural: תפקידים
label_role_new: תפקיד חדש label_role_new: תפקיד חדש
@@ -464,7 +471,7 @@ he:
label_enumeration_new: ערך חדש label_enumeration_new: ערך חדש
label_information: מידע label_information: מידע
label_information_plural: מידע label_information_plural: מידע
label_please_login: התחבר בבקשה label_please_login: נא התחבר
label_register: הרשמה label_register: הרשמה
label_login_with_open_id_option: או התחבר באמצעות OpenID label_login_with_open_id_option: או התחבר באמצעות OpenID
label_password_lost: אבדה הסיסמה? label_password_lost: אבדה הסיסמה?
@@ -479,7 +486,7 @@ he:
label_help: עזרה label_help: עזרה
label_reported_issues: נושאים שדווחו label_reported_issues: נושאים שדווחו
label_assigned_to_me_issues: נושאים שהוצבו לי label_assigned_to_me_issues: נושאים שהוצבו לי
label_last_login: חיבור אחרון label_last_login: התחברות אחרונה
label_registered_on: נרשם בתאריך label_registered_on: נרשם בתאריך
label_activity: פעילות label_activity: פעילות
label_overall_activity: פעילות כוללת label_overall_activity: פעילות כוללת
@@ -487,10 +494,10 @@ he:
label_new: חדש label_new: חדש
label_logged_as: מחובר כ label_logged_as: מחובר כ
label_environment: סביבה label_environment: סביבה
label_authentication: אישור label_authentication: הזדהות
label_auth_source: מצב אישור label_auth_source: מקור הזדהות
label_auth_source_new: מצב אישור חדש label_auth_source_new: מקור הזדהות חדש
label_auth_source_plural: מצבי אישור label_auth_source_plural: מקורות הזדהות
label_subproject_plural: תת־פרויקטים label_subproject_plural: תת־פרויקטים
label_subproject_new: תת־פרויקט חדש label_subproject_new: תת־פרויקט חדש
label_and_its_subprojects: "{{value}} וכל תתי־הפרויקטים שלו" label_and_its_subprojects: "{{value}} וכל תתי־הפרויקטים שלו"
@@ -521,7 +528,7 @@ he:
label_news_plural: חדשות label_news_plural: חדשות
label_news_latest: חדשות אחרונות label_news_latest: חדשות אחרונות
label_news_view_all: צפה בכל החדשות label_news_view_all: צפה בכל החדשות
label_news_added: חדשות הוספו label_news_added: חדשות נוספו
label_settings: הגדרות label_settings: הגדרות
label_overview: מבט רחב label_overview: מבט רחב
label_version: גירסה label_version: גירסה
@@ -575,7 +582,7 @@ he:
one: הערה אחת one: הערה אחת
other: "{{count}} הערות" other: "{{count}} הערות"
label_comment_add: הוסף תגובה label_comment_add: הוסף תגובה
label_comment_added: תגובה הוספה label_comment_added: תגובה נוספה
label_comment_delete: מחק תגובות label_comment_delete: מחק תגובות
label_query: שאילתה אישית label_query: שאילתה אישית
label_query_plural: שאילתות אישיות label_query_plural: שאילתות אישיות
@@ -593,7 +600,7 @@ he:
label_all_time: תמיד label_all_time: תמיד
label_yesterday: אתמול label_yesterday: אתמול
label_this_week: השבוע label_this_week: השבוע
label_last_week: שבוע שעבר label_last_week: השבוע שעבר
label_last_n_days: "ב־{{count}} ימים אחרונים" label_last_n_days: "ב־{{count}} ימים אחרונים"
label_this_month: החודש label_this_month: החודש
label_last_month: חודש שעבר label_last_month: חודש שעבר
@@ -612,19 +619,19 @@ he:
label_modification_plural: "{{count}} שינויים" label_modification_plural: "{{count}} שינויים"
label_branch: ענף label_branch: ענף
label_tag: סימון label_tag: סימון
label_revision: גירסה label_revision: מהדורה
label_revision_plural: גירסאות label_revision_plural: מהדורות
label_revision_id: גירסה {{value}} label_revision_id: מהדורה {{value}}
label_associated_revisions: גירסאות קשורות label_associated_revisions: מהדורות קשורות
label_added: נוסף label_added: נוסף
label_modified: שונה label_modified: שונה
label_copied: הועתק label_copied: הועתק
label_renamed: השם שונה label_renamed: השם שונה
label_deleted: נמחק label_deleted: נמחק
label_latest_revision: גירסה אחרונה label_latest_revision: מהדורה אחרונה
label_latest_revision_plural: גירסאות אחרונות label_latest_revision_plural: מהדורות אחרונות
label_view_revisions: צפה בגירסאות label_view_revisions: צפה במהדורות
label_view_all_revisions: צפה בכל הגירסאות label_view_all_revisions: צפה בכל המהדורות
label_max_size: גודל מקסימאלי label_max_size: גודל מקסימאלי
label_sort_highest: הזז לראשית label_sort_highest: הזז לראשית
label_sort_higher: הזז למעלה label_sort_higher: הזז למעלה
@@ -638,10 +645,10 @@ he:
label_result_plural: תוצאות label_result_plural: תוצאות
label_all_words: כל המילים label_all_words: כל המילים
label_wiki: Wiki label_wiki: Wiki
label_wiki_edit: ערוך Wiki label_wiki_edit: ערוך wiki
label_wiki_edit_plural: עריכות Wiki label_wiki_edit_plural: עריכות wiki
label_wiki_page: דף Wiki label_wiki_page: דף Wiki
label_wiki_page_plural: דפי Wiki label_wiki_page_plural: דפי wiki
label_index_by_title: סדר על פי כותרת label_index_by_title: סדר על פי כותרת
label_index_by_date: סדר על פי תאריך label_index_by_date: סדר על פי תאריך
label_current_version: גירסה נוכחית label_current_version: גירסה נוכחית
@@ -694,7 +701,7 @@ he:
label_message_plural: הודעות label_message_plural: הודעות
label_message_last: הודעה אחרונה label_message_last: הודעה אחרונה
label_message_new: הודעה חדשה label_message_new: הודעה חדשה
label_message_posted: הודעה הוספה label_message_posted: הודעה נוספה
label_reply_plural: השבות label_reply_plural: השבות
label_send_information: שלח מידע על חשבון למשתמש label_send_information: שלח מידע על חשבון למשתמש
label_year: שנה label_year: שנה
@@ -703,18 +710,18 @@ he:
label_date_from: מתאריך label_date_from: מתאריך
label_date_to: עד label_date_to: עד
label_language_based: מבוסס שפה label_language_based: מבוסס שפה
label_sort_by: "מין לפי {{value}}" label_sort_by: "מיין לפי {{value}}"
label_send_test_email: שלח דוא"ל בדיקה label_send_test_email: שלח דוא"ל בדיקה
label_feeds_access_key: מפתח גישה ל־RSS label_feeds_access_key: מפתח גישה ל־RSS
label_missing_feeds_access_key: חסר מפתח גישה ל־RSS label_missing_feeds_access_key: חסר מפתח גישה ל־RSS
label_feeds_access_key_created_on: "מפתח הזנת RSS נוצר לפני{{value}}" label_feeds_access_key_created_on: "מפתח הזנת RSS נוצר לפני{{value}}"
label_module_plural: מודולים label_module_plural: מודולים
label_added_time_by: "נוסף על ידי {{author}} לפני {{age}} " label_added_time_by: 'נוסף ע"י {{author}} לפני {{age}}'
label_updated_time_by: 'עודכן ע"י {{author}} לפני {{age}}' label_updated_time_by: 'עודכן ע"י {{author}} לפני {{age}}'
label_updated_time: "עודכן לפני {{value}} " label_updated_time: "עודכן לפני {{value}} "
label_jump_to_a_project: קפוץ לפרויקט... label_jump_to_a_project: קפוץ לפרויקט...
label_file_plural: קבצים label_file_plural: קבצים
label_changeset_plural: אוסף שינוים label_changeset_plural: סדרות שינויים
label_default_columns: עמודת ברירת מחדל label_default_columns: עמודת ברירת מחדל
label_no_change_option: (אין שינוים) label_no_change_option: (אין שינוים)
label_bulk_edit_selected_issues: ערוך את הנושאים המסומנים label_bulk_edit_selected_issues: ערוך את הנושאים המסומנים
@@ -723,7 +730,9 @@ he:
label_search_titles_only: חפש בכותרות בלבד label_search_titles_only: חפש בכותרות בלבד
label_user_mail_option_all: "לכל אירוע בכל הפרויקטים שלי" label_user_mail_option_all: "לכל אירוע בכל הפרויקטים שלי"
label_user_mail_option_selected: "לכל אירוע בפרויקטים שבחרתי בלבד..." 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_user_mail_no_self_notified: "אני לא רוצה שיודיעו לי על שינויים שאני מבצע"
label_registration_activation_by_email: הפעל חשבון באמצעות דוא"ל label_registration_activation_by_email: הפעל חשבון באמצעות דוא"ל
label_registration_manual_activation: הפעלת חשבון ידנית label_registration_manual_activation: הפעלת חשבון ידנית
@@ -735,7 +744,7 @@ he:
label_more: עוד label_more: עוד
label_scm: מערכת ניהול תצורה label_scm: מערכת ניהול תצורה
label_plugins: תוספים label_plugins: תוספים
label_ldap_authentication: אימות LDAP label_ldap_authentication: הזדהות LDAP
label_downloads_abbr: D/L label_downloads_abbr: D/L
label_optional_description: תיאור רשות label_optional_description: תיאור רשות
label_add_another_file: הוסף עוד קובץ label_add_another_file: הוסף עוד קובץ
@@ -752,8 +761,8 @@ he:
label_ascending: בסדר עולה label_ascending: בסדר עולה
label_descending: בסדר יורד label_descending: בסדר יורד
label_date_from_to: 'מתאריך {{start}} ועד תאריך {{end}}' label_date_from_to: 'מתאריך {{start}} ועד תאריך {{end}}'
label_wiki_content_added: הדף נוסף ל־wiki label_wiki_content_added: נוסף דף ל־wiki
label_wiki_content_updated: דף ה־wiki עודכן label_wiki_content_updated: דף wiki עודכן
label_group: קבוצה label_group: קבוצה
label_group_plural: קבוצות label_group_plural: קבוצות
label_group_new: קבוצה חדשה label_group_new: קבוצה חדשה
@@ -785,6 +794,7 @@ he:
button_create_and_continue: צור ופתח חדש button_create_and_continue: צור ופתח חדש
button_test: בדוק button_test: בדוק
button_edit: ערוך button_edit: ערוך
button_edit_associated_wikipage: "ערוך דף wiki מקושר: {{page_title}}"
button_add: הוסף button_add: הוסף
button_change: שנה button_change: שנה
button_apply: החל button_apply: החל
@@ -800,8 +810,8 @@ he:
button_cancel: בטל button_cancel: בטל
button_activate: הפעל button_activate: הפעל
button_sort: מיין button_sort: מיין
button_log_time: זמן לוג button_log_time: רישום זמנים
button_rollback: חזור לגירסה זו button_rollback: חזור למהדורה זו
button_watch: צפה button_watch: צפה
button_unwatch: בטל צפיה button_unwatch: בטל צפיה
button_reply: השב button_reply: השב
@@ -809,7 +819,7 @@ he:
button_unarchive: הוצא מהארכיון button_unarchive: הוצא מהארכיון
button_reset: אפס button_reset: אפס
button_rename: שנה שם button_rename: שנה שם
button_change_password: שנה סיסמא button_change_password: שנה סיסמה
button_copy: העתק button_copy: העתק
button_copy_and_follow: העתק ועקוב button_copy_and_follow: העתק ועקוב
button_annotate: הוסף תיאור מסגרת button_annotate: הוסף תיאור מסגרת
@@ -836,13 +846,14 @@ he:
text_subprojects_destroy_warning: "תת־הפרויקט\ים: {{value}} ימחקו גם כן." text_subprojects_destroy_warning: "תת־הפרויקט\ים: {{value}} ימחקו גם כן."
text_workflow_edit: בחר תפקיד וסיווג כדי לערוך את זרימת העבודה text_workflow_edit: בחר תפקיד וסיווג כדי לערוך את זרימת העבודה
text_are_you_sure: האם אתה בטוח? text_are_you_sure: האם אתה בטוח?
text_are_you_sure_with_children: האם למחוק את הנושא ואת כל בניו?
text_journal_changed: "{{label}} השתנה מ{{old}} ל{{new}}" text_journal_changed: "{{label}} השתנה מ{{old}} ל{{new}}"
text_journal_set_to: "{{label}} נקבע ל{{value}}" text_journal_set_to: "{{label}} נקבע ל{{value}}"
text_journal_deleted: "{{label}} נמחק ({{old}})" text_journal_deleted: "{{label}} נמחק ({{old}})"
text_journal_added: "{{label}} {{value}} נוסף" text_journal_added: "{{label}} {{value}} נוסף"
text_tip_task_begin_day: מטלה המתחילה היום text_tip_issue_begin_day: מטלה המתחילה היום
text_tip_task_end_day: מטלה המסתיימת היום text_tip_issue_end_day: מטלה המסתיימת היום
text_tip_task_begin_end_day: מטלה המתחילה ומסתיימת היום text_tip_issue_begin_end_day: מטלה המתחילה ומסתיימת היום
text_project_identifier_info: 'אותיות לטיניות (a-z), מספרים ומקפים.<br />ברגע שנשמר, לא ניתן לשנות את המזהה.' text_project_identifier_info: 'אותיות לטיניות (a-z), מספרים ומקפים.<br />ברגע שנשמר, לא ניתן לשנות את המזהה.'
text_caracters_maximum: "מקסימום {{count}} תווים." text_caracters_maximum: "מקסימום {{count}} תווים."
text_caracters_minimum: "חייב להיות לפחות באורך של {{count}} תווים." text_caracters_minimum: "חייב להיות לפחות באורך של {{count}} תווים."
@@ -852,8 +863,8 @@ he:
text_comma_separated: הכנסת ערכים מרובים מותרת (מופרדים בפסיקים). text_comma_separated: הכנסת ערכים מרובים מותרת (מופרדים בפסיקים).
text_line_separated: ניתן להזין מספר ערכים (שורה אחת לכל ערך). text_line_separated: ניתן להזין מספר ערכים (שורה אחת לכל ערך).
text_issues_ref_in_commit_messages: קישור ותיקום נושאים בהודעות הפקדה text_issues_ref_in_commit_messages: קישור ותיקום נושאים בהודעות הפקדה
text_issue_added: "הנושא {{id}} דווח (by {{author}})." text_issue_added: "הנושא {{id}} דווח (בידי {{author}})."
text_issue_updated: "הנושא {{id}} עודכן (by {{author}})." text_issue_updated: "הנושא {{id}} עודכן (בידי {{author}})."
text_wiki_destroy_confirmation: האם אתה בטוח שברצונך למחוק את הWIKI הזה ואת כל תוכנו? text_wiki_destroy_confirmation: האם אתה בטוח שברצונך למחוק את הWIKI הזה ואת כל תוכנו?
text_issue_category_destroy_question: "כמה נושאים ({{count}}) מוצבים לקטגוריה הזו. מה ברצונך לעשות?" text_issue_category_destroy_question: "כמה נושאים ({{count}}) מוצבים לקטגוריה הזו. מה ברצונך לעשות?"
text_issue_category_destroy_assignments: הסר הצבת קטגוריה text_issue_category_destroy_assignments: הסר הצבת קטגוריה
@@ -875,7 +886,7 @@ he:
text_user_wrote: "{{value}} כתב:" text_user_wrote: "{{value}} כתב:"
text_enumeration_destroy_question: "{{count}} אוביקטים מוצבים לערך זה." text_enumeration_destroy_question: "{{count}} אוביקטים מוצבים לערך זה."
text_enumeration_category_reassign_to: 'הצב מחדש לערך הזה:' 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_repository_usernames_mapping: "בחר או עדכן את משתמש Redmine הממופה לכל שם משתמש ביומן המאגר.\nמשתמשים בעלי שם או כתובת דואר זהה ב־Redmine ובמאגר ממופים באופן אוטומטי."
text_diff_truncated: '... השינויים עוברים את מספר השורות המירבי לתצוגה, ולכן הם קוצצו.' text_diff_truncated: '... השינויים עוברים את מספר השורות המירבי לתצוגה, ולכן הם קוצצו.'
text_custom_field_possible_values_info: שורה אחת לכל ערך text_custom_field_possible_values_info: שורה אחת לכל ערך
@@ -915,11 +926,3 @@ he:
enumeration_doc_categories: קטגוריות מסמכים enumeration_doc_categories: קטגוריות מסמכים
enumeration_activities: פעילויות (מעקב אחר זמנים) enumeration_activities: פעילויות (מעקב אחר זמנים)
enumeration_system_activity: פעילות מערכת 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_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_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_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_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_activation_by_email: aktivacija putem e-pošte
label_registration_manual_activation: ručna aktivacija label_registration_manual_activation: ručna aktivacija
@@ -815,9 +814,9 @@ hr:
text_journal_set_to: "{{label}} postavi na {{value}}" text_journal_set_to: "{{label}} postavi na {{value}}"
text_journal_deleted: "{{label}} izbrisano ({{old}})" text_journal_deleted: "{{label}} izbrisano ({{old}})"
text_journal_added: "{{label}} {{value}} added" text_journal_added: "{{label}} {{value}} added"
text_tip_task_begin_day: Zadaci koji počinju ovog dana text_tip_issue_begin_day: Zadaci koji počinju ovog dana
text_tip_task_end_day: zadaci koji se završavaju ovog dana text_tip_issue_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_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_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_maximum: "Najviše {{count}} znakova."
text_caracters_minimum: "Mora biti dugačko najmanje {{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}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_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_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_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_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_activation_by_email: Fiók aktiválása e-mailben
label_registration_manual_activation: Manuális fiók aktiválás 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_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_workflow_edit: Válasszon egy szerepkört, és egy feladat típust a workflow szerkesztéséhez
text_are_you_sure: Biztos benne ? text_are_you_sure: Biztos benne ?
text_tip_task_begin_day: a feladat ezen a napon kezdődik text_tip_issue_begin_day: a feladat ezen a napon kezdődik
text_tip_task_end_day: a feladat ezen a napon ér véget text_tip_issue_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_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_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_maximum: "maximum {{count}} karakter."
text_caracters_minimum: "Legkevesebb {{count}} karakter hosszúnek kell lennie." text_caracters_minimum: "Legkevesebb {{count}} karakter hosszúnek kell lennie."
@@ -941,3 +940,7 @@
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_search_titles_only: Cari judul saja
label_user_mail_option_all: "Untuk semua kejadian pada semua proyek saya" 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_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_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_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." 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_set_to: "{{label}} di set ke {{value}}"
text_journal_deleted: "{{label}} dihapus ({{old}})" text_journal_deleted: "{{label}} dihapus ({{old}})"
text_journal_added: "{{label}} {{value}} ditambahkan" text_journal_added: "{{label}} {{value}} ditambahkan"
text_tip_task_begin_day: tugas dimulai hari itu text_tip_issue_begin_day: tugas dimulai hari itu
text_tip_task_end_day: tugas berakhir hari itu text_tip_issue_end_day: tugas berakhir hari itu
text_tip_task_begin_end_day: tugas dimulai dan 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_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_maximum: "maximum {{count}} karakter."
text_caracters_minimum: "Setidaknya harus sepanjang {{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}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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_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_workflow_edit: Seleziona un ruolo ed un tracker per modificare il workflow
text_are_you_sure: Sei sicuro ? text_are_you_sure: Sei sicuro ?
text_tip_task_begin_day: attività che iniziano in questa giornata text_tip_issue_begin_day: attività che iniziano in questa giornata
text_tip_task_end_day: attività che terminano in questa giornata text_tip_issue_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_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_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_caracters_maximum: "massimo {{count}} caratteri."
text_length_between: "Lunghezza compresa tra {{min}} e {{max}} 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)." 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_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_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 setting_emails_footer: Piè di pagina email
label_float: Decimale label_float: Decimale
button_copy: Copia button_copy: Copia
@@ -922,3 +921,7 @@ it:
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
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: "を開始日より後にしてください" greater_than_start_date: "を開始日より後にしてください"
not_same_project: "同じプロジェクトに属していません" not_same_project: "同じプロジェクトに属していません"
circular_dependency: "この関係では、循環依存になります" circular_dependency: "この関係では、循環依存になります"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" cant_link_an_issue_with_a_descendant: "指定したチケットとは親子関係になっているため関連づけられません"
actionview_instancetag_blank_option: 選んでください actionview_instancetag_blank_option: 選んでください
@@ -376,6 +376,7 @@ ja:
setting_issue_done_ratio_issue_status: チケットのステータスを使用する setting_issue_done_ratio_issue_status: チケットのステータスを使用する
setting_start_of_week: 週の開始曜日 setting_start_of_week: 週の開始曜日
setting_rest_api_enabled: RESTによるWebサービスを有効にする setting_rest_api_enabled: RESTによるWebサービスを有効にする
setting_default_notification_option: デフォルトのメール通知オプション
permission_add_project: プロジェクトの追加 permission_add_project: プロジェクトの追加
permission_add_subprojects: サブプロジェクトの追加 permission_add_subprojects: サブプロジェクトの追加
@@ -701,7 +702,7 @@ ja:
label_relation_delete: 関連の削除 label_relation_delete: 関連の削除
label_relates_to: 関係している label_relates_to: 関係している
label_duplicates: 重複している label_duplicates: 重複している
label_duplicated_by: 重複している label_duplicated_by: 重複されている
label_blocks: ブロックしている label_blocks: ブロックしている
label_blocked_by: ブロックされている label_blocked_by: ブロックされている
label_precedes: 先行する label_precedes: 先行する
@@ -752,7 +753,9 @@ ja:
label_search_titles_only: タイトルのみ label_search_titles_only: タイトルのみ
label_user_mail_option_all: "参加しているプロジェクトの全ての通知" label_user_mail_option_all: "参加しているプロジェクトの全ての通知"
label_user_mail_option_selected: "選択したプロジェクトの全ての通知..." 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_user_mail_no_self_notified: 自分自身による変更の通知は不要
label_registration_activation_by_email: メールでアカウントを有効化 label_registration_activation_by_email: メールでアカウントを有効化
label_registration_manual_activation: 手動でアカウントを有効化 label_registration_manual_activation: 手動でアカウントを有効化
@@ -870,9 +873,9 @@ ja:
text_journal_set_to: "{{label}} を {{value}} にセット" text_journal_set_to: "{{label}} を {{value}} にセット"
text_journal_deleted: "{{label}} を削除 ({{old}})" text_journal_deleted: "{{label}} を削除 ({{old}})"
text_journal_added: "{{label}} {{value}} を追加" text_journal_added: "{{label}} {{value}} を追加"
text_tip_task_begin_day: この日に開始するタスク text_tip_issue_begin_day: この日に開始するタスク
text_tip_task_end_day: この日に終了するタスク text_tip_issue_end_day: この日に終了するタスク
text_tip_task_begin_end_day: この日のうちに開始して終了するタスク text_tip_issue_begin_end_day: この日のうちに開始して終了するタスク
text_project_identifier_info: '英小文字(a-z)と数字とダッシュ(-)が使えます。<br />一度保存すると、識別子は変更できません。' text_project_identifier_info: '英小文字(a-z)と数字とダッシュ(-)が使えます。<br />一度保存すると、識別子は変更できません。'
text_caracters_maximum: "最大{{count}}文字です。" text_caracters_maximum: "最大{{count}}文字です。"
text_caracters_minimum: "最低{{count}}文字の長さが必要です" text_caracters_minimum: "最低{{count}}文字の長さが必要です"

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