##// END OF EJS Templates
various modifications to prevent xss...
Jean-Philippe Lang -
r96:2b86ef8e28d0
parent child
Show More
@@ -0,0 +1,3
1 <p><%= link_to h(document.title), :controller => 'documents', :action => 'show', :id => document %><br />
2 <% unless document.description.empty? %><%=h truncate document.description, 250 %><br /><% end %>
3 <em><%= format_time(document.created_on) %></em></p> No newline at end of file
@@ -0,0 +1,4
1 <p><%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %><br />
2 <% unless news.summary.empty? %><%=h news.summary %><br /><% end %>
3 <em><%= news.author.name %>, <%= format_time(news.created_on) %></em><br />
4 <%= news.comments_count %> <%= lwr(:label_comment, news.comments_count).downcase %><br /></p>
@@ -1,74 +1,74
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 module IssuesHelper
18 module IssuesHelper
19
19
20 def show_detail(detail, no_html=false)
20 def show_detail(detail, no_html=false)
21 case detail.property
21 case detail.property
22 when 'attr'
22 when 'attr'
23 label = l(("field_" + detail.prop_key.to_s.gsub(/\_id$/, "")).to_sym)
23 label = l(("field_" + detail.prop_key.to_s.gsub(/\_id$/, "")).to_sym)
24 case detail.prop_key
24 case detail.prop_key
25 when 'due_date', 'start_date'
25 when 'due_date', 'start_date'
26 value = format_date(detail.value.to_date) if detail.value
26 value = format_date(detail.value.to_date) if detail.value
27 old_value = format_date(detail.old_value.to_date) if detail.old_value
27 old_value = format_date(detail.old_value.to_date) if detail.old_value
28 when 'status_id'
28 when 'status_id'
29 s = IssueStatus.find_by_id(detail.value) and value = s.name if detail.value
29 s = IssueStatus.find_by_id(detail.value) and value = s.name if detail.value
30 s = IssueStatus.find_by_id(detail.old_value) and old_value = s.name if detail.old_value
30 s = IssueStatus.find_by_id(detail.old_value) and old_value = s.name if detail.old_value
31 when 'assigned_to_id'
31 when 'assigned_to_id'
32 u = User.find_by_id(detail.value) and value = u.name if detail.value
32 u = User.find_by_id(detail.value) and value = u.name if detail.value
33 u = User.find_by_id(detail.old_value) and old_value = u.name if detail.old_value
33 u = User.find_by_id(detail.old_value) and old_value = u.name if detail.old_value
34 when 'priority_id'
34 when 'priority_id'
35 e = Enumeration.find_by_id(detail.value) and value = e.name if detail.value
35 e = Enumeration.find_by_id(detail.value) and value = e.name if detail.value
36 e = Enumeration.find_by_id(detail.old_value) and old_value = e.name if detail.old_value
36 e = Enumeration.find_by_id(detail.old_value) and old_value = e.name if detail.old_value
37 when 'category_id'
37 when 'category_id'
38 c = IssueCategory.find_by_id(detail.value) and value = c.name if detail.value
38 c = IssueCategory.find_by_id(detail.value) and value = c.name if detail.value
39 c = IssueCategory.find_by_id(detail.old_value) and old_value = c.name if detail.old_value
39 c = IssueCategory.find_by_id(detail.old_value) and old_value = c.name if detail.old_value
40 when 'fixed_version_id'
40 when 'fixed_version_id'
41 v = Version.find_by_id(detail.value) and value = v.name if detail.value
41 v = Version.find_by_id(detail.value) and value = v.name if detail.value
42 v = Version.find_by_id(detail.old_value) and old_value = v.name if detail.old_value
42 v = Version.find_by_id(detail.old_value) and old_value = v.name if detail.old_value
43 end
43 end
44 when 'cf'
44 when 'cf'
45 custom_field = CustomField.find_by_id(detail.prop_key)
45 custom_field = CustomField.find_by_id(detail.prop_key)
46 if custom_field
46 if custom_field
47 label = custom_field.name
47 label = custom_field.name
48 value = format_value(detail.value, custom_field.field_format) if detail.value
48 value = format_value(detail.value, custom_field.field_format) if detail.value
49 old_value = format_value(detail.old_value, custom_field.field_format) if detail.old_value
49 old_value = format_value(detail.old_value, custom_field.field_format) if detail.old_value
50 end
50 end
51 end
51 end
52
52
53 label ||= detail.prop_key
53 label ||= detail.prop_key
54 value ||= detail.value
54 value ||= detail.value
55 old_value ||= detail.old_value
55 old_value ||= detail.old_value
56
56
57 unless no_html
57 unless no_html
58 label = content_tag('strong', label)
58 label = content_tag('strong', label)
59 old_value = content_tag("i", old_value) if old_value
59 old_value = content_tag("i", h(old_value)) if old_value
60 old_value = content_tag("strike", old_value) if old_value and !value
60 old_value = content_tag("strike", h(old_value)) if old_value and !value
61 value = content_tag("i", value) if value
61 value = content_tag("i", h(value)) if value
62 end
62 end
63
63
64 if value
64 if value
65 if old_value
65 if old_value
66 label + " " + l(:text_journal_changed, old_value, value)
66 label + " " + l(:text_journal_changed, old_value, value)
67 else
67 else
68 label + " " + l(:text_journal_set_to, value)
68 label + " " + l(:text_journal_set_to, value)
69 end
69 end
70 else
70 else
71 label + " " + l(:text_journal_deleted) + " (#{old_value})"
71 label + " " + l(:text_journal_deleted) + " (#{old_value})"
72 end
72 end
73 end
73 end
74 end
74 end
@@ -1,42 +1,43
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class CustomField < ActiveRecord::Base
18 class CustomField < ActiveRecord::Base
19 has_many :custom_values, :dependent => true
19 has_many :custom_values, :dependent => true
20
20
21 FIELD_FORMATS = { "list" => :label_list,
21 FIELD_FORMATS = { "list" => :label_list,
22 "date" => :label_date,
22 "date" => :label_date,
23 "bool" => :label_boolean,
23 "bool" => :label_boolean,
24 "int" => :label_integer,
24 "int" => :label_integer,
25 "string" => :label_string,
25 "string" => :label_string,
26 "text" => :label_text
26 "text" => :label_text
27 }.freeze
27 }.freeze
28
28
29 validates_presence_of :name, :field_format
29 validates_presence_of :name, :field_format
30 validates_uniqueness_of :name
30 validates_uniqueness_of :name
31 validates_format_of :name, :with => /^[\w\s\'\-]*$/i
31 validates_inclusion_of :field_format, :in => FIELD_FORMATS.keys
32 validates_inclusion_of :field_format, :in => FIELD_FORMATS.keys
32 validates_presence_of :possible_values, :if => Proc.new { |field| field.field_format == "list" }
33 validates_presence_of :possible_values, :if => Proc.new { |field| field.field_format == "list" }
33
34
34 # to move in project_custom_field
35 # to move in project_custom_field
35 def self.for_all
36 def self.for_all
36 find(:all, :conditions => ["is_for_all=?", true])
37 find(:all, :conditions => ["is_for_all=?", true])
37 end
38 end
38
39
39 def type_name
40 def type_name
40 nil
41 nil
41 end
42 end
42 end
43 end
@@ -1,46 +1,47
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Enumeration < ActiveRecord::Base
18 class Enumeration < ActiveRecord::Base
19 before_destroy :check_integrity
19 before_destroy :check_integrity
20
20
21 validates_presence_of :opt, :name
21 validates_presence_of :opt, :name
22 validates_uniqueness_of :name, :scope => [:opt]
22 validates_uniqueness_of :name, :scope => [:opt]
23 validates_format_of :name, :with => /^[\w\s\'\-]*$/i
23
24
24 OPTIONS = {
25 OPTIONS = {
25 "IPRI" => :enumeration_issue_priorities,
26 "IPRI" => :enumeration_issue_priorities,
26 "DCAT" => :enumeration_doc_categories
27 "DCAT" => :enumeration_doc_categories
27 }.freeze
28 }.freeze
28
29
29 def self.get_values(option)
30 def self.get_values(option)
30 find(:all, :conditions => ['opt=?', option])
31 find(:all, :conditions => ['opt=?', option])
31 end
32 end
32
33
33 def option_name
34 def option_name
34 OPTIONS[self.opt]
35 OPTIONS[self.opt]
35 end
36 end
36
37
37 private
38 private
38 def check_integrity
39 def check_integrity
39 case self.opt
40 case self.opt
40 when "IPRI"
41 when "IPRI"
41 raise "Can't delete enumeration" if Issue.find(:first, :conditions => ["priority_id=?", self.id])
42 raise "Can't delete enumeration" if Issue.find(:first, :conditions => ["priority_id=?", self.id])
42 when "DCAT"
43 when "DCAT"
43 raise "Can't delete enumeration" if Document.find(:first, :conditions => ["category_id=?", self.id])
44 raise "Can't delete enumeration" if Document.find(:first, :conditions => ["category_id=?", self.id])
44 end
45 end
45 end
46 end
46 end
47 end
@@ -1,49 +1,50
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class IssueStatus < ActiveRecord::Base
18 class IssueStatus < ActiveRecord::Base
19 before_destroy :check_integrity
19 before_destroy :check_integrity
20 has_many :workflows, :foreign_key => "old_status_id"
20 has_many :workflows, :foreign_key => "old_status_id"
21
21
22 validates_presence_of :name
22 validates_presence_of :name
23 validates_uniqueness_of :name
23 validates_uniqueness_of :name
24 validates_format_of :name, :with => /^[\w\s\'\-]*$/i
24 validates_length_of :html_color, :is => 6
25 validates_length_of :html_color, :is => 6
25 validates_format_of :html_color, :with => /^[a-f0-9]*$/i
26 validates_format_of :html_color, :with => /^[a-f0-9]*$/i
26
27
27 def before_save
28 def before_save
28 IssueStatus.update_all "is_default=false" if self.is_default?
29 IssueStatus.update_all "is_default=false" if self.is_default?
29 end
30 end
30
31
31 # Returns the default status for new issues
32 # Returns the default status for new issues
32 def self.default
33 def self.default
33 find(:first, :conditions =>["is_default=?", true])
34 find(:first, :conditions =>["is_default=?", true])
34 end
35 end
35
36
36 # Returns an array of all statuses the given role can switch to
37 # Returns an array of all statuses the given role can switch to
37 def new_statuses_allowed_to(role, tracker)
38 def new_statuses_allowed_to(role, tracker)
38 statuses = []
39 statuses = []
39 for workflow in self.workflows
40 for workflow in self.workflows
40 statuses << workflow.new_status if workflow.role_id == role.id and workflow.tracker_id == tracker.id
41 statuses << workflow.new_status if workflow.role_id == role.id and workflow.tracker_id == tracker.id
41 end unless role.nil? or tracker.nil?
42 end unless role.nil? or tracker.nil?
42 statuses
43 statuses
43 end
44 end
44
45
45 private
46 private
46 def check_integrity
47 def check_integrity
47 raise "Can't delete status" if Issue.find(:first, :conditions => ["status_id=?", self.id]) or IssueHistory.find(:first, :conditions => ["status_id=?", self.id])
48 raise "Can't delete status" if Issue.find(:first, :conditions => ["status_id=?", self.id]) or IssueHistory.find(:first, :conditions => ["status_id=?", self.id])
48 end
49 end
49 end
50 end
@@ -1,58 +1,59
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Project < ActiveRecord::Base
18 class Project < ActiveRecord::Base
19 has_many :versions, :dependent => true, :order => "versions.effective_date DESC, versions.name DESC"
19 has_many :versions, :dependent => true, :order => "versions.effective_date DESC, versions.name DESC"
20 has_many :members, :dependent => true
20 has_many :members, :dependent => true
21 has_many :users, :through => :members
21 has_many :users, :through => :members
22 has_many :custom_values, :dependent => true, :as => :customized
22 has_many :custom_values, :dependent => true, :as => :customized
23 has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => [:status, :tracker]
23 has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => [:status, :tracker]
24 has_many :queries, :dependent => true
24 has_many :queries, :dependent => true
25 has_many :documents, :dependent => true
25 has_many :documents, :dependent => true
26 has_many :news, :dependent => true, :include => :author
26 has_many :news, :dependent => true, :include => :author
27 has_many :issue_categories, :dependent => true, :order => "issue_categories.name"
27 has_many :issue_categories, :dependent => true, :order => "issue_categories.name"
28 has_and_belongs_to_many :custom_fields, :class_name => 'IssueCustomField', :join_table => 'custom_fields_projects', :association_foreign_key => 'custom_field_id'
28 has_and_belongs_to_many :custom_fields, :class_name => 'IssueCustomField', :join_table => 'custom_fields_projects', :association_foreign_key => 'custom_field_id'
29 acts_as_tree :order => "name", :counter_cache => true
29 acts_as_tree :order => "name", :counter_cache => true
30
30
31 validates_presence_of :name, :description
31 validates_presence_of :name, :description
32 validates_uniqueness_of :name
32 validates_uniqueness_of :name
33 validates_associated :custom_values, :on => :update
33 validates_associated :custom_values, :on => :update
34 validates_format_of :name, :with => /^[\w\s\'\-]*$/i
34
35
35 # returns 5 last created projects
36 # returns 5 last created projects
36 def self.latest
37 def self.latest
37 find(:all, :limit => 5, :order => "created_on DESC")
38 find(:all, :limit => 5, :order => "created_on DESC")
38 end
39 end
39
40
40 # Returns an array of all custom fields enabled for project issues
41 # Returns an array of all custom fields enabled for project issues
41 # (explictly associated custom fields and custom fields enabled for all projects)
42 # (explictly associated custom fields and custom fields enabled for all projects)
42 def custom_fields_for_issues(tracker)
43 def custom_fields_for_issues(tracker)
43 tracker.custom_fields.find(:all, :include => :projects,
44 tracker.custom_fields.find(:all, :include => :projects,
44 :conditions => ["is_for_all=? or project_id=?", true, self.id])
45 :conditions => ["is_for_all=? or project_id=?", true, self.id])
45 #(CustomField.for_all + custom_fields).uniq
46 #(CustomField.for_all + custom_fields).uniq
46 end
47 end
47
48
48 def all_custom_fields
49 def all_custom_fields
49 @all_custom_fields ||= IssueCustomField.find(:all, :include => :projects,
50 @all_custom_fields ||= IssueCustomField.find(:all, :include => :projects,
50 :conditions => ["is_for_all=? or project_id=?", true, self.id])
51 :conditions => ["is_for_all=? or project_id=?", true, self.id])
51 end
52 end
52
53
53 protected
54 protected
54 def validate
55 def validate
55 errors.add(parent_id, " must be a root project") if parent and parent.parent
56 errors.add(parent_id, " must be a root project") if parent and parent.parent
56 errors.add_to_base("A project with subprojects can't be a subproject") if parent and projects_count > 0
57 errors.add_to_base("A project with subprojects can't be a subproject") if parent and projects_count > 0
57 end
58 end
58 end
59 end
@@ -1,31 +1,32
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Role < ActiveRecord::Base
18 class Role < ActiveRecord::Base
19 before_destroy :check_integrity
19 before_destroy :check_integrity
20 has_and_belongs_to_many :permissions
20 has_and_belongs_to_many :permissions
21 has_many :workflows, :dependent => true
21 has_many :workflows, :dependent => true
22 has_many :members
22 has_many :members
23
23
24 validates_presence_of :name
24 validates_presence_of :name
25 validates_uniqueness_of :name
25 validates_uniqueness_of :name
26 validates_format_of :name, :with => /^[\w\s\'\-]*$/i
26
27
27 private
28 private
28 def check_integrity
29 def check_integrity
29 raise "Can't delete role" if Member.find(:first, :conditions =>["role_id=?", self.id])
30 raise "Can't delete role" if Member.find(:first, :conditions =>["role_id=?", self.id])
30 end
31 end
31 end
32 end
@@ -1,31 +1,32
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Tracker < ActiveRecord::Base
18 class Tracker < ActiveRecord::Base
19 before_destroy :check_integrity
19 before_destroy :check_integrity
20 has_many :issues
20 has_many :issues
21 has_many :workflows, :dependent => true
21 has_many :workflows, :dependent => true
22 has_and_belongs_to_many :custom_fields, :class_name => 'IssueCustomField', :join_table => 'custom_fields_trackers', :association_foreign_key => 'custom_field_id'
22 has_and_belongs_to_many :custom_fields, :class_name => 'IssueCustomField', :join_table => 'custom_fields_trackers', :association_foreign_key => 'custom_field_id'
23
23
24 validates_presence_of :name
24 validates_presence_of :name
25 validates_uniqueness_of :name
25 validates_uniqueness_of :name
26 validates_format_of :name, :with => /^[\w\s\'\-]*$/i
26
27
27 private
28 private
28 def check_integrity
29 def check_integrity
29 raise "Can't delete tracker" if Issue.find(:first, :conditions => ["tracker_id=?", self.id])
30 raise "Can't delete tracker" if Issue.find(:first, :conditions => ["tracker_id=?", self.id])
30 end
31 end
31 end
32 end
@@ -1,129 +1,130
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require "digest/sha1"
18 require "digest/sha1"
19
19
20 class User < ActiveRecord::Base
20 class User < ActiveRecord::Base
21 has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :dependent => true
21 has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :dependent => true
22 has_many :projects, :through => :memberships
22 has_many :projects, :through => :memberships
23 has_many :custom_values, :dependent => true, :as => :customized
23 has_many :custom_values, :dependent => true, :as => :customized
24 has_one :preference, :dependent => true, :class_name => 'UserPreference'
24 has_one :preference, :dependent => true, :class_name => 'UserPreference'
25 belongs_to :auth_source
25 belongs_to :auth_source
26
26
27 attr_accessor :password, :password_confirmation
27 attr_accessor :password, :password_confirmation
28 attr_accessor :last_before_login_on
28 attr_accessor :last_before_login_on
29 # Prevents unauthorized assignments
29 # Prevents unauthorized assignments
30 attr_protected :login, :admin, :password, :password_confirmation, :hashed_password
30 attr_protected :login, :admin, :password, :password_confirmation, :hashed_password
31
31
32 validates_presence_of :login, :firstname, :lastname, :mail
32 validates_presence_of :login, :firstname, :lastname, :mail
33 validates_uniqueness_of :login, :mail
33 validates_uniqueness_of :login, :mail
34 # Login must contain lettres, numbers, underscores only
34 # Login must contain lettres, numbers, underscores only
35 validates_format_of :login, :with => /^[a-z0-9_]+$/i
35 validates_format_of :firstname, :lastname, :with => /^[\w\s\'\-]*$/i
36 validates_format_of :login, :with => /^[a-z0-9_\-@\.]+$/i
36 validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
37 validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
37 # Password length between 4 and 12
38 # Password length between 4 and 12
38 validates_length_of :password, :in => 4..12, :allow_nil => true
39 validates_length_of :password, :in => 4..12, :allow_nil => true
39 validates_confirmation_of :password, :allow_nil => true
40 validates_confirmation_of :password, :allow_nil => true
40 validates_associated :custom_values, :on => :update
41 validates_associated :custom_values, :on => :update
41
42
42 # Account statuses
43 # Account statuses
43 STATUS_ACTIVE = 1
44 STATUS_ACTIVE = 1
44 STATUS_REGISTERED = 2
45 STATUS_REGISTERED = 2
45 STATUS_LOCKED = 3
46 STATUS_LOCKED = 3
46
47
47 def before_save
48 def before_save
48 # update hashed_password if password was set
49 # update hashed_password if password was set
49 self.hashed_password = User.hash_password(self.password) if self.password
50 self.hashed_password = User.hash_password(self.password) if self.password
50 end
51 end
51
52
52 # Returns the user that matches provided login and password, or nil
53 # Returns the user that matches provided login and password, or nil
53 def self.try_to_login(login, password)
54 def self.try_to_login(login, password)
54 user = find(:first, :conditions => ["login=?", login])
55 user = find(:first, :conditions => ["login=?", login])
55 if user
56 if user
56 # user is already in local database
57 # user is already in local database
57 return nil if !user.active?
58 return nil if !user.active?
58 if user.auth_source
59 if user.auth_source
59 # user has an external authentication method
60 # user has an external authentication method
60 return nil unless user.auth_source.authenticate(login, password)
61 return nil unless user.auth_source.authenticate(login, password)
61 else
62 else
62 # authentication with local password
63 # authentication with local password
63 return nil unless User.hash_password(password) == user.hashed_password
64 return nil unless User.hash_password(password) == user.hashed_password
64 end
65 end
65 else
66 else
66 # user is not yet registered, try to authenticate with available sources
67 # user is not yet registered, try to authenticate with available sources
67 attrs = AuthSource.authenticate(login, password)
68 attrs = AuthSource.authenticate(login, password)
68 if attrs
69 if attrs
69 onthefly = new(*attrs)
70 onthefly = new(*attrs)
70 onthefly.login = login
71 onthefly.login = login
71 onthefly.language = $RDM_DEFAULT_LANG
72 onthefly.language = $RDM_DEFAULT_LANG
72 if onthefly.save
73 if onthefly.save
73 user = find(:first, :conditions => ["login=?", login])
74 user = find(:first, :conditions => ["login=?", login])
74 logger.info("User '#{user.login}' created on the fly.") if logger
75 logger.info("User '#{user.login}' created on the fly.") if logger
75 end
76 end
76 end
77 end
77 end
78 end
78 user.update_attribute(:last_login_on, Time.now) if user
79 user.update_attribute(:last_login_on, Time.now) if user
79 user
80 user
80
81
81 rescue => text
82 rescue => text
82 raise text
83 raise text
83 end
84 end
84
85
85 # Return user's full name for display
86 # Return user's full name for display
86 def display_name
87 def display_name
87 firstname + " " + lastname
88 firstname + " " + lastname
88 end
89 end
89
90
90 def name
91 def name
91 display_name
92 display_name
92 end
93 end
93
94
94 def active?
95 def active?
95 self.status == STATUS_ACTIVE
96 self.status == STATUS_ACTIVE
96 end
97 end
97
98
98 def registered?
99 def registered?
99 self.status == STATUS_REGISTERED
100 self.status == STATUS_REGISTERED
100 end
101 end
101
102
102 def locked?
103 def locked?
103 self.status == STATUS_LOCKED
104 self.status == STATUS_LOCKED
104 end
105 end
105
106
106 def check_password?(clear_password)
107 def check_password?(clear_password)
107 User.hash_password(clear_password) == self.hashed_password
108 User.hash_password(clear_password) == self.hashed_password
108 end
109 end
109
110
110 def role_for_project(project_id)
111 def role_for_project(project_id)
111 @role_for_projects ||=
112 @role_for_projects ||=
112 begin
113 begin
113 roles = {}
114 roles = {}
114 self.memberships.each { |m| roles.store m.project_id, m.role_id }
115 self.memberships.each { |m| roles.store m.project_id, m.role_id }
115 roles
116 roles
116 end
117 end
117 @role_for_projects[project_id]
118 @role_for_projects[project_id]
118 end
119 end
119
120
120 def pref
121 def pref
121 self.preference ||= UserPreference.new(:user => self)
122 self.preference ||= UserPreference.new(:user => self)
122 end
123 end
123
124
124 private
125 private
125 # Return password digest
126 # Return password digest
126 def self.hash_password(clear_password)
127 def self.hash_password(clear_password)
127 Digest::SHA1.hexdigest(clear_password || "")
128 Digest::SHA1.hexdigest(clear_password || "")
128 end
129 end
129 end
130 end
@@ -1,32 +1,32
1 <div class="contextual">
1 <div class="contextual">
2 <%= link_to l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'pic picAdd' %>
2 <%= link_to l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'pic picAdd' %>
3 </div>
3 </div>
4
4
5 <h2><%=l(:label_project_plural)%></h2>
5 <h2><%=l(:label_project_plural)%></h2>
6
6
7 <table class="listTableContent">
7 <table class="listTableContent">
8 <tr class="ListHead">
8 <tr class="ListHead">
9 <%= sort_header_tag('name', :caption => l(:label_project)) %>
9 <%= sort_header_tag('name', :caption => l(:label_project)) %>
10 <th><%=l(:field_description)%></th>
10 <th><%=l(:field_description)%></th>
11 <th><%=l(:field_is_public)%></th>
11 <th><%=l(:field_is_public)%></th>
12 <th><%=l(:label_subproject_plural)%></th>
12 <th><%=l(:label_subproject_plural)%></th>
13 <%= sort_header_tag('created_on', :caption => l(:field_created_on)) %>
13 <%= sort_header_tag('created_on', :caption => l(:field_created_on)) %>
14 <th></th>
14 <th></th>
15 </tr>
15 </tr>
16
16
17 <% for project in @projects %>
17 <% for project in @projects %>
18 <tr class="<%= cycle("odd", "even") %>">
18 <tr class="<%= cycle("odd", "even") %>">
19 <td><%= link_to project.name, :controller => 'projects', :action => 'settings', :id => project %>
19 <td><%= link_to project.name, :controller => 'projects', :action => 'settings', :id => project %>
20 <td><%= project.description %>
20 <td><%=h project.description %>
21 <td align="center"><%= image_tag 'true' if project.is_public? %>
21 <td align="center"><%= image_tag 'true' if project.is_public? %>
22 <td align="center"><%= project.projects_count %>
22 <td align="center"><%= project.projects_count %>
23 <td align="center"><%= format_date(project.created_on) %>
23 <td align="center"><%= format_date(project.created_on) %>
24 <td align="center">
24 <td align="center">
25 <%= button_to l(:button_delete), { :controller => 'projects', :action => 'destroy', :id => project }, :class => "button-small" %>
25 <%= button_to l(:button_delete), { :controller => 'projects', :action => 'destroy', :id => project }, :class => "button-small" %>
26 </td>
26 </td>
27 </tr>
27 </tr>
28 <% end %>
28 <% end %>
29 </table>
29 </table>
30
30
31 <p><%= pagination_links_full @project_pages %>
31 <p><%= pagination_links_full @project_pages %>
32 [ <%= @project_pages.current.first_item %> - <%= @project_pages.current.last_item %> / <%= @project_count %> ]</p> No newline at end of file
32 [ <%= @project_pages.current.first_item %> - <%= @project_pages.current.last_item %> / <%= @project_count %> ]</p>
@@ -1,11 +1,11
1 <% for journal in journals %>
1 <% for journal in journals %>
2 <h4><%= format_time(journal.created_on) %> - <%= journal.user.name %></h4>
2 <h4><%= format_time(journal.created_on) %> - <%= journal.user.name %></h4>
3 <ul>
3 <ul>
4 <% for detail in journal.details %>
4 <% for detail in journal.details %>
5 <li><%= show_detail(detail) %></li>
5 <li><%= show_detail(detail) %></li>
6 <% end %>
6 <% end %>
7 </ul>
7 </ul>
8 <% if journal.notes? %>
8 <% if journal.notes? %>
9 <%= simple_format auto_link journal.notes %>
9 <%= simple_format auto_link h(journal.notes) %>
10 <% end %>
10 <% end %>
11 <% end %>
11 <% end %>
@@ -1,28 +1,28
1 <% if issues.length > 0 %>
1 <% if issues.length > 0 %>
2 <table cellspacing="0" cellpadding="1" width="100%" border="0" class="listTable">
2 <table cellspacing="0" cellpadding="1" width="100%" border="0" class="listTable">
3 <tr><td>
3 <tr><td>
4 <table class="listTableContent">
4 <table class="listTableContent">
5 <tr class="ListHead">
5 <tr class="ListHead">
6 <th>#</th>
6 <th>#</th>
7 <th><%=l(:field_tracker)%></th>
7 <th><%=l(:field_tracker)%></th>
8 <th><%=l(:field_subject)%></th>
8 <th><%=l(:field_subject)%></th>
9 </tr>
9 </tr>
10 <% for issue in issues %>
10 <% for issue in issues %>
11 <tr class="<%= cycle("odd", "even") %>">
11 <tr class="<%= cycle("odd", "even") %>">
12 <td align="center" style="font-weight:bold;color:#<%= issue.status.html_color %>;">
12 <td align="center" style="font-weight:bold;color:#<%= issue.status.html_color %>;">
13 <%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %><br />
13 <%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %><br />
14 </td>
14 </td>
15 <td><p class="small"><%= issue.project.name %> - <%= issue.tracker.name %><br />
15 <td><p class="small"><%= issue.project.name %> - <%= issue.tracker.name %><br />
16 <%= issue.status.name %> - <%= format_time(issue.updated_on) %></p></td>
16 <%= issue.status.name %> - <%= format_time(issue.updated_on) %></p></td>
17 <td>
17 <td>
18 <p class="small"><%= link_to issue.subject, :controller => 'issues', :action => 'show', :id => issue %></p>
18 <p class="small"><%= link_to h(issue.subject), :controller => 'issues', :action => 'show', :id => issue %></p>
19 </td>
19 </td>
20 </tr>
20 </tr>
21 <% end %>
21 <% end %>
22 </table>
22 </table>
23 </td>
23 </td>
24 </tr>
24 </tr>
25 </table>
25 </table>
26 <% else %>
26 <% else %>
27 <i><%=l(:label_no_data)%></i>
27 <i><%=l(:label_no_data)%></i>
28 <% end %> No newline at end of file
28 <% end %>
@@ -1,37 +1,37
1 <h2><%=l(:label_issue)%> #<%= @issue.id %>: <%= @issue.subject %></h2>
1 <h2><%=l(:label_issue)%> #<%= @issue.id %>: <%=h @issue.subject %></h2>
2
2
3 <%= error_messages_for 'issue' %>
3 <%= error_messages_for 'issue' %>
4 <%= start_form_tag({:action => 'change_status', :id => @issue}, :class => "tabular") %>
4 <%= start_form_tag({:action => 'change_status', :id => @issue}, :class => "tabular") %>
5
5
6 <%= hidden_field_tag 'confirm', 1 %>
6 <%= hidden_field_tag 'confirm', 1 %>
7 <%= hidden_field_tag 'new_status_id', @new_status.id %>
7 <%= hidden_field_tag 'new_status_id', @new_status.id %>
8
8
9 <div class="box">
9 <div class="box">
10 <p><label><%=l(:label_issue_status_new)%></label> <%= @new_status.name %></p>
10 <p><label><%=l(:label_issue_status_new)%></label> <%= @new_status.name %></p>
11
11
12 <p><label for="issue_assigned_to_id"><%=l(:field_assigned_to)%></label>
12 <p><label for="issue_assigned_to_id"><%=l(:field_assigned_to)%></label>
13 <select name="issue[assigned_to_id]">
13 <select name="issue[assigned_to_id]">
14 <option value=""></option>
14 <option value=""></option>
15 <%= options_from_collection_for_select @assignable_to, "id", "display_name", @issue.assigned_to_id %></p>
15 <%= options_from_collection_for_select @assignable_to, "id", "display_name", @issue.assigned_to_id %></p>
16 </select></p>
16 </select></p>
17
17
18
18
19 <p><label for="issue_done_ratio"><%=l(:field_done_ratio)%></label>
19 <p><label for="issue_done_ratio"><%=l(:field_done_ratio)%></label>
20 <%= select("issue", "done_ratio", ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) ) %>
20 <%= select("issue", "done_ratio", ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) ) %>
21 </select></p>
21 </select></p>
22
22
23
23
24 <p><label for="issue_fixed_version"><%=l(:field_fixed_version)%></label>
24 <p><label for="issue_fixed_version"><%=l(:field_fixed_version)%></label>
25 <select name="issue[fixed_version_id]">
25 <select name="issue[fixed_version_id]">
26 <option value="">--none--</option>
26 <option value="">--none--</option>
27 <%= options_from_collection_for_select @issue.project.versions, "id", "name", @issue.fixed_version_id %>
27 <%= options_from_collection_for_select @issue.project.versions, "id", "name", @issue.fixed_version_id %>
28 </select></p>
28 </select></p>
29
29
30 <p><label for="notes"><%= l(:field_notes) %></label>
30 <p><label for="notes"><%= l(:field_notes) %></label>
31 <%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10 %></p>
31 <%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10 %></p>
32
32
33 </div>
33 </div>
34
34
35 <%= hidden_field 'issue', 'lock_version' %>
35 <%= hidden_field 'issue', 'lock_version' %>
36 <%= submit_tag l(:button_save) %>
36 <%= submit_tag l(:button_save) %>
37 <%= end_form_tag %>
37 <%= end_form_tag %>
@@ -1,113 +1,113
1 <div class="contextual">
1 <div class="contextual">
2 <%= l(:label_export_to) %><%= link_to 'PDF', {:action => 'export_pdf', :id => @issue}, :class => 'pic picPdf' %>
2 <%= l(:label_export_to) %><%= link_to 'PDF', {:action => 'export_pdf', :id => @issue}, :class => 'pic picPdf' %>
3 </div>
3 </div>
4
4
5 <h2><%= @issue.tracker.name %> #<%= @issue.id %> - <%= @issue.subject %></h2>
5 <h2><%= @issue.tracker.name %> #<%= @issue.id %> - <%=h @issue.subject %></h2>
6
6
7 <div class="box">
7 <div class="box">
8 <table width="100%">
8 <table width="100%">
9 <tr>
9 <tr>
10 <td width="15%"><b><%=l(:field_status)%> :</b></td><td width="35%"><%= @issue.status.name %></td>
10 <td width="15%"><b><%=l(:field_status)%> :</b></td><td width="35%"><%= @issue.status.name %></td>
11 <td width="15%"><b><%=l(:field_priority)%> :</b></td><td width="35%"><%= @issue.priority.name %></td>
11 <td width="15%"><b><%=l(:field_priority)%> :</b></td><td width="35%"><%= @issue.priority.name %></td>
12 </tr>
12 </tr>
13 <tr>
13 <tr>
14 <td><b><%=l(:field_assigned_to)%> :</b></td><td><%= @issue.assigned_to ? @issue.assigned_to.name : "-" %></td>
14 <td><b><%=l(:field_assigned_to)%> :</b></td><td><%= @issue.assigned_to ? @issue.assigned_to.name : "-" %></td>
15 <td><b><%=l(:field_category)%> :</b></td><td><%= @issue.category ? @issue.category.name : "-" %></td>
15 <td><b><%=l(:field_category)%> :</b></td><td><%=h @issue.category ? @issue.category.name : "-" %></td>
16 </tr>
16 </tr>
17 <tr>
17 <tr>
18 <td><b><%=l(:field_author)%> :</b></td><td><%= link_to_user @issue.author %></td>
18 <td><b><%=l(:field_author)%> :</b></td><td><%= link_to_user @issue.author %></td>
19 <td><b><%=l(:field_start_date)%> :</b></td><td><%= format_date(@issue.start_date) %></td>
19 <td><b><%=l(:field_start_date)%> :</b></td><td><%= format_date(@issue.start_date) %></td>
20 </tr>
20 </tr>
21 <tr>
21 <tr>
22 <td><b><%=l(:field_created_on)%> :</b></td><td><%= format_date(@issue.created_on) %></td>
22 <td><b><%=l(:field_created_on)%> :</b></td><td><%= format_date(@issue.created_on) %></td>
23 <td><b><%=l(:field_due_date)%> :</b></td><td><%= format_date(@issue.due_date) %></td>
23 <td><b><%=l(:field_due_date)%> :</b></td><td><%= format_date(@issue.due_date) %></td>
24 </tr>
24 </tr>
25 <tr>
25 <tr>
26 <td><b><%=l(:field_updated_on)%> :</b></td><td><%= format_date(@issue.updated_on) %></td>
26 <td><b><%=l(:field_updated_on)%> :</b></td><td><%= format_date(@issue.updated_on) %></td>
27 <td><b><%=l(:field_done_ratio)%> :</b></td><td><%= @issue.done_ratio %> %</td>
27 <td><b><%=l(:field_done_ratio)%> :</b></td><td><%= @issue.done_ratio %> %</td>
28 </tr>
28 </tr>
29 <tr>
29 <tr>
30 <% n = 0
30 <% n = 0
31 for custom_value in @custom_values %>
31 for custom_value in @custom_values %>
32 <td><b><%= custom_value.custom_field.name %> :</b></td><td><%= show_value custom_value %></td>
32 <td><b><%= custom_value.custom_field.name %> :</b></td><td><%=h show_value custom_value %></td>
33 <% n = n + 1
33 <% n = n + 1
34 if (n > 1)
34 if (n > 1)
35 n = 0 %>
35 n = 0 %>
36 </tr><tr>
36 </tr><tr>
37 <%end
37 <%end
38 end %>
38 end %>
39 </tr>
39 </tr>
40 </table>
40 </table>
41 <hr />
41 <hr />
42 <br />
42 <br />
43
43
44 <b><%=l(:field_description)%> :</b><br /><br />
44 <b><%=l(:field_description)%> :</b><br /><br />
45 <%= textilizable @issue.description %>
45 <%= textilizable @issue.description %>
46 <br />
46 <br />
47
47
48 <div class="contextual">
48 <div class="contextual">
49 <%= link_to_if_authorized l(:button_edit), {:controller => 'issues', :action => 'edit', :id => @issue}, :class => 'pic picEdit' %>
49 <%= link_to_if_authorized l(:button_edit), {:controller => 'issues', :action => 'edit', :id => @issue}, :class => 'pic picEdit' %>
50 <%= link_to_if_authorized l(:button_move), {:controller => 'projects', :action => 'move_issues', :id => @project, "issue_ids[]" => @issue.id }, :class => 'pic picMove' %>
50 <%= link_to_if_authorized l(:button_move), {:controller => 'projects', :action => 'move_issues', :id => @project, "issue_ids[]" => @issue.id }, :class => 'pic picMove' %>
51 <%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :post => true, :class => 'pic picDelete' %>
51 <%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :post => true, :class => 'pic picDelete' %>
52 </div>
52 </div>
53
53
54 <% if authorize_for('issues', 'change_status') and @status_options and !@status_options.empty? %>
54 <% if authorize_for('issues', 'change_status') and @status_options and !@status_options.empty? %>
55 <%= start_form_tag ({:controller => 'issues', :action => 'change_status', :id => @issue}) %>
55 <%= start_form_tag ({:controller => 'issues', :action => 'change_status', :id => @issue}) %>
56 <%=l(:label_change_status)%> :
56 <%=l(:label_change_status)%> :
57 <select name="new_status_id">
57 <select name="new_status_id">
58 <%= options_from_collection_for_select @status_options, "id", "name" %>
58 <%= options_from_collection_for_select @status_options, "id", "name" %>
59 </select>
59 </select>
60 <%= submit_tag l(:button_change) %>
60 <%= submit_tag l(:button_change) %>
61 <%= end_form_tag %>
61 <%= end_form_tag %>
62 <% end %>
62 <% end %>
63
63
64 </div>
64 </div>
65
65
66 <div id="history" class="box">
66 <div id="history" class="box">
67 <h3><%=l(:label_history)%>
67 <h3><%=l(:label_history)%>
68 <% if @journals_count > @journals.length %>(<%= l(:label_last_changes, @journals.length) %>)<% end %></h3>
68 <% if @journals_count > @journals.length %>(<%= l(:label_last_changes, @journals.length) %>)<% end %></h3>
69 <%= render :partial => 'history', :locals => { :journals => @journals } %>
69 <%= render :partial => 'history', :locals => { :journals => @journals } %>
70 <% if @journals_count > @journals.length %>
70 <% if @journals_count > @journals.length %>
71 <p><center><small>[ <%= link_to l(:label_change_view_all), :action => 'history', :id => @issue %> ]</small></center></p>
71 <p><center><small>[ <%= link_to l(:label_change_view_all), :action => 'history', :id => @issue %> ]</small></center></p>
72 <% end %>
72 <% end %>
73 </div>
73 </div>
74
74
75 <div class="box">
75 <div class="box">
76 <h3><%=l(:label_attachment_plural)%></h3>
76 <h3><%=l(:label_attachment_plural)%></h3>
77 <table width="100%">
77 <table width="100%">
78 <% for attachment in @issue.attachments %>
78 <% for attachment in @issue.attachments %>
79 <tr>
79 <tr>
80 <td><%= image_tag('attachment') %> <%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.filesize) %>)</td>
80 <td><%= image_tag('attachment') %> <%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.filesize) %>)</td>
81 <td><%= format_date(attachment.created_on) %></td>
81 <td><%= format_date(attachment.created_on) %></td>
82 <td><%= attachment.author.display_name %></td>
82 <td><%= attachment.author.display_name %></td>
83 <% if authorize_for('issues', 'destroy_attachment') %>
83 <% if authorize_for('issues', 'destroy_attachment') %>
84 <td>
84 <td>
85 <%= start_form_tag :action => 'destroy_attachment', :id => @issue, :attachment_id => attachment %>
85 <%= start_form_tag :action => 'destroy_attachment', :id => @issue, :attachment_id => attachment %>
86 <%= submit_tag l(:button_delete), :class => "button-small" %>
86 <%= submit_tag l(:button_delete), :class => "button-small" %>
87 <%= end_form_tag %>
87 <%= end_form_tag %>
88 </td>
88 </td>
89 <% end %>
89 <% end %>
90 </tr>
90 </tr>
91 <% end %>
91 <% end %>
92 </table>
92 </table>
93 <br />
93 <br />
94 <% if authorize_for('issues', 'add_attachment') %>
94 <% if authorize_for('issues', 'add_attachment') %>
95 <%= start_form_tag ({ :controller => 'issues', :action => 'add_attachment', :id => @issue }, :multipart => true, :class => "tabular") %>
95 <%= start_form_tag ({ :controller => 'issues', :action => 'add_attachment', :id => @issue }, :multipart => true, :class => "tabular") %>
96 <p id="attachments_p"><label><%=l(:label_attachment_new)%>&nbsp;
96 <p id="attachments_p"><label><%=l(:label_attachment_new)%>&nbsp;
97 <%= link_to_function image_tag('add'), "addFileField()" %></label>
97 <%= link_to_function image_tag('add'), "addFileField()" %></label>
98 <%= file_field_tag 'attachments[]', :size => 30 %></p>
98 <%= file_field_tag 'attachments[]', :size => 30 %></p>
99 <%= submit_tag l(:button_add) %>
99 <%= submit_tag l(:button_add) %>
100 <%= end_form_tag %>
100 <%= end_form_tag %>
101 <% end %>
101 <% end %>
102 </div>
102 </div>
103
103
104 <% if authorize_for('issues', 'add_note') %>
104 <% if authorize_for('issues', 'add_note') %>
105 <div class="box">
105 <div class="box">
106 <h3><%= l(:label_add_note) %></h3>
106 <h3><%= l(:label_add_note) %></h3>
107 <%= start_form_tag ({:controller => 'issues', :action => 'add_note', :id => @issue}, :class => "tabular" ) %>
107 <%= start_form_tag ({:controller => 'issues', :action => 'add_note', :id => @issue}, :class => "tabular" ) %>
108 <p><label for="notes"><%=l(:field_notes)%></label>
108 <p><label for="notes"><%=l(:field_notes)%></label>
109 <%= text_area_tag 'notes', '', :cols => 60, :rows => 10 %></p>
109 <%= text_area_tag 'notes', '', :cols => 60, :rows => 10 %></p>
110 <%= submit_tag l(:button_add) %>
110 <%= submit_tag l(:button_add) %>
111 <%= end_form_tag %>
111 <%= end_form_tag %>
112 </div>
112 </div>
113 <% end %>
113 <% end %>
@@ -1,45 +1,45
1 <h3><%= l(:label_calendar) %></h3>
1 <h3><%= l(:label_calendar) %></h3>
2
2
3 <%
3 <%
4 @date_from = Date.today - (Date.today.cwday-1)
4 @date_from = Date.today - (Date.today.cwday-1)
5 @date_to = Date.today + (7-Date.today.cwday)
5 @date_to = Date.today + (7-Date.today.cwday)
6 @issues = Issue.find :all,
6 @issues = Issue.find :all,
7 :conditions => ["issues.project_id in (#{@user.projects.collect{|m| m.id}.join(',')}) AND ((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?))", @date_from, @date_to, @date_from, @date_to],
7 :conditions => ["issues.project_id in (#{@user.projects.collect{|m| m.id}.join(',')}) AND ((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?))", @date_from, @date_to, @date_from, @date_to],
8 :include => [:project, :tracker] unless @user.projects.empty?
8 :include => [:project, :tracker] unless @user.projects.empty?
9 @issues ||= []
9 @issues ||= []
10 %>
10 %>
11
11
12 <table class="calenderTable">
12 <table class="calenderTable">
13 <tr class="ListHead">
13 <tr class="ListHead">
14 <td></td>
14 <td></td>
15 <% 1.upto(7) do |d| %>
15 <% 1.upto(7) do |d| %>
16 <td align="center" width="14%"><%= day_name(d) %></td>
16 <td align="center" width="14%"><%= day_name(d) %></td>
17 <% end %>
17 <% end %>
18 </tr>
18 </tr>
19 <tr height="100">
19 <tr height="100">
20 <% day = @date_from
20 <% day = @date_from
21 while day <= @date_to
21 while day <= @date_to
22 if day.cwday == 1 %>
22 if day.cwday == 1 %>
23 <td valign="middle"><%= day.cweek %></td>
23 <td valign="middle"><%= day.cweek %></td>
24 <% end %>
24 <% end %>
25 <td valign="top" width="14%" class="<%= day.month==@month ? "even" : "odd" %>">
25 <td valign="top" width="14%" class="<%= day.month==@month ? "even" : "odd" %>">
26 <p align="right"><%= day==Date.today ? "<b>#{day.day}</b>" : day.day %></p>
26 <p align="right"><%= day==Date.today ? "<b>#{day.day}</b>" : day.day %></p>
27 <% day_issues = []
27 <% day_issues = []
28 @issues.each { |i| day_issues << i if i.start_date == day or i.due_date == day }
28 @issues.each { |i| day_issues << i if i.start_date == day or i.due_date == day }
29 day_issues.each do |i| %>
29 day_issues.each do |i| %>
30 <%= if day == i.start_date and day == i.due_date
30 <%= if day == i.start_date and day == i.due_date
31 image_tag('arrow_bw')
31 image_tag('arrow_bw')
32 elsif day == i.start_date
32 elsif day == i.start_date
33 image_tag('arrow_from')
33 image_tag('arrow_from')
34 elsif day == i.due_date
34 elsif day == i.due_date
35 image_tag('arrow_to')
35 image_tag('arrow_to')
36 end %>
36 end %>
37 <small><%= link_to "#{i.tracker.name} ##{i.id}", :controller => 'issues', :action => 'show', :id => i %>: <%= i.subject.sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)') %></small><br />
37 <small><%= link_to "#{i.tracker.name} ##{i.id}", :controller => 'issues', :action => 'show', :id => i %>: <%=h i.subject.sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)') %></small><br />
38 <% end %>
38 <% end %>
39 </td>
39 </td>
40 <%= '</tr><tr height="100">' if day.cwday >= 7 and day!=@date_to %>
40 <%= '</tr><tr height="100">' if day.cwday >= 7 and day!=@date_to %>
41 <%
41 <%
42 day = day + 1
42 day = day + 1
43 end %>
43 end %>
44 </tr>
44 </tr>
45 </table> No newline at end of file
45 </table>
@@ -1,15 +1,7
1 <h3><%=l(:label_document_plural)%></h3>
1 <h3><%=l(:label_document_plural)%></h3>
2
2
3 <ul>
3 <%= render(:partial => 'documents/document',
4 <% for document in Document.find :all,
4 :collection => Document.find(:all,
5 :limit => 10,
5 :limit => 10,
6 :conditions => "documents.project_id in (#{@user.projects.collect{|m| m.id}.join(',')})",
6 :conditions => "documents.project_id in (#{@user.projects.collect{|m| m.id}.join(',')})",
7 :include => [:project] %>
7 :include => [:project])) unless @user.projects.empty? %> No newline at end of file
8 <li>
9 <b><%= link_to document.title, :controller => 'documents', :action => 'show', :id => document %></b>
10 <br />
11 <%= truncate document.description, 150 %><br />
12 <em><%= format_time(document.created_on) %></em><br />&nbsp;
13 </li>
14 <% end unless @user.projects.empty? %>
15 </ul> No newline at end of file
@@ -1,13 +1,7
1 <h3><%=l(:label_news_latest)%></h3>
1 <h3><%=l(:label_news_latest)%></h3>
2
2
3 <ul>
3 <%= render (:partial => 'news/news',
4 <% for news in News.find :all,
4 :collection => News.find(:all,
5 :limit => 10,
5 :limit => 10,
6 :conditions => "news.project_id in (#{@user.projects.collect{|m| m.id}.join(',')})",
6 :conditions => "news.project_id in (#{@user.projects.collect{|m| m.id}.join(',')})",
7 :include => [:project, :author] %>
7 :include => [:project, :author])) unless @user.projects.empty? %> No newline at end of file
8 <li><%= link_to news.title, :controller => 'news', :action => 'show', :id => news %><br />
9 <% unless news.summary.empty? %><%= news.summary %><br /><% end %>
10 <em><%= news.author.name %>, <%= format_time(news.created_on) %></em><br />&nbsp;
11 </li>
12 <% end unless @user.projects.empty? %>
13 </ul> No newline at end of file
@@ -1,30 +1,30
1 <h2><%=l(:label_my_page)%></h2>
1 <div class="contextual">
2
2 <%= link_to l(:label_personalize_page), :action => 'page_layout' %>
3 <div class="topright">
4 <small><%= link_to l(:label_personalize_page), :action => 'page_layout' %></small>
5 </div>
3 </div>
6
4
5 <h2><%=l(:label_my_page)%></h2>
6
7 <div id="list-top">
7 <div id="list-top">
8 <% @blocks['top'].each do |b| %>
8 <% @blocks['top'].each do |b| %>
9 <div class="mypage-box">
9 <div class="mypage-box">
10 <%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
10 <%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
11 </div>
11 </div>
12 <% end if @blocks['top'] %>
12 <% end if @blocks['top'] %>
13 </div>
13 </div>
14
14
15 <div id="list-left" class="splitcontentleft">
15 <div id="list-left" class="splitcontentleft">
16 <% @blocks['left'].each do |b| %>
16 <% @blocks['left'].each do |b| %>
17 <div class="mypage-box">
17 <div class="mypage-box">
18 <%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
18 <%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
19 </div>
19 </div>
20 <% end if @blocks['left'] %>
20 <% end if @blocks['left'] %>
21 </div>
21 </div>
22
22
23 <div id="list-right" class="splitcontentright">
23 <div id="list-right" class="splitcontentright">
24 <% @blocks['right'].each do |b| %>
24 <% @blocks['right'].each do |b| %>
25 <div class="mypage-box">
25 <div class="mypage-box">
26 <%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
26 <%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
27 </div>
27 </div>
28 <% end if @blocks['right'] %>
28 <% end if @blocks['right'] %>
29 </div>
29 </div>
30
30
@@ -1,121 +1,113
1 <script language="JavaScript">
1 <script language="JavaScript">
2
2
3 function recreateSortables() {
3 function recreateSortables() {
4 Sortable.destroy('list-top');
4 Sortable.destroy('list-top');
5 Sortable.destroy('list-left');
5 Sortable.destroy('list-left');
6 Sortable.destroy('list-right');
6 Sortable.destroy('list-right');
7
7
8 Sortable.create("list-top", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=top', {asynchronous:true, evalScripts:true, onComplete:function(request){new Effect.Highlight("list-top",{});}, onLoaded:function(request){Element.hide('indicator')}, onLoading:function(request){Element.show('indicator')}, parameters:Sortable.serialize("list-top")})}, only:'mypage-box', tag:'div'})
8 Sortable.create("list-top", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=top', {asynchronous:true, evalScripts:true, onComplete:function(request){new Effect.Highlight("list-top",{});}, onLoaded:function(request){Element.hide('indicator')}, onLoading:function(request){Element.show('indicator')}, parameters:Sortable.serialize("list-top")})}, only:'mypage-box', tag:'div'})
9 Sortable.create("list-left", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=left', {asynchronous:true, evalScripts:true, onComplete:function(request){new Effect.Highlight("list-left",{});}, onLoaded:function(request){Element.hide('indicator')}, onLoading:function(request){Element.show('indicator')}, parameters:Sortable.serialize("list-left")})}, only:'mypage-box', tag:'div'})
9 Sortable.create("list-left", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=left', {asynchronous:true, evalScripts:true, onComplete:function(request){new Effect.Highlight("list-left",{});}, onLoaded:function(request){Element.hide('indicator')}, onLoading:function(request){Element.show('indicator')}, parameters:Sortable.serialize("list-left")})}, only:'mypage-box', tag:'div'})
10 Sortable.create("list-right", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=right', {asynchronous:true, evalScripts:true, onComplete:function(request){new Effect.Highlight("list-right",{});}, onLoaded:function(request){Element.hide('indicator')}, onLoading:function(request){Element.show('indicator')}, parameters:Sortable.serialize("list-right")})}, only:'mypage-box', tag:'div'})
10 Sortable.create("list-right", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=right', {asynchronous:true, evalScripts:true, onComplete:function(request){new Effect.Highlight("list-right",{});}, onLoaded:function(request){Element.hide('indicator')}, onLoading:function(request){Element.show('indicator')}, parameters:Sortable.serialize("list-right")})}, only:'mypage-box', tag:'div'})
11 }
11 }
12
12
13 function updateSelect() {
13 function updateSelect() {
14 s = $('block-select')
14 s = $('block-select')
15 for (var i = 0; i < s.options.length; i++) {
15 for (var i = 0; i < s.options.length; i++) {
16 if ($('block_' + s.options[i].value)) {
16 if ($('block_' + s.options[i].value)) {
17 s.options[i].disabled = true;
17 s.options[i].disabled = true;
18 } else {
18 } else {
19 s.options[i].disabled = false;
19 s.options[i].disabled = false;
20 }
20 }
21 }
21 }
22 s.options[0].selected = true;
22 s.options[0].selected = true;
23 }
23 }
24
24
25 function afterAddBlock() {
25 function afterAddBlock() {
26 recreateSortables();
26 recreateSortables();
27 updateSelect();
27 updateSelect();
28 }
28 }
29
29
30 function removeBlock(block) {
30 function removeBlock(block) {
31 $(block).parentNode.removeChild($(block));
31 $(block).parentNode.removeChild($(block));
32 updateSelect();
32 updateSelect();
33 }
33 }
34
34
35 </script>
35 </script>
36
36
37 <div style="float:right;">
37 <div class="contextual">
38 <span id="indicator" style="display:none"><%= image_tag "loading.gif", :align => "absmiddle" %></span>
38 <%= start_form_tag({:action => "add_block"}, :id => "block-form") %>
39 <%= start_form_tag({:action => "add_block"}, :id => "block-form") %>
39
40 <%= select_tag 'block', "<option></option>" + options_for_select(@block_options), :id => "block-select" %>
40 <%= select_tag 'block', "<option></option>" + options_for_select(@block_options), :id => "block-select", :class => "select-small" %>
41 <small>
42 <%= link_to_remote l(:button_add),
41 <%= link_to_remote l(:button_add),
43 :url => { :action => "add_block" },
42 :url => { :action => "add_block" },
44 :with => "Form.serialize('block-form')",
43 :with => "Form.serialize('block-form')",
45 :update => "list-top",
44 :update => "list-top",
46 :position => :top,
45 :position => :top,
47 :complete => "afterAddBlock();",
46 :complete => "afterAddBlock();",
48 :loading => "Element.show('indicator')",
47 :loading => "Element.show('indicator')",
49 :loaded => "Element.hide('indicator')"
48 :loaded => "Element.hide('indicator')"
50 %>
49 %>
51 </small>
50 <%= end_form_tag %> |
52 <%= end_form_tag %>
53 <small>|
54 <%= link_to l(:button_save), :action => 'page_layout_save' %> |
51 <%= link_to l(:button_save), :action => 'page_layout_save' %> |
55 <%= link_to l(:button_cancel), :action => 'page' %>
52 <%= link_to l(:button_cancel), :action => 'page' %>
56 </small>
57 </div>
58
59 <div style="float:right;margin-right:20px;">
60 <span id="indicator" style="display:none"><%= image_tag "loading.gif" %></span>
61 </div>
53 </div>
62
54
63 <h2><%=l(:label_my_page)%></h2>
55 <h2><%=l(:label_my_page)%></h2>
64
56
65 <div id="list-top" class="block-receiver">
57 <div id="list-top" class="block-receiver">
66 <% @blocks['top'].each do |b| %>
58 <% @blocks['top'].each do |b| %>
67 <%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
59 <%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
68 <% end if @blocks['top'] %>
60 <% end if @blocks['top'] %>
69 </div>
61 </div>
70
62
71 <div id="list-left" class="splitcontentleft block-receiver">
63 <div id="list-left" class="splitcontentleft block-receiver">
72 <% @blocks['left'].each do |b| %>
64 <% @blocks['left'].each do |b| %>
73 <%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
65 <%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
74 <% end if @blocks['left'] %>
66 <% end if @blocks['left'] %>
75 </div>
67 </div>
76
68
77 <div id="list-right" class="splitcontentright block-receiver">
69 <div id="list-right" class="splitcontentright block-receiver">
78 <% @blocks['right'].each do |b| %>
70 <% @blocks['right'].each do |b| %>
79 <%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
71 <%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
80 <% end if @blocks['right'] %>
72 <% end if @blocks['right'] %>
81 </div>
73 </div>
82
74
83 <%= sortable_element 'list-top',
75 <%= sortable_element 'list-top',
84 :tag => 'div',
76 :tag => 'div',
85 :only => 'mypage-box',
77 :only => 'mypage-box',
86 :handle => "handle",
78 :handle => "handle",
87 :dropOnEmpty => true,
79 :dropOnEmpty => true,
88 :containment => ['list-top', 'list-left', 'list-right'],
80 :containment => ['list-top', 'list-left', 'list-right'],
89 :constraint => false,
81 :constraint => false,
90 :complete => visual_effect(:highlight, 'list-top'),
82 :complete => visual_effect(:highlight, 'list-top'),
91 :url => { :action => "order_blocks", :group => "top" },
83 :url => { :action => "order_blocks", :group => "top" },
92 :loading => "Element.show('indicator')",
84 :loading => "Element.show('indicator')",
93 :loaded => "Element.hide('indicator')"
85 :loaded => "Element.hide('indicator')"
94 %>
86 %>
95
87
96
88
97 <%= sortable_element 'list-left',
89 <%= sortable_element 'list-left',
98 :tag => 'div',
90 :tag => 'div',
99 :only => 'mypage-box',
91 :only => 'mypage-box',
100 :handle => "handle",
92 :handle => "handle",
101 :dropOnEmpty => true,
93 :dropOnEmpty => true,
102 :containment => ['list-top', 'list-left', 'list-right'],
94 :containment => ['list-top', 'list-left', 'list-right'],
103 :constraint => false,
95 :constraint => false,
104 :complete => visual_effect(:highlight, 'list-left'),
96 :complete => visual_effect(:highlight, 'list-left'),
105 :url => { :action => "order_blocks", :group => "left" },
97 :url => { :action => "order_blocks", :group => "left" },
106 :loading => "Element.show('indicator')",
98 :loading => "Element.show('indicator')",
107 :loaded => "Element.hide('indicator')" %>
99 :loaded => "Element.hide('indicator')" %>
108
100
109 <%= sortable_element 'list-right',
101 <%= sortable_element 'list-right',
110 :tag => 'div',
102 :tag => 'div',
111 :only => 'mypage-box',
103 :only => 'mypage-box',
112 :handle => "handle",
104 :handle => "handle",
113 :dropOnEmpty => true,
105 :dropOnEmpty => true,
114 :containment => ['list-top', 'list-left', 'list-right'],
106 :containment => ['list-top', 'list-left', 'list-right'],
115 :constraint => false,
107 :constraint => false,
116 :complete => visual_effect(:highlight, 'list-right'),
108 :complete => visual_effect(:highlight, 'list-right'),
117 :url => { :action => "order_blocks", :group => "right" },
109 :url => { :action => "order_blocks", :group => "right" },
118 :loading => "Element.show('indicator')",
110 :loading => "Element.show('indicator')",
119 :loaded => "Element.hide('indicator')" %>
111 :loaded => "Element.hide('indicator')" %>
120
112
121 <%= javascript_tag "updateSelect()" %> No newline at end of file
113 <%= javascript_tag "updateSelect()" %>
@@ -1,34 +1,34
1 <div class="contextual">
1 <div class="contextual">
2 <%= link_to_if_authorized l(:button_edit), {:controller => 'news', :action => 'edit', :id => @news}, :class => 'pic picEdit' %>
2 <%= link_to_if_authorized l(:button_edit), {:controller => 'news', :action => 'edit', :id => @news}, :class => 'pic picEdit' %>
3 <%= link_to_if_authorized l(:button_delete), {:controller => 'news', :action => 'destroy', :id => @news}, :confirm => l(:text_are_you_sure), :post => true, :class => 'pic picDelete' %>
3 <%= link_to_if_authorized l(:button_delete), {:controller => 'news', :action => 'destroy', :id => @news}, :confirm => l(:text_are_you_sure), :post => true, :class => 'pic picDelete' %>
4 </div>
4 </div>
5
5
6 <h2><%= @news.title %></h2>
6 <h2><%=h @news.title %></h2>
7
7
8 <p><em><%= @news.summary %><br />
8 <p><em><%=h @news.summary %><br />
9 <%= @news.author.display_name %>, <%= format_time(@news.created_on) %></em></p>
9 <%= @news.author.display_name %>, <%= format_time(@news.created_on) %></em></p>
10 <br />
10 <br />
11 <%= textilizable auto_link @news.description %>
11 <%= textilizable auto_link @news.description %>
12 <br />
12 <br />
13
13
14 <div id="comments" style="margin-bottom:16px;">
14 <div id="comments" style="margin-bottom:16px;">
15 <h3><%= l(:label_comment_plural) %></h3>
15 <h3><%= l(:label_comment_plural) %></h3>
16 <% @news.comments.each do |comment| %>
16 <% @news.comments.each do |comment| %>
17 <% next if comment.new_record? %>
17 <% next if comment.new_record? %>
18 <h4><%= format_time(comment.created_on) %> - <%= comment.author.name %></h4>
18 <h4><%= format_time(comment.created_on) %> - <%= comment.author.name %></h4>
19 <div class="contextual">
19 <div class="contextual">
20 <%= link_to_if_authorized l(:button_delete), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment}, :confirm => l(:text_are_you_sure), :post => true, :class => 'pic picDelete' %>
20 <%= link_to_if_authorized l(:button_delete), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment}, :confirm => l(:text_are_you_sure), :post => true, :class => 'pic picDelete' %>
21 </div>
21 </div>
22 <%= simple_format(auto_link(h comment.comment))%>
22 <%= simple_format(auto_link(h comment.comment))%>
23 <% end if @news.comments_count > 0 %>
23 <% end if @news.comments_count > 0 %>
24 </div>
24 </div>
25
25
26 <% if authorize_for 'news', 'add_comment' %>
26 <% if authorize_for 'news', 'add_comment' %>
27 <h3><%= l(:label_comment_add) %></h3>
27 <h3><%= l(:label_comment_add) %></h3>
28 <%= start_form_tag :action => 'add_comment', :id => @news %>
28 <%= start_form_tag :action => 'add_comment', :id => @news %>
29 <%= error_messages_for 'comment' %>
29 <%= error_messages_for 'comment' %>
30 <p><label for="comment_comment"><%= l(:field_comment) %></label><br />
30 <p><label for="comment_comment"><%= l(:field_comment) %></label><br />
31 <%= text_area 'comment', 'comment', :cols => 60, :rows => 6 %></p>
31 <%= text_area 'comment', 'comment', :cols => 60, :rows => 6 %></p>
32 <%= submit_tag l(:button_add) %>
32 <%= submit_tag l(:button_add) %>
33 <%= end_form_tag %>
33 <%= end_form_tag %>
34 <% end %> No newline at end of file
34 <% end %>
@@ -1,56 +1,56
1 <h2><%=l(:label_activity)%>: <%= "#{month_name(@month).downcase} #{@year}" %></h2>
1 <h2><%=l(:label_activity)%>: <%= "#{month_name(@month).downcase} #{@year}" %></h2>
2
2
3 <div>
3 <div>
4 <div class="rightbox">
4 <div class="rightbox">
5 <%= start_form_tag %>
5 <%= start_form_tag %>
6 <p><%= select_month(@month, :prefix => "month", :discard_type => true) %>
6 <p><%= select_month(@month, :prefix => "month", :discard_type => true) %>
7 <%= select_year(@year, :prefix => "year", :discard_type => true) %></p>
7 <%= select_year(@year, :prefix => "year", :discard_type => true) %></p>
8 <%= check_box_tag 'show_issues', 1, @show_issues %><%= hidden_field_tag 'show_issues', 0 %> <%=l(:label_issue_plural)%><br />
8 <%= check_box_tag 'show_issues', 1, @show_issues %><%= hidden_field_tag 'show_issues', 0 %> <%=l(:label_issue_plural)%><br />
9 <%= check_box_tag 'show_news', 1, @show_news %><%= hidden_field_tag 'show_news', 0 %> <%=l(:label_news_plural)%><br />
9 <%= check_box_tag 'show_news', 1, @show_news %><%= hidden_field_tag 'show_news', 0 %> <%=l(:label_news_plural)%><br />
10 <%= check_box_tag 'show_files', 1, @show_files %><%= hidden_field_tag 'show_files', 0 %> <%=l(:label_attachment_plural)%><br />
10 <%= check_box_tag 'show_files', 1, @show_files %><%= hidden_field_tag 'show_files', 0 %> <%=l(:label_attachment_plural)%><br />
11 <%= check_box_tag 'show_documents', 1, @show_documents %><%= hidden_field_tag 'show_documents', 0 %> <%=l(:label_document_plural)%><br />
11 <%= check_box_tag 'show_documents', 1, @show_documents %><%= hidden_field_tag 'show_documents', 0 %> <%=l(:label_document_plural)%><br />
12 <p><center><%= submit_tag l(:button_apply), :class => 'button-small' %></center></p>
12 <p><center><%= submit_tag l(:button_apply), :class => 'button-small' %></center></p>
13 <%= end_form_tag %>
13 <%= end_form_tag %>
14 </div>
14 </div>
15 <% @events_by_day.keys.sort {|x,y| y <=> x }.each do |day| %>
15 <% @events_by_day.keys.sort {|x,y| y <=> x }.each do |day| %>
16 <h3><%= day_name(day.cwday) %> <%= day.day %></h3>
16 <h3><%= day_name(day.cwday) %> <%= day.day %></h3>
17 <ul>
17 <ul>
18 <% @events_by_day[day].sort {|x,y| y.created_on <=> x.created_on }.each do |e| %>
18 <% @events_by_day[day].sort {|x,y| y.created_on <=> x.created_on }.each do |e| %>
19 <li><p>
19 <li><p>
20 <% if e.is_a? Issue %>
20 <% if e.is_a? Issue %>
21 <%= e.created_on.strftime("%H:%M") %> <%= link_to "#{e.tracker.name} ##{e.id}", :controller => 'issues', :action => 'show', :id => e %> (<%= e.status.name %>): <%= e.subject %><br />
21 <%= e.created_on.strftime("%H:%M") %> <%= link_to "#{e.tracker.name} ##{e.id}", :controller => 'issues', :action => 'show', :id => e %> (<%= e.status.name %>): <%=h e.subject %><br />
22 <i><%= e.author.name %></i>
22 <i><%= e.author.name %></i>
23 <% elsif e.is_a? News %>
23 <% elsif e.is_a? News %>
24 <%= e.created_on.strftime("%H:%M") %> <%=l(:label_news)%>: <%= link_to e.title, :controller => 'news', :action => 'show', :id => e %><br />
24 <%= e.created_on.strftime("%H:%M") %> <%=l(:label_news)%>: <%= link_to h(e.title), :controller => 'news', :action => 'show', :id => e %><br />
25 <% unless e.summary.empty? %><%= e.summary %><br /><% end %>
25 <% unless e.summary.empty? %><%=h e.summary %><br /><% end %>
26 <i><%= e.author.name %></i>
26 <i><%= e.author.name %></i>
27 <% elsif (e.is_a? Attachment) and (e.container.is_a? Version) %>
27 <% elsif (e.is_a? Attachment) and (e.container.is_a? Version) %>
28 <%= e.created_on.strftime("%H:%M") %> <%=l(:label_attachment)%> (<%= e.container.name %>): <%= link_to e.filename, :controller => 'projects', :action => 'list_files', :id => @project %><br />
28 <%= e.created_on.strftime("%H:%M") %> <%=l(:label_attachment)%> (<%=h e.container.name %>): <%= link_to e.filename, :controller => 'projects', :action => 'list_files', :id => @project %><br />
29 <i><%= e.author.name %></i>
29 <i><%= e.author.name %></i>
30 <% elsif (e.is_a? Attachment) and (e.container.is_a? Document) %>
30 <% elsif (e.is_a? Attachment) and (e.container.is_a? Document) %>
31 <%= e.created_on.strftime("%H:%M") %> <%=l(:label_attachment)%>: <%= e.filename %> (<%= link_to e.container.title, :controller => 'documents', :action => 'show', :id => e.container %>)<br />
31 <%= e.created_on.strftime("%H:%M") %> <%=l(:label_attachment)%>: <%= e.filename %> (<%= link_to h(e.container.title), :controller => 'documents', :action => 'show', :id => e.container %>)<br />
32 <i><%= e.author.name %></i>
32 <i><%= e.author.name %></i>
33 <% elsif e.is_a? Document %>
33 <% elsif e.is_a? Document %>
34 <%= e.created_on.strftime("%H:%M") %> <%=l(:label_document)%>: <%= link_to e.title, :controller => 'documents', :action => 'show', :id => e %><br />
34 <%= e.created_on.strftime("%H:%M") %> <%=l(:label_document)%>: <%= link_to h(e.title), :controller => 'documents', :action => 'show', :id => e %><br />
35 <% end %>
35 <% end %>
36 </p></li>
36 </p></li>
37
37
38 <% end %>
38 <% end %>
39 </ul>
39 </ul>
40 <% end %>
40 <% end %>
41 <% if @events_by_day.empty? %><p><i><%= l(:label_no_data) %></i></p><% end %>
41 <% if @events_by_day.empty? %><p><i><%= l(:label_no_data) %></i></p><% end %>
42
42
43 <div style="float:left;">
43 <div style="float:left;">
44 <%= link_to_remote ('&#171; ' + (@month==1 ? "#{month_name(12)} #{@year-1}" : "#{month_name(@month-1)}")),
44 <%= link_to_remote ('&#171; ' + (@month==1 ? "#{month_name(12)} #{@year-1}" : "#{month_name(@month-1)}")),
45 {:update => "content", :url => { :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1) }},
45 {:update => "content", :url => { :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1) }},
46 {:href => url_for(:action => 'activity', :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1))}
46 {:href => url_for(:action => 'activity', :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1))}
47 %>
47 %>
48 </div>
48 </div>
49 <div style="float:right;">
49 <div style="float:right;">
50 <%= link_to_remote ((@month==12 ? "#{month_name(1)} #{@year+1}" : "#{month_name(@month+1)}") + ' &#187;'),
50 <%= link_to_remote ((@month==12 ? "#{month_name(1)} #{@year+1}" : "#{month_name(@month+1)}") + ' &#187;'),
51 {:update => "content", :url => { :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1) }},
51 {:update => "content", :url => { :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1) }},
52 {:href => url_for(:action => 'activity', :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1))}
52 {:href => url_for(:action => 'activity', :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1))}
53 %>&nbsp;
53 %>&nbsp;
54 </div>
54 </div>
55 <br />
55 <br />
56 </div> No newline at end of file
56 </div>
@@ -1,66 +1,66
1 <h2><%= l(:label_calendar) %></h2>
1 <h2><%= l(:label_calendar) %></h2>
2
2
3 <table width="100%">
3 <table width="100%">
4 <tr>
4 <tr>
5 <td align="left" width="150">
5 <td align="left" width="150">
6 <%= link_to_remote ('&#171; ' + (@month==1 ? "#{month_name(12)} #{@year-1}" : "#{month_name(@month-1)}")),
6 <%= link_to_remote ('&#171; ' + (@month==1 ? "#{month_name(12)} #{@year-1}" : "#{month_name(@month-1)}")),
7 {:update => "content", :url => { :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1) }},
7 {:update => "content", :url => { :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1) }},
8 {:href => url_for(:action => 'calendar', :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1))}
8 {:href => url_for(:action => 'calendar', :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1))}
9 %>
9 %>
10 </td>
10 </td>
11 <td align="center">
11 <td align="center">
12 <%= start_form_tag :action => 'calendar', :id => @project %>
12 <%= start_form_tag :action => 'calendar', :id => @project %>
13 <%= select_month(@month, :prefix => "month", :discard_type => true) %>
13 <%= select_month(@month, :prefix => "month", :discard_type => true) %>
14 <%= select_year(@year, :prefix => "year", :discard_type => true) %>
14 <%= select_year(@year, :prefix => "year", :discard_type => true) %>
15 <%= submit_tag l(:button_submit), :class => "button-small" %>
15 <%= submit_tag l(:button_submit), :class => "button-small" %>
16 <%= end_form_tag %>
16 <%= end_form_tag %>
17 </td>
17 </td>
18 <td align="right" width="150">
18 <td align="right" width="150">
19 <%= link_to_remote ((@month==12 ? "#{month_name(1)} #{@year+1}" : "#{month_name(@month+1)}") + ' &#187;'),
19 <%= link_to_remote ((@month==12 ? "#{month_name(1)} #{@year+1}" : "#{month_name(@month+1)}") + ' &#187;'),
20 {:update => "content", :url => { :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1) }},
20 {:update => "content", :url => { :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1) }},
21 {:href => url_for(:action => 'calendar', :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1))}
21 {:href => url_for(:action => 'calendar', :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1))}
22 %>&nbsp;
22 %>&nbsp;
23 </td>
23 </td>
24 </tr>
24 </tr>
25 </table>
25 </table>
26 <br />
26 <br />
27
27
28 <table class="calenderTable">
28 <table class="calenderTable">
29 <tr class="ListHead">
29 <tr class="ListHead">
30 <td></td>
30 <td></td>
31 <% 1.upto(7) do |d| %>
31 <% 1.upto(7) do |d| %>
32 <td align="center" width="14%"><%= day_name(d) %></td>
32 <td align="center" width="14%"><%= day_name(d) %></td>
33 <% end %>
33 <% end %>
34 </tr>
34 </tr>
35 <tr height="100">
35 <tr height="100">
36 <% day = @date_from
36 <% day = @date_from
37 while day <= @date_to
37 while day <= @date_to
38 if day.cwday == 1 %>
38 if day.cwday == 1 %>
39 <td valign="middle"><%= day.cweek %></td>
39 <td valign="middle"><%= day.cweek %></td>
40 <% end %>
40 <% end %>
41 <td valign="top" width="14%" class="<%= day.month==@month ? "even" : "odd" %>">
41 <td valign="top" width="14%" class="<%= day.month==@month ? "even" : "odd" %>">
42 <p align="right"><%= day==Date.today ? "<b>#{day.day}</b>" : day.day %></p>
42 <p align="right"><%= day==Date.today ? "<b>#{day.day}</b>" : day.day %></p>
43 <% day_issues = []
43 <% day_issues = []
44 @issues.each { |i| day_issues << i if i.start_date == day or i.due_date == day }
44 @issues.each { |i| day_issues << i if i.start_date == day or i.due_date == day }
45 day_issues.each do |i| %>
45 day_issues.each do |i| %>
46 <%= if day == i.start_date and day == i.due_date
46 <%= if day == i.start_date and day == i.due_date
47 image_tag('arrow_bw')
47 image_tag('arrow_bw')
48 elsif day == i.start_date
48 elsif day == i.start_date
49 image_tag('arrow_from')
49 image_tag('arrow_from')
50 elsif day == i.due_date
50 elsif day == i.due_date
51 image_tag('arrow_to')
51 image_tag('arrow_to')
52 end %>
52 end %>
53 <small><%= link_to "#{i.tracker.name} ##{i.id}", :controller => 'issues', :action => 'show', :id => i %>: <%= i.subject.sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)') %></small><br />
53 <small><%= link_to "#{i.tracker.name} ##{i.id}", :controller => 'issues', :action => 'show', :id => i %>: <%=h i.subject.sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)') %></small><br />
54 <% end %>
54 <% end %>
55 </td>
55 </td>
56 <%= '</tr><tr height="100">' if day.cwday >= 7 and day!=@date_to %>
56 <%= '</tr><tr height="100">' if day.cwday >= 7 and day!=@date_to %>
57 <%
57 <%
58 day = day + 1
58 day = day + 1
59 end %>
59 end %>
60 </tr>
60 </tr>
61 </table>
61 </table>
62
62
63 <br />
63 <br />
64 <%= image_tag 'arrow_from' %>&nbsp;&nbsp;<%= l(:text_tip_task_begin_day) %><br />
64 <%= image_tag 'arrow_from' %>&nbsp;&nbsp;<%= l(:text_tip_task_begin_day) %><br />
65 <%= image_tag 'arrow_to' %>&nbsp;&nbsp;<%= l(:text_tip_task_end_day) %><br />
65 <%= image_tag 'arrow_to' %>&nbsp;&nbsp;<%= l(:text_tip_task_end_day) %><br />
66 <%= image_tag 'arrow_bw' %>&nbsp;&nbsp;<%= l(:text_tip_task_begin_end_day) %><br /> No newline at end of file
66 <%= image_tag 'arrow_bw' %>&nbsp;&nbsp;<%= l(:text_tip_task_begin_end_day) %><br />
@@ -1,28 +1,28
1 <h2><%=l(:label_change_log)%></h2>
1 <h2><%=l(:label_change_log)%></h2>
2
2
3 <div>
3 <div>
4
4
5 <div class="rightbox" style="width:140px;">
5 <div class="rightbox" style="width:140px;">
6 <%= start_form_tag %>
6 <%= start_form_tag %>
7 <strong><%=l(:label_tracker_plural)%></strong><br />
7 <strong><%=l(:label_tracker_plural)%></strong><br />
8 <% @trackers.each do |tracker| %>
8 <% @trackers.each do |tracker| %>
9 <%= check_box_tag "tracker_ids[]", tracker.id, (@selected_tracker_ids.include? tracker.id.to_s) %>
9 <%= check_box_tag "tracker_ids[]", tracker.id, (@selected_tracker_ids.include? tracker.id.to_s) %>
10 <%= tracker.name %><br />
10 <%= tracker.name %><br />
11 <% end %>
11 <% end %>
12 <p><center><%= submit_tag l(:button_apply), :class => 'button-small' %></center></p>
12 <p><center><%= submit_tag l(:button_apply), :class => 'button-small' %></center></p>
13 <%= end_form_tag %>
13 <%= end_form_tag %>
14 </div>
14 </div>
15
15
16 <% ver_id = nil
16 <% ver_id = nil
17 @fixed_issues.each do |issue| %>
17 @fixed_issues.each do |issue| %>
18 <% unless ver_id == issue.fixed_version_id %>
18 <% unless ver_id == issue.fixed_version_id %>
19 <% if ver_id %></ul><% end %>
19 <% if ver_id %></ul><% end %>
20 <h3><%= l(:label_version) %>: <%= issue.fixed_version.name %></h3>
20 <h3><%= l(:label_version) %>: <%= issue.fixed_version.name %></h3>
21 <p><%= format_date(issue.fixed_version.effective_date) %><br />
21 <p><%= format_date(issue.fixed_version.effective_date) %><br />
22 <%=h issue.fixed_version.description %></p>
22 <%=h issue.fixed_version.description %></p>
23 <ul>
23 <ul>
24 <% ver_id = issue.fixed_version_id
24 <% ver_id = issue.fixed_version_id
25 end %>
25 end %>
26 <li><%= link_to issue.long_id, :controller => 'issues', :action => 'show', :id => issue %> [<%= issue.tracker.name %>]: <%= issue.subject %></li>
26 <li><%= link_to issue.long_id, :controller => 'issues', :action => 'show', :id => issue %> [<%= issue.tracker.name %>]: <%=h issue.subject %></li>
27 <% end %>
27 <% end %>
28 </div> No newline at end of file
28 </div>
@@ -1,11 +1,10
1 <% pdf=IfpdfHelper::IFPDF.new
1 <% pdf=IfpdfHelper::IFPDF.new
2 pdf.AliasNbPages
2 pdf.AliasNbPages
3 pdf.footer_date = format_date(Date.today)
3 pdf.footer_date = format_date(Date.today)
4 pdf.AddPage
5 @issues.each {|i|
4 @issues.each {|i|
6 render :partial => 'issues/pdf', :locals => { :pdf => pdf, :issue => i }
7 pdf.AddPage
5 pdf.AddPage
6 render :partial => 'issues/pdf', :locals => { :pdf => pdf, :issue => i }
8 }
7 }
9 %>
8 %>
10
9
11 <%= pdf.Output %> No newline at end of file
10 <%= pdf.Output %>
@@ -1,241 +1,241
1 <div class="contextual">
1 <div class="contextual">
2 <%= l(:label_export_to) %>
2 <%= l(:label_export_to) %>
3 <%= link_to 'PDF', {:zoom => @zoom, :year => @year_from, :month => @month_from, :months => @months, :output => 'pdf'}, :class => 'pic picPdf' %>
3 <%= link_to 'PDF', {:zoom => @zoom, :year => @year_from, :month => @month_from, :months => @months, :output => 'pdf'}, :class => 'pic picPdf' %>
4 </div>
4 </div>
5
5
6 <h2><%= l(:label_gantt) %></h2>
6 <h2><%= l(:label_gantt) %></h2>
7
7
8 <table width="100%">
8 <table width="100%">
9 <tr>
9 <tr>
10 <td align="left">
10 <td align="left">
11 <%= start_form_tag %>
11 <%= start_form_tag %>
12 <input type="text" name="months" size="2" value="<%= @months %>">
12 <input type="text" name="months" size="2" value="<%= @months %>">
13 <%= l(:label_months_from) %>
13 <%= l(:label_months_from) %>
14 <%= select_month(@month_from, :prefix => "month", :discard_type => true) %>
14 <%= select_month(@month_from, :prefix => "month", :discard_type => true) %>
15 <%= select_year(@year_from, :prefix => "year", :discard_type => true) %>
15 <%= select_year(@year_from, :prefix => "year", :discard_type => true) %>
16 <%= hidden_field_tag 'zoom', @zoom %>
16 <%= hidden_field_tag 'zoom', @zoom %>
17 <%= submit_tag l(:button_submit), :class => "button-small" %>
17 <%= submit_tag l(:button_submit), :class => "button-small" %>
18 <%= end_form_tag %>
18 <%= end_form_tag %>
19 </td>
19 </td>
20 <td align="right">
20 <td align="right">
21 <%= if @zoom < 4
21 <%= if @zoom < 4
22 link_to image_tag('zoom_in'), {:zoom => (@zoom+1), :year => @year_from, :month => @month_from, :months => @months}
22 link_to image_tag('zoom_in'), {:zoom => (@zoom+1), :year => @year_from, :month => @month_from, :months => @months}
23 else
23 else
24 image_tag 'zoom_in_g'
24 image_tag 'zoom_in_g'
25 end %>
25 end %>
26 <%= if @zoom > 1
26 <%= if @zoom > 1
27 link_to image_tag('zoom_out'), :zoom => (@zoom-1), :year => @year_from, :month => @month_from, :months => @months
27 link_to image_tag('zoom_out'), :zoom => (@zoom-1), :year => @year_from, :month => @month_from, :months => @months
28 else
28 else
29 image_tag 'zoom_out_g'
29 image_tag 'zoom_out_g'
30 end %>
30 end %>
31 </td>
31 </td>
32 </tr>
32 </tr>
33 </table>
33 </table>
34 <br />
34 <br />
35
35
36 <style>
36 <style>
37 .m_bg {
37 .m_bg {
38 position:absolute;
38 position:absolute;
39 top:0;
39 top:0;
40 height:16px;
40 height:16px;
41 border-top: 1px solid #c0c0c0;
41 border-top: 1px solid #c0c0c0;
42 border-bottom: 1px solid #c0c0c0;
42 border-bottom: 1px solid #c0c0c0;
43 border-right: 1px solid #c0c0c0;
43 border-right: 1px solid #c0c0c0;
44 text-align: center;
44 text-align: center;
45 }
45 }
46
46
47 .task {
47 .task {
48 position: absolute;
48 position: absolute;
49 height:8px;
49 height:8px;
50 font-size:0.8em;
50 font-size:0.8em;
51 color:#888;
51 color:#888;
52 background:#aaa;
52 background:#aaa;
53 padding:0;
53 padding:0;
54 margin:0;
54 margin:0;
55 line-height:0.8em;
55 line-height:0.8em;
56 }
56 }
57
57
58 .task_late {
58 .task_late {
59 background:#f66;
59 background:#f66;
60 }
60 }
61
61
62 .task_done {
62 .task_done {
63 background:#66f;
63 background:#66f;
64 }
64 }
65 </style>
65 </style>
66
66
67 <% zoom = 1
67 <% zoom = 1
68 @zoom.times { zoom = zoom * 2 }
68 @zoom.times { zoom = zoom * 2 }
69
69
70 subject_width = 260
70 subject_width = 260
71 header_heigth = 18
71 header_heigth = 18
72
72
73 headers_heigth = header_heigth
73 headers_heigth = header_heigth
74 show_weeks = false
74 show_weeks = false
75 show_days = false
75 show_days = false
76
76
77 if @zoom >1
77 if @zoom >1
78 show_weeks = true
78 show_weeks = true
79 headers_heigth = 2*header_heigth
79 headers_heigth = 2*header_heigth
80 if @zoom > 2
80 if @zoom > 2
81 show_days = true
81 show_days = true
82 headers_heigth = 3*header_heigth
82 headers_heigth = 3*header_heigth
83 end
83 end
84 end
84 end
85
85
86 g_width = (@date_to - @date_from + 1)*zoom
86 g_width = (@date_to - @date_from + 1)*zoom
87 g_height = [(20 * @issues.length + 6), 206].max
87 g_height = [(20 * @issues.length + 6), 206].max
88 t_height = g_height + headers_heigth
88 t_height = g_height + headers_heigth
89 %>
89 %>
90
90
91 <table width="100%" border=0 cellspacing=0 cellpading=0>
91 <table width="100%" border=0 cellspacing=0 cellpading=0>
92 <tr>
92 <tr>
93 <td width=260>
93 <td width=260>
94
94
95 <div style="position:relative;height:<%= t_height + 24 %>px;width:<%= subject_width + 1 %>px;">
95 <div style="position:relative;height:<%= t_height + 24 %>px;width:<%= subject_width + 1 %>px;">
96 <div style="right:-2px;width:<%= subject_width %>px;height:<%= headers_heigth %>px;" class="m_bg"></div>
96 <div style="right:-2px;width:<%= subject_width %>px;height:<%= headers_heigth %>px;" class="m_bg"></div>
97 <div style="right:-2px;width:<%= subject_width %>px;height:<%= t_height %>px;border-left: 1px solid #c0c0c0;" class="m_bg"></div>
97 <div style="right:-2px;width:<%= subject_width %>px;height:<%= t_height %>px;border-left: 1px solid #c0c0c0;" class="m_bg"></div>
98 <%
98 <%
99 #
99 #
100 # Tasks subjects
100 # Tasks subjects
101 #
101 #
102 top = headers_heigth + 8
102 top = headers_heigth + 8
103 @issues.each do |i| %>
103 @issues.each do |i| %>
104 <div style="position: absolute;line-height:1em;height:16px;top:<%= top %>px;left:4px;width:<%= subject_width - 5 %>px;overflow:hidden;">
104 <div style="position: absolute;line-height:1em;height:16px;top:<%= top %>px;left:4px;width:<%= subject_width - 5 %>px;overflow:hidden;">
105 <small><%= link_to "#{i.tracker.name} ##{i.id}", :controller => 'issues', :action => 'show', :id => i %>:
105 <small><%= link_to "#{i.tracker.name} ##{i.id}", :controller => 'issues', :action => 'show', :id => i %>:
106 <%= i.subject.sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)') %></small>
106 <%=h i.subject.sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)') %></small>
107 </div>
107 </div>
108 <% top = top + 20
108 <% top = top + 20
109 end %>
109 end %>
110 </div>
110 </div>
111 </td>
111 </td>
112 <td>
112 <td>
113
113
114 <div style="position:relative;height:<%= t_height + 24 %>px;width:<%= subject_width %>;overflow:auto;">
114 <div style="position:relative;height:<%= t_height + 24 %>px;width:<%= subject_width %>;overflow:auto;">
115 <div style="width:<%= g_width-1 %>px;height:<%= headers_heigth %>px;" class="m_bg">&nbsp;</div>
115 <div style="width:<%= g_width-1 %>px;height:<%= headers_heigth %>px;" class="m_bg">&nbsp;</div>
116 <%
116 <%
117 #
117 #
118 # Months headers
118 # Months headers
119 #
119 #
120 month_f = @date_from
120 month_f = @date_from
121 left = 0
121 left = 0
122 height = (show_weeks ? header_heigth : header_heigth + g_height)
122 height = (show_weeks ? header_heigth : header_heigth + g_height)
123 @months.times do
123 @months.times do
124 width = ((month_f >> 1) - month_f) * zoom - 1
124 width = ((month_f >> 1) - month_f) * zoom - 1
125 %>
125 %>
126 <div style="left:<%= left %>px;width:<%= width %>px;height:<%= height %>px;" class="m_bg">
126 <div style="left:<%= left %>px;width:<%= width %>px;height:<%= height %>px;" class="m_bg">
127 <%= link_to "#{month_f.year}-#{month_f.month}", :year => month_f.year, :month => month_f.month, :zoom => @zoom, :months => @months %>
127 <%= link_to "#{month_f.year}-#{month_f.month}", :year => month_f.year, :month => month_f.month, :zoom => @zoom, :months => @months %>
128 </div>
128 </div>
129 <%
129 <%
130 left = left + width + 1
130 left = left + width + 1
131 month_f = month_f >> 1
131 month_f = month_f >> 1
132 end %>
132 end %>
133
133
134 <%
134 <%
135 #
135 #
136 # Weeks headers
136 # Weeks headers
137 #
137 #
138 if show_weeks
138 if show_weeks
139 left = 0
139 left = 0
140 height = (show_days ? header_heigth-1 : header_heigth-1 + g_height)
140 height = (show_days ? header_heigth-1 : header_heigth-1 + g_height)
141 if @date_from.cwday == 1
141 if @date_from.cwday == 1
142 # @date_from is monday
142 # @date_from is monday
143 week_f = @date_from
143 week_f = @date_from
144 else
144 else
145 # find next monday after @date_from
145 # find next monday after @date_from
146 week_f = @date_from + (7 - @date_from.cwday + 1)
146 week_f = @date_from + (7 - @date_from.cwday + 1)
147 width = (7 - @date_from.cwday + 1) * zoom-1
147 width = (7 - @date_from.cwday + 1) * zoom-1
148 %>
148 %>
149 <div style="left:<%= left %>px;top:19px;width:<%= width %>px;height:<%= height %>px;" class="m_bg">&nbsp;</div>
149 <div style="left:<%= left %>px;top:19px;width:<%= width %>px;height:<%= height %>px;" class="m_bg">&nbsp;</div>
150 <%
150 <%
151 left = left + width+1
151 left = left + width+1
152 end %>
152 end %>
153 <%
153 <%
154 while week_f < @date_to
154 while week_f < @date_to
155 width = (week_f + 6 <= @date_to) ? 7 * zoom -1 : (@date_to - week_f + 1) * zoom-1
155 width = (week_f + 6 <= @date_to) ? 7 * zoom -1 : (@date_to - week_f + 1) * zoom-1
156 %>
156 %>
157 <div style="left:<%= left %>px;top:19px;width:<%= width %>px;height:<%= height %>px;" class="m_bg">
157 <div style="left:<%= left %>px;top:19px;width:<%= width %>px;height:<%= height %>px;" class="m_bg">
158 <small><%= week_f.cweek %></small>
158 <small><%= week_f.cweek %></small>
159 </div>
159 </div>
160 <%
160 <%
161 left = left + width+1
161 left = left + width+1
162 week_f = week_f+7
162 week_f = week_f+7
163 end
163 end
164 end %>
164 end %>
165
165
166 <%
166 <%
167 #
167 #
168 # Days headers
168 # Days headers
169 #
169 #
170 if show_days
170 if show_days
171 left = 0
171 left = 0
172 height = g_height + header_heigth - 1
172 height = g_height + header_heigth - 1
173 wday = @date_from.cwday
173 wday = @date_from.cwday
174 (@date_to - @date_from + 1).to_i.times do
174 (@date_to - @date_from + 1).to_i.times do
175 width = zoom - 1
175 width = zoom - 1
176 %>
176 %>
177 <div style="left:<%= left %>px;top:37px;width:<%= width %>px;height:<%= height %>px;font-size:0.7em;<%= "background:#f1f1f1;" if wday > 5 %>" class="m_bg">
177 <div style="left:<%= left %>px;top:37px;width:<%= width %>px;height:<%= height %>px;font-size:0.7em;<%= "background:#f1f1f1;" if wday > 5 %>" class="m_bg">
178 <%= day_name(wday)[0,1] %>
178 <%= day_name(wday)[0,1] %>
179 </div>
179 </div>
180 <%
180 <%
181 left = left + width+1
181 left = left + width+1
182 wday = wday + 1
182 wday = wday + 1
183 wday = 1 if wday > 7
183 wday = 1 if wday > 7
184 end
184 end
185 end %>
185 end %>
186
186
187 <%
187 <%
188 #
188 #
189 # Today red line
189 # Today red line
190 #
190 #
191 if Date.today >= @date_from and Date.today <= @date_to %>
191 if Date.today >= @date_from and Date.today <= @date_to %>
192 <div style="position: absolute;height:<%= g_height %>px;top:<%= headers_heigth + 1 %>px;left:<%= ((Date.today-@date_from+1)*zoom).floor()-1 %>px;width:10px;border-left: 1px dashed red;">&nbsp;</div>
192 <div style="position: absolute;height:<%= g_height %>px;top:<%= headers_heigth + 1 %>px;left:<%= ((Date.today-@date_from+1)*zoom).floor()-1 %>px;width:10px;border-left: 1px dashed red;">&nbsp;</div>
193 <% end %>
193 <% end %>
194
194
195 <%
195 <%
196 #
196 #
197 # Tasks
197 # Tasks
198 #
198 #
199 top = headers_heigth + 12
199 top = headers_heigth + 12
200 @issues.each do |i| %>
200 @issues.each do |i| %>
201 <%
201 <%
202 i_start_date = (i.start_date >= @date_from ? i.start_date : @date_from )
202 i_start_date = (i.start_date >= @date_from ? i.start_date : @date_from )
203 i_end_date = (i.due_date <= @date_to ? i.due_date : @date_to )
203 i_end_date = (i.due_date <= @date_to ? i.due_date : @date_to )
204
204
205 i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor
205 i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor
206 i_done_date = (i_done_date <= @date_from ? @date_from : i_done_date )
206 i_done_date = (i_done_date <= @date_from ? @date_from : i_done_date )
207 i_done_date = (i_done_date >= @date_to ? @date_to : i_done_date )
207 i_done_date = (i_done_date >= @date_to ? @date_to : i_done_date )
208
208
209 i_late_date = [i_end_date, Date.today].min if i_start_date < Date.today
209 i_late_date = [i_end_date, Date.today].min if i_start_date < Date.today
210
210
211 i_left = ((i_start_date - @date_from)*zoom).floor
211 i_left = ((i_start_date - @date_from)*zoom).floor
212 i_width = ((i_end_date - i_start_date + 1)*zoom).floor
212 i_width = ((i_end_date - i_start_date + 1)*zoom).floor
213 d_width = ((i_done_date - i_start_date)*zoom).floor
213 d_width = ((i_done_date - i_start_date)*zoom).floor
214 l_width = ((i_late_date - i_start_date+1)*zoom).floor if i_late_date
214 l_width = ((i_late_date - i_start_date+1)*zoom).floor if i_late_date
215 l_width ||= 0
215 l_width ||= 0
216 %>
216 %>
217 <div style="top:<%= top %>px;left:<%= i_left %>px;width:<%= i_width %>px;" class="task">&nbsp;</div>
217 <div style="top:<%= top %>px;left:<%= i_left %>px;width:<%= i_width %>px;" class="task">&nbsp;</div>
218 <% if l_width > 0 %>
218 <% if l_width > 0 %>
219 <div style="top:<%= top %>px;left:<%= i_left %>px;width:<%= l_width %>px;" class="task task_late">&nbsp;</div>
219 <div style="top:<%= top %>px;left:<%= i_left %>px;width:<%= l_width %>px;" class="task task_late">&nbsp;</div>
220 <% end %>
220 <% end %>
221 <% if d_width > 0 %>
221 <% if d_width > 0 %>
222 <div style="top:<%= top %>px;left:<%= i_left %>px;width:<%= d_width %>px;" class="task task_done">&nbsp;</div>
222 <div style="top:<%= top %>px;left:<%= i_left %>px;width:<%= d_width %>px;" class="task task_done">&nbsp;</div>
223 <% end %>
223 <% end %>
224 <div style="top:<%= top %>px;left:<%= i_left + i_width + 5 %>px;background:#fff;" class="task">
224 <div style="top:<%= top %>px;left:<%= i_left + i_width + 5 %>px;background:#fff;" class="task">
225 <%= i.status.name %>
225 <%= i.status.name %>
226 <%= (i.done_ratio).to_i %>%
226 <%= (i.done_ratio).to_i %>%
227 </div>
227 </div>
228 <% top = top + 20
228 <% top = top + 20
229 end %>
229 end %>
230 </div>
230 </div>
231 </td>
231 </td>
232 </tr>
232 </tr>
233 </table>
233 </table>
234
234
235 <table width="100%">
235 <table width="100%">
236 <tr>
236 <tr>
237 <td align="left"><%= link_to ('&#171; ' + l(:label_previous)), :year => (@date_from << @months).year, :month => (@date_from << @months).month, :zoom => @zoom, :months => @months %></td>
237 <td align="left"><%= link_to ('&#171; ' + l(:label_previous)), :year => (@date_from << @months).year, :month => (@date_from << @months).month, :zoom => @zoom, :months => @months %></td>
238 <td>
238 <td>
239 <td align="right"><%= link_to (l(:label_next) + ' &#187;'), :year => (@date_from >> @months).year, :month => (@date_from >> @months).month, :zoom => @zoom, :months => @months %></td>
239 <td align="right"><%= link_to (l(:label_next) + ' &#187;'), :year => (@date_from >> @months).year, :month => (@date_from >> @months).month, :zoom => @zoom, :months => @months %></td>
240 </tr>
240 </tr>
241 </table> No newline at end of file
241 </table>
@@ -1,20 +1,20
1 <h2><%=l(:label_public_projects)%></h2>
1 <h2><%=l(:label_public_projects)%></h2>
2
2
3 <table class="listTableContent">
3 <table class="listTableContent">
4 <tr class="ListHead">
4 <tr class="ListHead">
5 <%= sort_header_tag('name', :caption => l(:label_project)) %>
5 <%= sort_header_tag('name', :caption => l(:label_project)) %>
6 <th><%=l(:field_description)%></th>
6 <th><%=l(:field_description)%></th>
7 <%= sort_header_tag('created_on', :caption => l(:field_created_on)) %>
7 <%= sort_header_tag('created_on', :caption => l(:field_created_on)) %>
8 </tr>
8 </tr>
9
9
10 <% for project in @projects %>
10 <% for project in @projects %>
11 <tr class="<%= cycle("odd", "even") %>">
11 <tr class="<%= cycle("odd", "even") %>">
12 <td><%= link_to project.name, :action => 'show', :id => project %>
12 <td><%= link_to project.name, :action => 'show', :id => project %>
13 <td><%= project.description %>
13 <td><%=h project.description %>
14 <td align="center"><%= format_date(project.created_on) %>
14 <td align="center"><%= format_date(project.created_on) %>
15 </tr>
15 </tr>
16 <% end %>
16 <% end %>
17 </table>
17 </table>
18
18
19 <%= pagination_links_full @project_pages %>
19 <%= pagination_links_full @project_pages %>
20 [ <%= @project_pages.current.first_item %> - <%= @project_pages.current.last_item %> / <%= @project_count %> ] No newline at end of file
20 [ <%= @project_pages.current.first_item %> - <%= @project_pages.current.last_item %> / <%= @project_count %> ]
@@ -1,23 +1,13
1 <div class="contextual">
1 <div class="contextual">
2 <%= link_to_if_authorized l(:label_document_new), {:controller => 'projects', :action => 'add_document', :id => @project}, :class => 'pic picAdd' %>
2 <%= link_to_if_authorized l(:label_document_new), {:controller => 'projects', :action => 'add_document', :id => @project}, :class => 'pic picAdd' %>
3 </div>
3 </div>
4
4
5 <h2><%=l(:label_document_plural)%></h2>
5 <h2><%=l(:label_document_plural)%></h2>
6
6
7 <% if @documents.empty? %><p><i><%= l(:label_no_data) %></i></p><% end %>
7 <% if @documents.empty? %><p><i><%= l(:label_no_data) %></i></p><% end %>
8
8
9 <% documents = @documents.group_by {|d| d.category } %>
9 <% documents = @documents.group_by {|d| d.category } %>
10 <% documents.each do |category, docs| %>
10 <% documents.each do |category, docs| %>
11 <h3><%= category.name %></h3>
11 <h3><%= category.name %></h3>
12 <ul>
12 <%= render :partial => 'documents/document', :collection => docs %>
13 <% docs.each do |d| %>
14 <li>
15 <b><%= link_to d.title, :controller => 'documents', :action => 'show', :id => d %></b>
16 <br />
17 <%= truncate d.description, 250 %><br />
18 <em><%= format_time(d.created_on) %></em><br />&nbsp;
19 </li>
20
21 <% end %>
22 </ul>
23 <% end %> No newline at end of file
13 <% end %>
@@ -1,91 +1,91
1 <% if @query.new_record? %>
1 <% if @query.new_record? %>
2 <h2><%=l(:label_issue_plural)%></h2>
2 <h2><%=l(:label_issue_plural)%></h2>
3
3
4 <%= start_form_tag({:action => 'list_issues'}, :id => 'query_form') %>
4 <%= start_form_tag({:action => 'list_issues'}, :id => 'query_form') %>
5 <%= render :partial => 'queries/filters', :locals => {:query => @query} %>
5 <%= render :partial => 'queries/filters', :locals => {:query => @query} %>
6 <%= end_form_tag %>
6 <%= end_form_tag %>
7 <div class="contextual">
7 <div class="contextual">
8 <%= link_to_remote l(:button_apply),
8 <%= link_to_remote l(:button_apply),
9 { :url => { :controller => 'projects', :action => 'list_issues', :id => @project, :set_filter => 1 },
9 { :url => { :controller => 'projects', :action => 'list_issues', :id => @project, :set_filter => 1 },
10 :update => "content",
10 :update => "content",
11 :with => "Form.serialize('query_form')"
11 :with => "Form.serialize('query_form')"
12 }, :class => 'pic picCheck' %>
12 }, :class => 'pic picCheck' %>
13
13
14 <%= link_to l(:button_clear), {:controller => 'projects', :action => 'list_issues', :id => @project, :set_filter => 1}, :class => 'pic picDelete' %>
14 <%= link_to l(:button_clear), {:controller => 'projects', :action => 'list_issues', :id => @project, :set_filter => 1}, :class => 'pic picDelete' %>
15 <% if authorize_for('projects', 'add_query') %>
15 <% if authorize_for('projects', 'add_query') %>
16
16
17 <%= link_to_remote l(:button_save),
17 <%= link_to_remote l(:button_save),
18 { :url => { :controller => 'projects', :action => "add_query", :id => @project },
18 { :url => { :controller => 'projects', :action => "add_query", :id => @project },
19 :method => 'get',
19 :method => 'get',
20 :update => "content",
20 :update => "content",
21 :with => "Form.serialize('query_form')"
21 :with => "Form.serialize('query_form')"
22 }, :class => 'pic picEdit' %>
22 }, :class => 'pic picEdit' %>
23 <% end %>
23 <% end %>
24 </div>
24 </div>
25 <br />
25 <br />
26 <% else %>
26 <% else %>
27 <% if authorize_for('projects', 'add_query') %>
27 <% if authorize_for('projects', 'add_query') %>
28 <div class="contextual">
28 <div class="contextual">
29 <%= link_to l(:button_edit), {:controller => 'queries', :action => 'edit', :id => @query}, :class => 'pic picEdit' %>
29 <%= link_to l(:button_edit), {:controller => 'queries', :action => 'edit', :id => @query}, :class => 'pic picEdit' %>
30 <%= link_to l(:button_delete), {:controller => 'queries', :action => 'destroy', :id => @query}, :confirm => l(:text_are_you_sure), :post => true, :class => 'pic picDelete' %>
30 <%= link_to l(:button_delete), {:controller => 'queries', :action => 'destroy', :id => @query}, :confirm => l(:text_are_you_sure), :post => true, :class => 'pic picDelete' %>
31 </div>
31 </div>
32 <% end %>
32 <% end %>
33 <h2><%= @query.name %></h2>
33 <h2><%= @query.name %></h2>
34 <% end %>
34 <% end %>
35 <%= error_messages_for 'query' %>
35 <%= error_messages_for 'query' %>
36 <% if @query.valid? %>
36 <% if @query.valid? %>
37 <% if @issues.empty? %>
37 <% if @issues.empty? %>
38 <p><i><%= l(:label_no_data) %></i></p>
38 <p><i><%= l(:label_no_data) %></i></p>
39 <% else %>
39 <% else %>
40 &nbsp;
40 &nbsp;
41 <table class="listTableContent">
41 <table class="listTableContent">
42 <tr>
42 <tr>
43 <td colspan="6" align="left"><small><%= check_all_links 'issues_form' %></small></td>
43 <td colspan="6" align="left"><small><%= check_all_links 'issues_form' %></small></td>
44 <td colspan="2" align="right">
44 <td colspan="2" align="right">
45 <small><%= l(:label_per_page) %>:</small>
45 <small><%= l(:label_per_page) %>:</small>
46 <%= start_form_tag %>
46 <%= start_form_tag %>
47 <%= select_tag 'per_page', options_for_select(@results_per_page_options, @results_per_page), :class => 'select-small'%>
47 <%= select_tag 'per_page', options_for_select(@results_per_page_options, @results_per_page), :class => 'select-small'%>
48 <%= submit_tag l(:button_apply), :class => 'button-small'%>
48 <%= submit_tag l(:button_apply), :class => 'button-small'%>
49 <%= end_form_tag %>
49 <%= end_form_tag %>
50 </td>
50 </td>
51 </tr>
51 </tr>
52 </table>
52 </table>
53 <%= start_form_tag({:controller => 'projects', :action => 'move_issues', :id => @project}, :id => 'issues_form' ) %>
53 <%= start_form_tag({:controller => 'projects', :action => 'move_issues', :id => @project}, :id => 'issues_form' ) %>
54 <table class="listTableContent">
54 <table class="listTableContent">
55
55
56 <tr class="ListHead">
56 <tr class="ListHead">
57 <td></td>
57 <td></td>
58 <%= sort_header_tag('issues.id', :caption => '#') %>
58 <%= sort_header_tag('issues.id', :caption => '#') %>
59 <%= sort_header_tag('issue_statuses.name', :caption => l(:field_status)) %>
59 <%= sort_header_tag('issue_statuses.name', :caption => l(:field_status)) %>
60 <%= sort_header_tag('issues.tracker_id', :caption => l(:field_tracker)) %>
60 <%= sort_header_tag('issues.tracker_id', :caption => l(:field_tracker)) %>
61 <th><%=l(:field_subject)%></th>
61 <th><%=l(:field_subject)%></th>
62 <%= sort_header_tag('users.lastname', :caption => l(:field_author)) %>
62 <%= sort_header_tag('users.lastname', :caption => l(:field_author)) %>
63 <%= sort_header_tag('issues.created_on', :caption => l(:field_created_on)) %>
63 <%= sort_header_tag('issues.created_on', :caption => l(:field_created_on)) %>
64 <%= sort_header_tag('issues.updated_on', :caption => l(:field_updated_on)) %>
64 <%= sort_header_tag('issues.updated_on', :caption => l(:field_updated_on)) %>
65 </tr>
65 </tr>
66 <% for issue in @issues %>
66 <% for issue in @issues %>
67 <tr class="<%= cycle("odd", "even") %>">
67 <tr class="<%= cycle("odd", "even") %>">
68 <td width="15"><%= check_box_tag "issue_ids[]", issue.id %></td>
68 <td width="15"><%= check_box_tag "issue_ids[]", issue.id %></td>
69 <td align="center"><%= link_to issue.long_id, :controller => 'issues', :action => 'show', :id => issue %></td>
69 <td align="center"><%= link_to issue.long_id, :controller => 'issues', :action => 'show', :id => issue %></td>
70 <td align="center" style="font-weight:bold;color:#<%= issue.status.html_color %>;"><%= issue.status.name %></font></td>
70 <td align="center" style="font-weight:bold;color:#<%= issue.status.html_color %>;"><%= issue.status.name %></font></td>
71 <td align="center"><%= issue.tracker.name %></td>
71 <td align="center"><%= issue.tracker.name %></td>
72 <td><%= link_to issue.subject, :controller => 'issues', :action => 'show', :id => issue %></td>
72 <td><%= link_to h(issue.subject), :controller => 'issues', :action => 'show', :id => issue %></td>
73 <td align="center"><%= issue.author.display_name %></td>
73 <td align="center"><%= issue.author.display_name %></td>
74 <td align="center"><%= format_time(issue.created_on) %></td>
74 <td align="center"><%= format_time(issue.created_on) %></td>
75 <td align="center"><%= format_time(issue.updated_on) %></td>
75 <td align="center"><%= format_time(issue.updated_on) %></td>
76 </tr>
76 </tr>
77 <% end %>
77 <% end %>
78 </table>
78 </table>
79 <div class="contextual">
79 <div class="contextual">
80 <%= l(:label_export_to) %>
80 <%= l(:label_export_to) %>
81 <%= link_to 'CSV', {:action => 'export_issues_csv', :id => @project}, :class => 'pic picCsv' %>,
81 <%= link_to 'CSV', {:action => 'export_issues_csv', :id => @project}, :class => 'pic picCsv' %>,
82 <%= link_to 'PDF', {:action => 'export_issues_pdf', :id => @project}, :class => 'pic picPdf' %>
82 <%= link_to 'PDF', {:action => 'export_issues_pdf', :id => @project}, :class => 'pic picPdf' %>
83 </div>
83 </div>
84 <p>
84 <p>
85 <%= pagination_links_full @issue_pages %>
85 <%= pagination_links_full @issue_pages %>
86 [ <%= @issue_pages.current.first_item %> - <%= @issue_pages.current.last_item %> / <%= @issue_count %> ]
86 [ <%= @issue_pages.current.first_item %> - <%= @issue_pages.current.last_item %> / <%= @issue_count %> ]
87 </p>
87 </p>
88 <%= submit_tag l(:button_move) %>
88 <%= submit_tag l(:button_move) %>
89 <%= end_form_tag %>
89 <%= end_form_tag %>
90 <% end %>
90 <% end %>
91 <% end %> No newline at end of file
91 <% end %>
@@ -1,20 +1,9
1 <div class="contextual">
1 <div class="contextual">
2 <%= link_to_if_authorized l(:label_news_new), {:controller => 'projects', :action => 'add_news', :id => @project}, :class => 'pic picAdd' %>
2 <%= link_to_if_authorized l(:label_news_new), {:controller => 'projects', :action => 'add_news', :id => @project}, :class => 'pic picAdd' %>
3 </div>
3 </div>
4
4
5 <h2><%=l(:label_news_plural)%></h2>
5 <h2><%=l(:label_news_plural)%></h2>
6
6
7 <% if @news.empty? %><p><i><%= l(:label_no_data) %></i></p><% end %>
7 <% if @news.empty? %><p><i><%= l(:label_no_data) %></i></p><% end %>
8
8 <%= render :partial => 'news/news', :collection => @news %>
9 <ul>
10 <% for news in @news %>
11 <li><%= link_to news.title, :controller => 'news', :action => 'show', :id => news %><br />
12 <% unless news.summary.empty? %><%= news.summary %><br /><% end %>
13 <em><%= news.author.name %>, <%= format_time(news.created_on) %></em><br />
14 <%= news.comments_count %> <%= lwr(:label_comment, news.comments_count).downcase %><br />&nbsp;
15 </li>
16 <% end %>
17 </ul>
18
19
20 <%= pagination_links_full @news_pages %>
9 <%= pagination_links_full @news_pages %>
@@ -1,72 +1,67
1 <h2><%=l(:label_overview)%></h2>
1 <h2><%=l(:label_overview)%></h2>
2
2
3 <div class="splitcontentleft">
3 <div class="splitcontentleft">
4 <%= simple_format(auto_link(@project.description)) %>
4 <%= simple_format(auto_link(h @project.description)) %>
5 <ul>
5 <ul>
6 <% unless @project.homepage.empty? %><li><%=l(:field_homepage)%>: <%= auto_link @project.homepage %></li><% end %>
6 <% unless @project.homepage.empty? %><li><%=l(:field_homepage)%>: <%= auto_link @project.homepage %></li><% end %>
7 <li><%=l(:field_created_on)%>: <%= format_date(@project.created_on) %></li>
7 <li><%=l(:field_created_on)%>: <%= format_date(@project.created_on) %></li>
8 <% for custom_value in @custom_values %>
8 <% for custom_value in @custom_values %>
9 <% if !custom_value.value.empty? %>
9 <% if !custom_value.value.empty? %>
10 <li><%= custom_value.custom_field.name%>: <%= show_value(custom_value) %></li>
10 <li><%= custom_value.custom_field.name%>: <%=h show_value(custom_value) %></li>
11 <% end %>
11 <% end %>
12 <% end %>
12 <% end %>
13 </ul>
13 </ul>
14
14
15 <div class="box">
15 <div class="box">
16 <h3><%= image_tag "tracker" %> <%=l(:label_tracker_plural)%></h3>
16 <h3><%= image_tag "tracker" %> <%=l(:label_tracker_plural)%></h3>
17 <ul>
17 <ul>
18 <% for tracker in @trackers %>
18 <% for tracker in @trackers %>
19 <li><%= link_to tracker.name, :controller => 'projects', :action => 'list_issues', :id => @project,
19 <li><%= link_to tracker.name, :controller => 'projects', :action => 'list_issues', :id => @project,
20 :set_filter => 1,
20 :set_filter => 1,
21 "tracker_id" => tracker.id %>:
21 "tracker_id" => tracker.id %>:
22 <%= issue_count = Issue.count(:conditions => ["project_id=? and tracker_id=? and issue_statuses.is_closed=?", @project.id, tracker.id, false], :include => :status) %>
22 <%= issue_count = Issue.count(:conditions => ["project_id=? and tracker_id=? and issue_statuses.is_closed=?", @project.id, tracker.id, false], :include => :status) %>
23 <%= lwr(:label_open_issues, issue_count) %>
23 <%= lwr(:label_open_issues, issue_count) %>
24 </li>
24 </li>
25 <% end %>
25 <% end %>
26 </ul>
26 </ul>
27 <% if authorize_for 'projects', 'add_issue' %>
27 <% if authorize_for 'projects', 'add_issue' %>
28 &#187; <%=l(:label_issue_new)%>:
28 &#187; <%=l(:label_issue_new)%>:
29 <ul>
29 <ul>
30 <% @trackers.each do |tracker| %>
30 <% @trackers.each do |tracker| %>
31 <li><%= link_to tracker.name, :controller => 'projects', :action => 'add_issue', :id => @project, :tracker_id => tracker %></li>
31 <li><%= link_to tracker.name, :controller => 'projects', :action => 'add_issue', :id => @project, :tracker_id => tracker %></li>
32 <% end %>
32 <% end %>
33 </ul>
33 </ul>
34 <% end %>
34 <% end %>
35 <center><small>[ <%= link_to l(:label_issue_view_all), :controller => 'projects', :action => 'list_issues', :id => @project, :set_filter => 1 %> ]</small></center>
35 <center><small><%= link_to l(:label_issue_view_all), :controller => 'projects', :action => 'list_issues', :id => @project, :set_filter => 1 %></small></center>
36 </div>
36 </div>
37 </div>
37 </div>
38
38
39 <div class="splitcontentright">
39 <div class="splitcontentright">
40 <div class="box">
40 <div class="box">
41 <h3><%= image_tag "users" %> <%=l(:label_member_plural)%></h3>
41 <h3><%= image_tag "users" %> <%=l(:label_member_plural)%></h3>
42 <% for member in @members %>
42 <% for member in @members %>
43 <%= link_to_user member.user %> (<%= member.role.name %>)<br />
43 <%= link_to_user member.user %> (<%= member.role.name %>)<br />
44 <% end %>
44 <% end %>
45 </div>
45 </div>
46
46
47 <% if @subprojects %>
47 <% if @subprojects %>
48 <div class="box">
48 <div class="box">
49 <h3><%= image_tag "projects" %> <%=l(:label_subproject_plural)%></h3>
49 <h3><%= image_tag "projects" %> <%=l(:label_subproject_plural)%></h3>
50 <% for subproject in @subprojects %>
50 <% for subproject in @subprojects %>
51 <%= link_to subproject.name, :action => 'show', :id => subproject %><br />
51 <%= link_to subproject.name, :action => 'show', :id => subproject %><br />
52 <% end %>
52 <% end %>
53 </div>
53 </div>
54 <% end %>
54 <% end %>
55
55
56 <div class="box">
56 <div class="box">
57 <h3><%=l(:label_news_latest)%></h3>
57 <h3><%=l(:label_news_latest)%></h3>
58 <% for news in @news %>
58 <%= render :partial => 'news/news', :collection => @news %>
59 <p><b><%= news.title %></b> <small>(<%= link_to_user news.author %> <%= format_time(news.created_on) %>)</small><br />
59 <center><small><%= link_to l(:label_news_view_all), :controller => 'projects', :action => 'list_news', :id => @project %></small></center>
60 <%= news.summary %>
61 <small>[<%= link_to l(:label_read), :controller => 'news', :action => 'show', :id => news %>]</small></p>
62 <hr />
63 <% end %>
64 <center><small>[ <%= link_to l(:label_news_view_all), :controller => 'projects', :action => 'list_news', :id => @project %> ]</small></center>
65 </div>
60 </div>
66 </div>
61 </div>
67
62
68
63
69
64
70
65
71
66
72
67
@@ -1,30 +1,30
1 <%= error_messages_for 'user' %>
1 <%= error_messages_for 'user' %>
2
2
3 <!--[form:user]-->
3 <!--[form:user]-->
4 <div class="box">
4 <div class="box">
5 <h3><%=l(:label_information_plural)%></h3>
5 <h3><%=l(:label_information_plural)%></h3>
6 <p><%= f.text_field :login, :required => true, :size => 25 %></p>
6 <p><%= f.text_field :login, :required => true, :size => 25 %></p>
7 <p><%= f.text_field :firstname, :required => true %></p>
7 <p><%= f.text_field :firstname, :required => true %></p>
8 <p><%= f.text_field :lastname, :required => true %></p>
8 <p><%= f.text_field :lastname, :required => true %></p>
9 <p><%= f.text_field :mail, :required => true %></p>
9 <p><%= f.text_field :mail, :required => true %></p>
10 <p><%= f.select :language, lang_options_for_select %></p>
10 <p><%= f.select :language, lang_options_for_select %></p>
11
11
12 <% for @custom_value in @custom_values %>
12 <% for @custom_value in @custom_values %>
13 <p><%= custom_field_tag_with_label @custom_value %></p>
13 <p><%= custom_field_tag_with_label @custom_value %></p>
14 <% end %>
14 <% end if @custom_values%>
15
15
16 <p><%= f.check_box :admin %></p>
16 <p><%= f.check_box :admin %></p>
17 <p><%= f.check_box :mail_notification %></p>
17 <p><%= f.check_box :mail_notification %></p>
18 </div>
18 </div>
19
19
20 <div class="box">
20 <div class="box">
21 <h3><%=l(:label_authentication)%></h3>
21 <h3><%=l(:label_authentication)%></h3>
22 <% unless @auth_sources.empty? %>
22 <% unless @auth_sources.empty? %>
23 <p><%= f.select :auth_source_id, [[l(:label_internal), ""]] + @auth_sources.collect { |a| [a.name, a.id] } %></p>
23 <p><%= f.select :auth_source_id, [[l(:label_internal), ""]] + @auth_sources.collect { |a| [a.name, a.id] } %></p>
24 <% end %>
24 <% end %>
25 <p><label for="password"><%=l(:field_password)%><span class="required"> *</span></label>
25 <p><label for="password"><%=l(:field_password)%><span class="required"> *</span></label>
26 <%= password_field_tag 'password', nil, :size => 25 %></p>
26 <%= password_field_tag 'password', nil, :size => 25 %></p>
27 <p><label for="password_confirmation"><%=l(:field_password_confirmation)%><span class="required"> *</span></label>
27 <p><label for="password_confirmation"><%=l(:field_password_confirmation)%><span class="required"> *</span></label>
28 <%= password_field_tag 'password_confirmation', nil, :size => 25 %></p>
28 <%= password_field_tag 'password_confirmation', nil, :size => 25 %></p>
29 </div>
29 </div>
30 <!--[eoform:user]-->
30 <!--[eoform:user]-->
@@ -1,30 +1,23
1 <h2><%= $RDM_WELCOME_TITLE || l(:label_home) %></h2>
1 <h2><%= $RDM_WELCOME_TITLE || l(:label_home) %></h2>
2
2
3 <div class="splitcontentleft">
3 <div class="splitcontentleft">
4 <% if $RDM_WELCOME_TEXT %><p><%= $RDM_WELCOME_TEXT %></p><br /><% end %>
4 <% if $RDM_WELCOME_TEXT %><p><%= $RDM_WELCOME_TEXT %></p><br /><% end %>
5 <div class="box">
5 <div class="box">
6 <h3><%=l(:label_news_latest)%></h3>
6 <h3><%=l(:label_news_latest)%></h3>
7 <% for news in @news %>
7 <%= render :partial => 'news/news', :collection => @news %>
8 <p>
9 <b><%= news.title %></b> (<%= link_to_user news.author %> <%= format_time(news.created_on) %> - <%= news.project.name %>)<br />
10 <% unless news.summary.empty? %><%= news.summary %><br /><% end %>
11 [<%= link_to l(:label_read), :controller => 'news', :action => 'show', :id => news %>]
12 </p>
13 <hr />
14 <% end %>
15 </div>
8 </div>
16 </div>
9 </div>
17
10
18 <div class="splitcontentright">
11 <div class="splitcontentright">
19 <div class="box">
12 <div class="box">
20 <h3><%=l(:label_project_latest)%></h3>
13 <h3><%=l(:label_project_latest)%></h3>
21 <ul>
14 <ul>
22 <% for project in @projects %>
15 <% for project in @projects %>
23 <li>
16 <li>
24 <%= link_to project.name, :controller => 'projects', :action => 'show', :id => project %> (<%= format_time(project.created_on) %>)<br />
17 <%= link_to project.name, :controller => 'projects', :action => 'show', :id => project %> (<%= format_time(project.created_on) %>)<br />
25 <%= project.description %>
18 <%=h project.description %>
26 </li>
19 </li>
27 <% end %>
20 <% end %>
28 </ul>
21 </ul>
29 </div>
22 </div>
30 </div>
23 </div>
@@ -1,506 +1,509
1 /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */
1 /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */
2 /* Edited by Jean-Philippe Lang *>
2 /* Edited by Jean-Philippe Lang *>
3 /**************** Body and tag styles ****************/
3 /**************** Body and tag styles ****************/
4
4
5
5
6 #header * {margin:0; padding:0;}
6 #header * {margin:0; padding:0;}
7 p, ul, ol, li {margin:0; padding:0;}
7 p, ul, ol, li {margin:0; padding:0;}
8
8
9
9
10 body{
10 body{
11 font:76% Verdana,Tahoma,Arial,sans-serif;
11 font:76% Verdana,Tahoma,Arial,sans-serif;
12 line-height:1.4em;
12 line-height:1.4em;
13 text-align:center;
13 text-align:center;
14 color:#303030;
14 color:#303030;
15 background:#e8eaec;
15 background:#e8eaec;
16 margin:0;
16 margin:0;
17 }
17 }
18
18
19
19
20 a{
20 a{
21 color:#467aa7;
21 color:#467aa7;
22 font-weight:bold;
22 font-weight:bold;
23 text-decoration:none;
23 text-decoration:none;
24 background-color:inherit;
24 background-color:inherit;
25 }
25 }
26
26
27 a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}
27 a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}
28 a img{border:none;}
28 a img{border:none;}
29
29
30 p{padding:0 0 1em 0;}
30 p{padding:0 0 1em 0;}
31 p form{margin-top:0; margin-bottom:20px;}
31 p form{margin-top:0; margin-bottom:20px;}
32
32
33 img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;}
33 img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;}
34 img.left{float:left; margin:0 12px 5px 0;}
34 img.left{float:left; margin:0 12px 5px 0;}
35 img.center{display:block; margin:0 auto 5px auto;}
35 img.center{display:block; margin:0 auto 5px auto;}
36 img.right{float:right; margin:0 0 5px 12px;}
36 img.right{float:right; margin:0 0 5px 12px;}
37
37
38 /**************** Header and navigation styles ****************/
38 /**************** Header and navigation styles ****************/
39
39
40 #container{
40 #container{
41 width:100%;
41 width:100%;
42 min-width: 800px;
42 min-width: 800px;
43 margin:0;
43 margin:0;
44 padding:0;
44 padding:0;
45 text-align:left;
45 text-align:left;
46 background:#ffffff;
46 background:#ffffff;
47 color:#303030;
47 color:#303030;
48 }
48 }
49
49
50 #header{
50 #header{
51 height:4.5em;
51 height:4.5em;
52 /*width:758px;*/
52 /*width:758px;*/
53 margin:0;
53 margin:0;
54 background:#467aa7;
54 background:#467aa7;
55 color:#ffffff;
55 color:#ffffff;
56 margin-bottom:1px;
56 margin-bottom:1px;
57 }
57 }
58
58
59 #header h1{
59 #header h1{
60 padding:10px 0 0 20px;
60 padding:10px 0 0 20px;
61 font-size:2em;
61 font-size:2em;
62 background-color:inherit;
62 background-color:inherit;
63 color:#fff; /*rgb(152, 26, 33);*/
63 color:#fff; /*rgb(152, 26, 33);*/
64 letter-spacing:-1px;
64 letter-spacing:-1px;
65 font-weight:bold;
65 font-weight:bold;
66 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
66 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
67 }
67 }
68
68
69 #header h2{
69 #header h2{
70 margin:3px 0 0 40px;
70 margin:3px 0 0 40px;
71 font-size:1.5em;
71 font-size:1.5em;
72 background-color:inherit;
72 background-color:inherit;
73 color:#f0f2f4;
73 color:#f0f2f4;
74 letter-spacing:-1px;
74 letter-spacing:-1px;
75 font-weight:normal;
75 font-weight:normal;
76 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
76 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
77 }
77 }
78
78
79 #navigation{
79 #navigation{
80 height:2.2em;
80 height:2.2em;
81 line-height:2.2em;
81 line-height:2.2em;
82 /*width:758px;*/
82 /*width:758px;*/
83 margin:0;
83 margin:0;
84 background:#578bb8;
84 background:#578bb8;
85 color:#ffffff;
85 color:#ffffff;
86 }
86 }
87
87
88 #navigation li{
88 #navigation li{
89 float:left;
89 float:left;
90 list-style-type:none;
90 list-style-type:none;
91 border-right:1px solid #ffffff;
91 border-right:1px solid #ffffff;
92 white-space:nowrap;
92 white-space:nowrap;
93 }
93 }
94
94
95 #navigation li.right {
95 #navigation li.right {
96 float:right;
96 float:right;
97 list-style-type:none;
97 list-style-type:none;
98 border-right:0;
98 border-right:0;
99 border-left:1px solid #ffffff;
99 border-left:1px solid #ffffff;
100 white-space:nowrap;
100 white-space:nowrap;
101 }
101 }
102
102
103 #navigation li a{
103 #navigation li a{
104 display:block;
104 display:block;
105 padding:0px 10px 0px 22px;
105 padding:0px 10px 0px 22px;
106 font-size:0.8em;
106 font-size:0.8em;
107 font-weight:normal;
107 font-weight:normal;
108 /*text-transform:uppercase;*/
108 /*text-transform:uppercase;*/
109 text-decoration:none;
109 text-decoration:none;
110 background-color:inherit;
110 background-color:inherit;
111 color: #ffffff;
111 color: #ffffff;
112 }
112 }
113
113
114 * html #navigation a {width:1%;}
114 * html #navigation a {width:1%;}
115
115
116 #navigation .selected,#navigation a:hover{
116 #navigation .selected,#navigation a:hover{
117 color:#ffffff;
117 color:#ffffff;
118 text-decoration:none;
118 text-decoration:none;
119 background-color: #80b0da;
119 background-color: #80b0da;
120 }
120 }
121
121
122 /**************** Icons links *******************/
122 /**************** Icons links *******************/
123 .picHome { background: url(../images/home.png) no-repeat 4px 50%; }
123 .picHome { background: url(../images/home.png) no-repeat 4px 50%; }
124 .picUser { background: url(../images/user.png) no-repeat 4px 50%; }
124 .picUser { background: url(../images/user.png) no-repeat 4px 50%; }
125 .picUserPage { background: url(../images/user_page.png) no-repeat 4px 50%; }
125 .picUserPage { background: url(../images/user_page.png) no-repeat 4px 50%; }
126 .picAdmin { background: url(../images/admin.png) no-repeat 4px 50%; }
126 .picAdmin { background: url(../images/admin.png) no-repeat 4px 50%; }
127 .picProject { background: url(../images/projects.png) no-repeat 4px 50%; }
127 .picProject { background: url(../images/projects.png) no-repeat 4px 50%; }
128 .picLogout { background: url(../images/logout.png) no-repeat 4px 50%; }
128 .picLogout { background: url(../images/logout.png) no-repeat 4px 50%; }
129 .picHelp { background: url(../images/help.png) no-repeat 4px 50%; }
129 .picHelp { background: url(../images/help.png) no-repeat 4px 50%; }
130
130
131 .picEdit { background: url(../images/edit.png) no-repeat 4px 50%; }
131 .picEdit { background: url(../images/edit.png) no-repeat 4px 50%; }
132 .picDelete { background: url(../images/delete.png) no-repeat 4px 50%; }
132 .picDelete { background: url(../images/delete.png) no-repeat 4px 50%; }
133 .picAdd { background: url(../images/add.png) no-repeat 4px 50%; }
133 .picAdd { background: url(../images/add.png) no-repeat 4px 50%; }
134 .picMove { background: url(../images/move.png) no-repeat 4px 50%; }
134 .picMove { background: url(../images/move.png) no-repeat 4px 50%; }
135 .picCheck { background: url(../images/check.png) no-repeat 4px 70%; }
135 .picCheck { background: url(../images/check.png) no-repeat 4px 70%; }
136 .picPdf { background: url(../images/pdf.png) no-repeat 4px 50%;}
136 .picPdf { background: url(../images/pdf.png) no-repeat 4px 50%;}
137 .picCsv { background: url(../images/csv.png) no-repeat 4px 50%;}
137 .picCsv { background: url(../images/csv.png) no-repeat 4px 50%;}
138
138
139 .pic { padding-left: 18px; margin-left: 3px; }
139 .pic { padding-left: 18px; margin-left: 3px; }
140 /**************** Content styles ****************/
140 /**************** Content styles ****************/
141
141
142 html>body #content {
142 html>body #content {
143 height: auto;
143 height: auto;
144 min-height: 500px;
144 min-height: 500px;
145 }
145 }
146
146
147 #content{
147 #content{
148 /*float:right;*/
148 /*float:right;*/
149 /*width:530px;*/
149 /*width:530px;*/
150 width: auto;
150 width: auto;
151 height:500px;
151 height:500px;
152 font-size:0.9em;
152 font-size:0.9em;
153 padding:20px 10px 10px 20px;
153 padding:20px 10px 10px 20px;
154 /*position: absolute;*/
154 /*position: absolute;*/
155 margin-left: 120px;
155 margin-left: 120px;
156 border-left: 1px dashed #c0c0c0;
156 border-left: 1px dashed #c0c0c0;
157
157
158 }
158 }
159
159
160 #content h2{
160 #content h2{
161 display:block;
161 display:block;
162 margin:0 0 16px 0;
162 margin:0 0 16px 0;
163 font-size:1.7em;
163 font-size:1.7em;
164 font-weight:normal;
164 font-weight:normal;
165 letter-spacing:-1px;
165 letter-spacing:-1px;
166 color:#606060;
166 color:#606060;
167 background-color:inherit;
167 background-color:inherit;
168 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
168 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
169 }
169 }
170
170
171 #content h2 a{font-weight:normal;}
171 #content h2 a{font-weight:normal;}
172 #content h3{margin:0 0 12px 0; font-size:1.4em;color:#707070;font-family: Trebuchet MS,Georgia,"Times New Roman",serif;}
172 #content h3{margin:0 0 12px 0; font-size:1.4em;color:#707070;font-family: Trebuchet MS,Georgia,"Times New Roman",serif;}
173 #content a:hover,#subcontent a:hover{text-decoration:underline;}
173 #content a:hover,#subcontent a:hover{text-decoration:underline;}
174 #content ul,#content ol{margin:0 5px 16px 35px;}
174 #content ul,#content ol{margin:0 5px 16px 35px;}
175 #content dl{margin:0 5px 10px 25px;}
175 #content dl{margin:0 5px 10px 25px;}
176 #content dt{font-weight:bold; margin-bottom:5px;}
176 #content dt{font-weight:bold; margin-bottom:5px;}
177 #content dd{margin:0 0 10px 15px;}
177 #content dd{margin:0 0 10px 15px;}
178
178
179
179
180 /***********************************************/
180 /***********************************************/
181
181
182 /*
182 /*
183 form{
183 form{
184 padding:15px;
184 padding:15px;
185 margin:0 0 20px 0;
185 margin:0 0 20px 0;
186 border:1px solid #c0c0c0;
186 border:1px solid #c0c0c0;
187 background-color:#CEE1ED;
187 background-color:#CEE1ED;
188 width:600px;
188 width:600px;
189 }
189 }
190 */
190 */
191
191
192 form {
192 form {
193 display: inline;
193 display: inline;
194 }
194 }
195
195
196 .noborder {
196 .noborder {
197 border:0px;
197 border:0px;
198 background-color:#fff;
198 background-color:#fff;
199 width:100%;
199 width:100%;
200 }
200 }
201
201
202 textarea {
202 textarea {
203 padding:0;
203 padding:0;
204 margin:0;
204 margin:0;
205 }
205 }
206
206
207 blockquote {
207 blockquote {
208 padding-left: 6px;
208 padding-left: 6px;
209 border-left: 2px solid #ccc;
209 border-left: 2px solid #ccc;
210 }
210 }
211
211
212 input {
212 input {
213 vertical-align: middle;
213 vertical-align: middle;
214 }
214 }
215
215
216 input.button-small
216 input.button-small
217 {
217 {
218 font-size: 0.8em;
218 font-size: 0.8em;
219 }
219 }
220
220
221 select {
221 select {
222 vertical-align: middle;
222 vertical-align: middle;
223 }
223 }
224
224
225 .select-small
225 .select-small
226 {
226 {
227 border: 1px solid #7F9DB9;
227 border: 1px solid #7F9DB9;
228 padding: 1px;
228 padding: 1px;
229 font-size: 0.8em;
229 font-size: 0.8em;
230 }
230 }
231
231
232 .active-filter
232 .active-filter
233 {
233 {
234 background-color: #F9FA9E;
234 background-color: #F9FA9E;
235
235
236 }
236 }
237
237
238 label {
238 label {
239 font-weight: bold;
239 font-weight: bold;
240 font-size: 1em;
240 font-size: 1em;
241 }
241 }
242
242
243 fieldset {
243 fieldset {
244 border:1px solid #7F9DB9;
244 border:1px solid #7F9DB9;
245 padding: 6px;
245 padding: 6px;
246 }
246 }
247
247
248 legend {
248 legend {
249 color: #505050;
249 color: #505050;
250
250
251 }
251 }
252
252
253 .required {
253 .required {
254 color: #bb0000;
254 color: #bb0000;
255 }
255 }
256
256
257 table.listTableContent {
257 table.listTableContent {
258 border:1px solid #578bb8;
258 border:1px solid #578bb8;
259 width:100%;
259 width:100%;
260 border-collapse: collapse;
260 border-collapse: collapse;
261 }
261 }
262
262
263 table.listTableContent td {
263 table.listTableContent td {
264 padding:2px;
264 padding:2px;
265 }
265 }
266
266
267 tr.ListHead {
267 tr.ListHead {
268 background-color:#467aa7;
268 background-color:#467aa7;
269 color:#FFFFFF;
269 color:#FFFFFF;
270 text-align:center;
270 text-align:center;
271 }
271 }
272
272
273 tr.ListHead a {
273 tr.ListHead a {
274 color:#FFFFFF;
274 color:#FFFFFF;
275 text-decoration:underline;
275 text-decoration:underline;
276 }
276 }
277
277
278 .odd {
278 .odd {
279 background-color:#f0f1f2;
279 background-color:#f0f1f2;
280 }
280 }
281 .even {
281 .even {
282 background-color: #fff;
282 background-color: #fff;
283 }
283 }
284
284
285 table.reportTableContent {
285 table.reportTableContent {
286 border:1px solid #c0c0c0;
286 border:1px solid #c0c0c0;
287 width:99%;
287 width:99%;
288 border-collapse: collapse;
288 border-collapse: collapse;
289 }
289 }
290
290
291 table.reportTableContent td {
291 table.reportTableContent td {
292 padding:2px;
292 padding:2px;
293 }
293 }
294
294
295 table.calenderTable {
295 table.calenderTable {
296 border:1px solid #578bb8;
296 border:1px solid #578bb8;
297 width:99%;
297 width:99%;
298 border-collapse: collapse;
298 border-collapse: collapse;
299 }
299 }
300
300
301 table.calenderTable td {
301 table.calenderTable td {
302 border:1px solid #578bb8;
302 border:1px solid #578bb8;
303 }
303 }
304
304
305 hr { border:none; border-bottom: dotted 1px #c0c0c0; }
305 hr { border:none; border-bottom: dotted 1px #c0c0c0; }
306
306
307
307
308 /**************** Sidebar styles ****************/
308 /**************** Sidebar styles ****************/
309
309
310 #subcontent{
310 #subcontent{
311 position: absolute;
311 position: absolute;
312 left: 0px;
312 left: 0px;
313 width:110px;
313 width:110px;
314 padding:20px 20px 10px 5px;
314 padding:20px 20px 10px 5px;
315 }
315 }
316
316
317 #subcontent h2{
317 #subcontent h2{
318 display:block;
318 display:block;
319 margin:0 0 5px 0;
319 margin:0 0 5px 0;
320 font-size:1.0em;
320 font-size:1.0em;
321 font-weight:bold;
321 font-weight:bold;
322 text-align:left;
322 text-align:left;
323 color:#606060;
323 color:#606060;
324 background-color:inherit;
324 background-color:inherit;
325 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
325 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
326 }
326 }
327
327
328 #subcontent p{margin:0 0 16px 0; font-size:0.9em;}
328 #subcontent p{margin:0 0 16px 0; font-size:0.9em;}
329
329
330 /**************** Menublock styles ****************/
330 /**************** Menublock styles ****************/
331
331
332 .menublock{margin:0 0 20px 8px; font-size:0.8em;}
332 .menublock{margin:0 0 20px 8px; font-size:0.8em;}
333 .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;}
333 .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;}
334 .menublock li a{font-weight:bold; text-decoration:none;}
334 .menublock li a{font-weight:bold; text-decoration:none;}
335 .menublock li a:hover{text-decoration:none;}
335 .menublock li a:hover{text-decoration:none;}
336 .menublock li ul{margin:0; font-size:1em; font-weight:normal;}
336 .menublock li ul{margin:0; font-size:1em; font-weight:normal;}
337 .menublock li ul li{margin-bottom:0;}
337 .menublock li ul li{margin-bottom:0;}
338 .menublock li ul a{font-weight:normal;}
338 .menublock li ul a{font-weight:normal;}
339
339
340 /**************** Searchbar styles ****************/
340 /**************** Searchbar styles ****************/
341
341
342 #searchbar{margin:0 0 20px 0;}
342 #searchbar{margin:0 0 20px 0;}
343 #searchbar form fieldset{margin-left:10px; border:0 solid;}
343 #searchbar form fieldset{margin-left:10px; border:0 solid;}
344
344
345 #searchbar #s{
345 #searchbar #s{
346 height:1.2em;
346 height:1.2em;
347 width:110px;
347 width:110px;
348 margin:0 5px 0 0;
348 margin:0 5px 0 0;
349 border:1px solid #a0a0a0;
349 border:1px solid #a0a0a0;
350 }
350 }
351
351
352 #searchbar #searchbutton{
352 #searchbar #searchbutton{
353 width:auto;
353 width:auto;
354 padding:0 1px;
354 padding:0 1px;
355 border:1px solid #808080;
355 border:1px solid #808080;
356 font-size:0.9em;
356 font-size:0.9em;
357 text-align:center;
357 text-align:center;
358 }
358 }
359
359
360 /**************** Footer styles ****************/
360 /**************** Footer styles ****************/
361
361
362 #footer{
362 #footer{
363 clear:both;
363 clear:both;
364 /*width:758px;*/
364 /*width:758px;*/
365 padding:5px 0;
365 padding:5px 0;
366 margin:0;
366 margin:0;
367 font-size:0.9em;
367 font-size:0.9em;
368 color:#f0f0f0;
368 color:#f0f0f0;
369 background:#467aa7;
369 background:#467aa7;
370 }
370 }
371
371
372 #footer p{padding:0; margin:0; text-align:center;}
372 #footer p{padding:0; margin:0; text-align:center;}
373 #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;}
373 #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;}
374 #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;}
374 #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;}
375
375
376 /**************** Misc classes and styles ****************/
376 /**************** Misc classes and styles ****************/
377
377
378 .splitcontentleft{float:left; width:49%;}
378 .splitcontentleft{float:left; width:49%;}
379 .splitcontentright{float:right; width:49%;}
379 .splitcontentright{float:right; width:49%;}
380 .clear{clear:both;}
380 .clear{clear:both;}
381 .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}
381 .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}
382 .hide{display:none;}
382 .hide{display:none;}
383 .textcenter{text-align:center;}
383 .textcenter{text-align:center;}
384 .textright{text-align:right;}
384 .textright{text-align:right;}
385 .important{color:#f02025; background-color:inherit; font-weight:bold;}
385 .important{color:#f02025; background-color:inherit; font-weight:bold;}
386
386
387 .box{
387 .box{
388 margin:0 0 20px 0;
388 margin:0 0 20px 0;
389 padding:10px;
389 padding:10px;
390 border:1px solid #c0c0c0;
390 border:1px solid #c0c0c0;
391 background-color:#fafbfc;
391 background-color:#fafbfc;
392 color:#505050;
392 color:#505050;
393 line-height:1.5em;
393 line-height:1.5em;
394 }
394 }
395
395
396 a.close-icon {
396 a.close-icon {
397 display:block;
397 display:block;
398 margin-top:3px;
398 margin-top:3px;
399 overflow:hidden;
399 overflow:hidden;
400 width:12px;
400 width:12px;
401 height:12px;
401 height:12px;
402 background-repeat: no-repeat;
402 background-repeat: no-repeat;
403 cursor:hand;
403 cursor:hand;
404 cursor:pointer;
404 cursor:pointer;
405 background-image:url('../images/close.png');
405 background-image:url('../images/close.png');
406 }
406 }
407
407
408 a.close-icon:hover {
408 a.close-icon:hover {
409 background-image:url('../images/close_hl.png');
409 background-image:url('../images/close_hl.png');
410 }
410 }
411
411
412 .rightbox{
412 .rightbox{
413 background: #fafbfc;
413 background: #fafbfc;
414 border: 1px solid #c0c0c0;
414 border: 1px solid #c0c0c0;
415 float: right;
415 float: right;
416 padding: 8px;
416 padding: 8px;
417 position: relative;
417 position: relative;
418 margin: 0 5px 5px;
418 margin: 0 5px 5px;
419 }
419 }
420
420
421 .layout-active {
421 .layout-active {
422 background: #ECF3E1;
422 background: #ECF3E1;
423 }
423 }
424
424
425 .block-receiver {
425 .block-receiver {
426 border:1px dashed #c0c0c0;
426 border:1px dashed #c0c0c0;
427 margin-bottom: 20px;
427 margin-bottom: 20px;
428 padding: 15px 0 15px 0;
428 padding: 15px 0 15px 0;
429 }
429 }
430
430
431 .mypage-box {
431 .mypage-box {
432 margin:0 0 20px 0;
432 margin:0 0 20px 0;
433 color:#505050;
433 color:#505050;
434 line-height:1.5em;
434 line-height:1.5em;
435 }
435 }
436
436
437 .handle {
437 .handle {
438 cursor: move;
438 cursor: move;
439 }
439 }
440
440
441 .topright{
441 .topright{
442 position: absolute;
442 position: absolute;
443 right: 25px;
443 right: 25px;
444 top: 100px;
444 top: 100px;
445 }
445 }
446
446
447 .login {
447 .login {
448 width: 50%;
448 width: 50%;
449 text-align: left;
449 text-align: left;
450 }
450 }
451
451
452 img.calendar-trigger {
452 img.calendar-trigger {
453 cursor: pointer;
453 cursor: pointer;
454 vertical-align: middle;
454 vertical-align: middle;
455 margin-left: 4px;
455 margin-left: 4px;
456 }
456 }
457
457
458 #history h4, #comments h4 {
458 #history h4, #comments h4 {
459 font-size: 1em;
459 font-size: 1em;
460 margin-bottom: 12px;
460 margin-bottom: 12px;
461 margin-top: 20px;
461 margin-top: 20px;
462 font-weight: normal;
462 font-weight: normal;
463 border-bottom: dotted 1px #c0c0c0;
463 border-bottom: dotted 1px #c0c0c0;
464 }
464 }
465
465
466 #history p {
466 #history p {
467 margin-left: 34px;
467 margin-left: 34px;
468 }
468 }
469
469
470 /***** Contextual links div *****/
470 /***** Contextual links div *****/
471 .contextual {
471 .contextual {
472 float: right;
472 float: right;
473 font-size: 0.8em;
473 font-size: 0.8em;
474 }
474 }
475
475
476 .contextual select {
477 font-size: 1em;
478 }
476
479
477
480
478 /***** CSS FORM ******/
481 /***** CSS FORM ******/
479 .tabular p{
482 .tabular p{
480 margin: 0;
483 margin: 0;
481 padding: 5px 0 8px 0;
484 padding: 5px 0 8px 0;
482 padding-left: 180px; /*width of left column containing the label elements*/
485 padding-left: 180px; /*width of left column containing the label elements*/
483 height: 1%;
486 height: 1%;
484 }
487 }
485
488
486 .tabular label{
489 .tabular label{
487 font-weight: bold;
490 font-weight: bold;
488 float: left;
491 float: left;
489 margin-left: -180px; /*width of left column*/
492 margin-left: -180px; /*width of left column*/
490 width: 175px; /*width of labels. Should be smaller than left column to create some right
493 width: 175px; /*width of labels. Should be smaller than left column to create some right
491 margin*/
494 margin*/
492 }
495 }
493
496
494 .error {
497 .error {
495 color: #cc0000;
498 color: #cc0000;
496 }
499 }
497
500
498
501
499 /*.threepxfix class below:
502 /*.threepxfix class below:
500 Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents.
503 Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents.
501 to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html
504 to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html
502 */
505 */
503
506
504 * html .threepxfix{
507 * html .threepxfix{
505 margin-left: 3px;
508 margin-left: 3px;
506 } No newline at end of file
509 }
General Comments 0
You need to be logged in to leave comments. Login now