##// END OF EJS Templates
Slight changes to the activity view....
Jean-Philippe Lang -
r1106:80a60247f527
parent child
Show More
@@ -1,191 +1,195
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 module ProjectsHelper
19 19 def link_to_version(version, options = {})
20 20 return '' unless version && version.is_a?(Version)
21 21 link_to version.name, {:controller => 'projects',
22 22 :action => 'roadmap',
23 23 :id => version.project_id,
24 24 :completed => (version.completed? ? 1 : nil),
25 25 :anchor => version.name
26 26 }, options
27 27 end
28 28
29 def format_activity_description(text)
30 h(truncate(text, 250))
31 end
32
29 33 def project_settings_tabs
30 34 tabs = [{:name => 'info', :action => :edit_project, :partial => 'projects/edit', :label => :label_information_plural},
31 35 {:name => 'modules', :action => :select_project_modules, :partial => 'projects/settings/modules', :label => :label_module_plural},
32 36 {:name => 'members', :action => :manage_members, :partial => 'projects/settings/members', :label => :label_member_plural},
33 37 {:name => 'versions', :action => :manage_versions, :partial => 'projects/settings/versions', :label => :label_version_plural},
34 38 {:name => 'categories', :action => :manage_categories, :partial => 'projects/settings/issue_categories', :label => :label_issue_category_plural},
35 39 {:name => 'wiki', :action => :manage_wiki, :partial => 'projects/settings/wiki', :label => :label_wiki},
36 40 {:name => 'repository', :action => :manage_repository, :partial => 'projects/settings/repository', :label => :label_repository},
37 41 {:name => 'boards', :action => :manage_boards, :partial => 'projects/settings/boards', :label => :label_board_plural}
38 42 ]
39 43 tabs.select {|tab| User.current.allowed_to?(tab[:action], @project)}
40 44 end
41 45
42 46 # Generates a gantt image
43 47 # Only defined if RMagick is avalaible
44 48 def gantt_image(events, date_from, months, zoom)
45 49 date_to = (date_from >> months)-1
46 50 show_weeks = zoom > 1
47 51 show_days = zoom > 2
48 52
49 53 subject_width = 320
50 54 header_heigth = 18
51 55 # width of one day in pixels
52 56 zoom = zoom*2
53 57 g_width = (date_to - date_from + 1)*zoom
54 58 g_height = 20 * events.length + 20
55 59 headers_heigth = (show_weeks ? 2*header_heigth : header_heigth)
56 60 height = g_height + headers_heigth
57 61
58 62 imgl = Magick::ImageList.new
59 63 imgl.new_image(subject_width+g_width+1, height)
60 64 gc = Magick::Draw.new
61 65
62 66 # Subjects
63 67 top = headers_heigth + 20
64 68 gc.fill('black')
65 69 gc.stroke('transparent')
66 70 gc.stroke_width(1)
67 71 events.each do |i|
68 72 gc.text(4, top + 2, (i.is_a?(Issue) ? i.subject : i.name))
69 73 top = top + 20
70 74 end
71 75
72 76 # Months headers
73 77 month_f = date_from
74 78 left = subject_width
75 79 months.times do
76 80 width = ((month_f >> 1) - month_f) * zoom
77 81 gc.fill('white')
78 82 gc.stroke('grey')
79 83 gc.stroke_width(1)
80 84 gc.rectangle(left, 0, left + width, height)
81 85 gc.fill('black')
82 86 gc.stroke('transparent')
83 87 gc.stroke_width(1)
84 88 gc.text(left.round + 8, 14, "#{month_f.year}-#{month_f.month}")
85 89 left = left + width
86 90 month_f = month_f >> 1
87 91 end
88 92
89 93 # Weeks headers
90 94 if show_weeks
91 95 left = subject_width
92 96 height = header_heigth
93 97 if date_from.cwday == 1
94 98 # date_from is monday
95 99 week_f = date_from
96 100 else
97 101 # find next monday after date_from
98 102 week_f = date_from + (7 - date_from.cwday + 1)
99 103 width = (7 - date_from.cwday + 1) * zoom
100 104 gc.fill('white')
101 105 gc.stroke('grey')
102 106 gc.stroke_width(1)
103 107 gc.rectangle(left, header_heigth, left + width, 2*header_heigth + g_height-1)
104 108 left = left + width
105 109 end
106 110 while week_f <= date_to
107 111 width = (week_f + 6 <= date_to) ? 7 * zoom : (date_to - week_f + 1) * zoom
108 112 gc.fill('white')
109 113 gc.stroke('grey')
110 114 gc.stroke_width(1)
111 115 gc.rectangle(left.round, header_heigth, left.round + width, 2*header_heigth + g_height-1)
112 116 gc.fill('black')
113 117 gc.stroke('transparent')
114 118 gc.stroke_width(1)
115 119 gc.text(left.round + 2, header_heigth + 14, week_f.cweek.to_s)
116 120 left = left + width
117 121 week_f = week_f+7
118 122 end
119 123 end
120 124
121 125 # Days details (week-end in grey)
122 126 if show_days
123 127 left = subject_width
124 128 height = g_height + header_heigth - 1
125 129 wday = date_from.cwday
126 130 (date_to - date_from + 1).to_i.times do
127 131 width = zoom
128 132 gc.fill(wday == 6 || wday == 7 ? '#eee' : 'white')
129 133 gc.stroke('grey')
130 134 gc.stroke_width(1)
131 135 gc.rectangle(left, 2*header_heigth, left + width, 2*header_heigth + g_height-1)
132 136 left = left + width
133 137 wday = wday + 1
134 138 wday = 1 if wday > 7
135 139 end
136 140 end
137 141
138 142 # border
139 143 gc.fill('transparent')
140 144 gc.stroke('grey')
141 145 gc.stroke_width(1)
142 146 gc.rectangle(0, 0, subject_width+g_width, headers_heigth)
143 147 gc.stroke('black')
144 148 gc.rectangle(0, 0, subject_width+g_width, g_height+ headers_heigth-1)
145 149
146 150 # content
147 151 top = headers_heigth + 20
148 152 gc.stroke('transparent')
149 153 events.each do |i|
150 154 if i.is_a?(Issue)
151 155 i_start_date = (i.start_date >= date_from ? i.start_date : date_from )
152 156 i_end_date = (i.due_date <= date_to ? i.due_date : date_to )
153 157 i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor
154 158 i_done_date = (i_done_date <= date_from ? date_from : i_done_date )
155 159 i_done_date = (i_done_date >= date_to ? date_to : i_done_date )
156 160 i_late_date = [i_end_date, Date.today].min if i_start_date < Date.today
157 161
158 162 i_left = subject_width + ((i_start_date - date_from)*zoom).floor
159 163 i_width = ((i_end_date - i_start_date + 1)*zoom).floor # total width of the issue
160 164 d_width = ((i_done_date - i_start_date)*zoom).floor # done width
161 165 l_width = i_late_date ? ((i_late_date - i_start_date+1)*zoom).floor : 0 # delay width
162 166
163 167 gc.fill('grey')
164 168 gc.rectangle(i_left, top, i_left + i_width, top - 6)
165 169 gc.fill('red')
166 170 gc.rectangle(i_left, top, i_left + l_width, top - 6) if l_width > 0
167 171 gc.fill('blue')
168 172 gc.rectangle(i_left, top, i_left + d_width, top - 6) if d_width > 0
169 173 gc.fill('black')
170 174 gc.text(i_left + i_width + 5,top + 1, "#{i.status.name} #{i.done_ratio}%")
171 175 else
172 176 i_left = subject_width + ((i.start_date - date_from)*zoom).floor
173 177 gc.fill('green')
174 178 gc.rectangle(i_left, top, i_left + 6, top - 6)
175 179 gc.fill('black')
176 180 gc.text(i_left + 11, top + 1, i.name)
177 181 end
178 182 top = top + 20
179 183 end
180 184
181 185 # today red line
182 186 if Date.today >= date_from and Date.today <= date_to
183 187 gc.stroke('red')
184 188 x = (Date.today-date_from+1)*zoom + subject_width
185 189 gc.line(x, headers_heigth, x, headers_heigth + g_height-1)
186 190 end
187 191
188 192 gc.draw(imgl)
189 193 imgl
190 194 end if Object.const_defined?(:Magick)
191 195 end
@@ -1,43 +1,48
1 1 <h2><%=l(:label_activity)%>: <%= "#{month_name(@month).downcase} #{@year}" %></h2>
2 2
3 <div id="activity">
3 4 <% @events_by_day.keys.sort {|x,y| y <=> x }.each do |day| %>
4 <h3><%= day_name(day.cwday) %> <%= day.day %></h3>
5 <ul>
6 <% @events_by_day[day].sort {|x,y| y.event_datetime <=> x.event_datetime }.each do |e| %>
7 <li><p><%= format_time(e.event_datetime, false) %> <%= link_to truncate(e.event_title, 100), e.event_url %><br />
8 <% unless e.event_description.blank? %><em><%= truncate(e.event_description, 500) %></em><br /><% end %>
9 <span class="author"><%= e.event_author if e.respond_to?(:event_author) %></span></p></li>
5 <h3><%= day_name(day.cwday) %> <%= day.day %></h3>
6 <dl>
7 <% @events_by_day[day].sort {|x,y| y.event_datetime <=> x.event_datetime }.each do |e| -%>
8 <dt class="<%= e.class.name.downcase %>"><span class="time"><%= format_time(e.event_datetime, false) %></span>
9 <%= link_to truncate(e.event_title, 100), e.event_url %></dt>
10 <dd><% unless e.event_description.blank? -%>
11 <span class="description"><%= format_activity_description(e.event_description) %></span><br />
10 12 <% end %>
11 </ul>
12 <% end %>
13 <span class="author"><%= e.event_author if e.respond_to?(:event_author) %></span></dd>
14 <% end -%>
15 </dl>
16 <% end -%>
17 </div>
13 18
14 <% if @events_by_day.empty? %><p class="nodata"><%= l(:label_no_data) %></p><% end %>
19 <%= content_tag('p', l(:label_no_data), :class => 'nodata') if @events_by_day.empty? %>
15 20
16 21 <div style="float:left;">
17 22 <% prev_params = params.clone.update :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1) %>
18 23 <%= link_to_remote ('&#171; ' + (@month==1 ? "#{month_name(12)} #{@year-1}" : "#{month_name(@month-1)}")),
19 24 {:update => "content", :url => prev_params}, {:href => url_for(prev_params)} %>
20 25 </div>
21 26 <div style="float:right;">
22 27 <% next_params = params.clone.update :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1) %>
23 28 <%= link_to_remote ((@month==12 ? "#{month_name(1)} #{@year+1}" : "#{month_name(@month+1)}") + ' &#187;'),
24 29 {:update => "content", :url => next_params}, {:href => url_for(next_params)} %>
25 30 &nbsp;
26 31 </div>
27 32 <br />
28 33
29 34 <% content_for :header_tags do %>
30 35 <%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :year => nil, :month => nil, :key => User.current.rss_key})) %>
31 36 <% end %>
32 37
33 38 <% content_for :sidebar do %>
34 39 <% form_tag do %>
35 40 <h3><%= l(:label_activity) %></h3>
36 41 <p><% @event_types.each do |t| %>
37 42 <label><%= check_box_tag "show_#{t}", 1, @scope.include?(t) %> <%= l("label_#{t.singularize}_plural")%></label><br />
38 43 <% end %></p>
39 44 <p><%= submit_tag l(:button_apply), :class => 'button-small' %></p>
40 45 <% end %>
41 46 <% end %>
42 47
43 48 <% html_title(l(:label_activity)) -%>
@@ -1,531 +1,537
1 1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
2 2
3 3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
4 4 h1 {margin:0; padding:0; font-size: 24px;}
5 5 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
6 6 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
7 7 h4, .wiki h3 {font-size: 12px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
8 8
9 9 /***** Layout *****/
10 10 #wrapper {background: white;}
11 11
12 12 #top-menu {background: #2C4056;color: #fff;height:1.5em; padding: 2px 6px 0px 6px;}
13 13 #top-menu a {color: #fff; padding-right: 4px;}
14 14 #account {float:right;}
15 15
16 16 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
17 17 #header a {color:#f8f8f8;}
18 18 #quick-search {float:right;}
19 19
20 20 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
21 21 #main-menu ul {margin: 0; padding: 0;}
22 22 #main-menu li {
23 23 float:left;
24 24 list-style-type:none;
25 25 margin: 0px 10px 0px 0px;
26 26 padding: 0px 0px 0px 0px;
27 27 white-space:nowrap;
28 28 }
29 29 #main-menu li a {
30 30 display: block;
31 31 color: #fff;
32 32 text-decoration: none;
33 33 margin: 0;
34 34 padding: 4px 4px 4px 4px;
35 35 background: #2C4056;
36 36 }
37 37 #main-menu li a:hover, #main-menu li a.selected {background:#759FCF;}
38 38
39 39 #main {background: url(../images/mainbg.png) repeat-x; background-color:#EEEEEE;}
40 40
41 41 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
42 42 * html #sidebar{ width: 17%; }
43 43 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
44 44 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
45 45 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
46 46
47 47 #content { width: 80%; background: url(../images/contentbg.png) repeat-x; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; height:600px; min-height: 600px;}
48 48 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
49 49 html>body #content {
50 50 height: auto;
51 51 min-height: 600px;
52 52 }
53 53
54 54 #main.nosidebar #sidebar{ display: none; }
55 55 #main.nosidebar #content{ width: auto; border-right: 0; }
56 56
57 57 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
58 58
59 59 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
60 60 #login-form table td {padding: 6px;}
61 61 #login-form label {font-weight: bold;}
62 62
63 63 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
64 64
65 65 /***** Links *****/
66 66 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
67 67 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
68 68 a img{ border: 0; }
69 69
70 70 /***** Tables *****/
71 71 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
72 72 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
73 73 table.list td { overflow: hidden; text-overflow: ellipsis; vertical-align: top;}
74 74 table.list td.id { width: 2%; text-align: center;}
75 75 table.list td.checkbox { width: 15px; padding: 0px;}
76 76
77 77 tr.issue { text-align: center; white-space: nowrap; }
78 78 tr.issue td.subject, tr.issue td.category { white-space: normal; }
79 79 tr.issue td.subject { text-align: left; }
80 80 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
81 81
82 82 tr.entry { border: 1px solid #f8f8f8; }
83 83 tr.entry td { white-space: nowrap; }
84 84 tr.entry td.filename { width: 30%; }
85 85 tr.entry td.size { text-align: right; font-size: 90%; }
86 86 tr.entry td.revision, tr.entry td.author { text-align: center; }
87 87 tr.entry td.age { text-align: right; }
88 88
89 89 tr.changeset td.author { text-align: center; width: 15%; }
90 90 tr.changeset td.committed_on { text-align: center; width: 15%; }
91 91
92 92 tr.message { height: 2.6em; }
93 93 tr.message td.last_message { font-size: 80%; }
94 94 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
95 95 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
96 96
97 97 tr.user td { width:13%; }
98 98 tr.user td.email { width:18%; }
99 99 tr.user td { white-space: nowrap; }
100 100 tr.user.locked, tr.user.registered { color: #aaa; }
101 101 tr.user.locked a, tr.user.registered a { color: #aaa; }
102 102
103 103 table.list tbody tr:hover { background-color:#ffffdd; }
104 104 table td {padding:2px;}
105 105 table p {margin:0;}
106 106 .odd {background-color:#f6f7f8;}
107 107 .even {background-color: #fff;}
108 108
109 109 .highlight { background-color: #FCFD8D;}
110 110 .highlight.token-1 { background-color: #faa;}
111 111 .highlight.token-2 { background-color: #afa;}
112 112 .highlight.token-3 { background-color: #aaf;}
113 113
114 114 .box{
115 115 padding:6px;
116 116 margin-bottom: 10px;
117 117 background-color:#f6f6f6;
118 118 color:#505050;
119 119 line-height:1.5em;
120 120 border: 1px solid #e4e4e4;
121 121 }
122 122
123 123 div.square {
124 124 border: 1px solid #999;
125 125 float: left;
126 126 margin: .3em .4em 0 .4em;
127 127 overflow: hidden;
128 128 width: .6em; height: .6em;
129 129 }
130 130
131 131 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
132 132 .contextual input {font-size:0.9em;}
133 133
134 134 .splitcontentleft{float:left; width:49%;}
135 135 .splitcontentright{float:right; width:49%;}
136 136 form {display: inline;}
137 137 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
138 138 fieldset {border: 1px solid #e4e4e4; margin:0;}
139 139 legend {color: #484848;}
140 140 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
141 141 textarea.wiki-edit { width: 99%; }
142 142 li p {margin-top: 0;}
143 143 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
144 144
145 145 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
146 146 div#issue-changesets .changeset { padding: 4px;}
147 147 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
148 148 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
149 149
150 div#activity dl { margin-left: 2em; }
151 div#activity dd { margin-bottom: 1em; }
152 div#activity dt { margin-bottom: 1px; }
153 div#activity dt .time { color: #777; font-size: 80%; }
154 div#activity dd .description { font-style: italic; }
155
150 156 .autoscroll {overflow-x: auto; padding:1px; width:100%; margin-bottom: 1.2em;}
151 157 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
152 158
153 159 .pagination {font-size: 90%}
154 160 p.pagination {margin-top:8px;}
155 161
156 162 /***** Tabular forms ******/
157 163 .tabular p{
158 164 margin: 0;
159 165 padding: 5px 0 8px 0;
160 166 padding-left: 180px; /*width of left column containing the label elements*/
161 167 height: 1%;
162 168 clear:left;
163 169 }
164 170
165 171 .tabular label{
166 172 font-weight: bold;
167 173 float: left;
168 174 text-align: right;
169 175 margin-left: -180px; /*width of left column*/
170 176 width: 175px; /*width of labels. Should be smaller than left column to create some right
171 177 margin*/
172 178 }
173 179
174 180 .tabular label.floating{
175 181 font-weight: normal;
176 182 margin-left: 0px;
177 183 text-align: left;
178 184 width: 200px;
179 185 }
180 186
181 187 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
182 188
183 189 .tabular.settings p{ padding-left: 300px; }
184 190 .tabular.settings label{ margin-left: -300px; width: 295px; }
185 191
186 192 .required {color: #bb0000;}
187 193 .summary {font-style: italic;}
188 194
189 195 div.attachments p { margin:4px 0 2px 0; }
190 196
191 197 /***** Flash & error messages ****/
192 198 #errorExplanation, div.flash, .nodata {
193 199 padding: 4px 4px 4px 30px;
194 200 margin-bottom: 12px;
195 201 font-size: 1.1em;
196 202 border: 2px solid;
197 203 }
198 204
199 205 div.flash {margin-top: 8px;}
200 206
201 207 div.flash.error, #errorExplanation {
202 208 background: url(../images/false.png) 8px 5px no-repeat;
203 209 background-color: #ffe3e3;
204 210 border-color: #dd0000;
205 211 color: #550000;
206 212 }
207 213
208 214 div.flash.notice {
209 215 background: url(../images/true.png) 8px 5px no-repeat;
210 216 background-color: #dfffdf;
211 217 border-color: #9fcf9f;
212 218 color: #005f00;
213 219 }
214 220
215 221 .nodata {
216 222 text-align: center;
217 223 background-color: #FFEBC1;
218 224 border-color: #FDBF3B;
219 225 color: #A6750C;
220 226 }
221 227
222 228 #errorExplanation ul { font-size: 0.9em;}
223 229
224 230 /***** Ajax indicator ******/
225 231 #ajax-indicator {
226 232 position: absolute; /* fixed not supported by IE */
227 233 background-color:#eee;
228 234 border: 1px solid #bbb;
229 235 top:35%;
230 236 left:40%;
231 237 width:20%;
232 238 font-weight:bold;
233 239 text-align:center;
234 240 padding:0.6em;
235 241 z-index:100;
236 242 filter:alpha(opacity=50);
237 243 opacity: 0.5;
238 244 -khtml-opacity: 0.5;
239 245 }
240 246
241 247 html>body #ajax-indicator { position: fixed; }
242 248
243 249 #ajax-indicator span {
244 250 background-position: 0% 40%;
245 251 background-repeat: no-repeat;
246 252 background-image: url(../images/loading.gif);
247 253 padding-left: 26px;
248 254 vertical-align: bottom;
249 255 }
250 256
251 257 /***** Calendar *****/
252 258 table.cal {border-collapse: collapse; width: 100%; margin: 8px 0 6px 0;border: 1px solid #d7d7d7;}
253 259 table.cal thead th {width: 14%;}
254 260 table.cal tbody tr {height: 100px;}
255 261 table.cal th { background-color:#EEEEEE; padding: 4px; }
256 262 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
257 263 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
258 264 table.cal td.odd p.day-num {color: #bbb;}
259 265 table.cal td.today {background:#ffffdd;}
260 266 table.cal td.today p.day-num {font-weight: bold;}
261 267
262 268 /***** Tooltips ******/
263 269 .tooltip{position:relative;z-index:24;}
264 270 .tooltip:hover{z-index:25;color:#000;}
265 271 .tooltip span.tip{display: none; text-align:left;}
266 272
267 273 div.tooltip:hover span.tip{
268 274 display:block;
269 275 position:absolute;
270 276 top:12px; left:24px; width:270px;
271 277 border:1px solid #555;
272 278 background-color:#fff;
273 279 padding: 4px;
274 280 font-size: 0.8em;
275 281 color:#505050;
276 282 }
277 283
278 284 /***** Progress bar *****/
279 285 table.progress {
280 286 border: 1px solid #D7D7D7;
281 287 border-collapse: collapse;
282 288 border-spacing: 0pt;
283 289 empty-cells: show;
284 290 text-align: center;
285 291 float:left;
286 292 margin: 1px 6px 1px 0px;
287 293 }
288 294
289 295 table.progress td { height: 0.9em; }
290 296 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
291 297 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
292 298 table.progress td.open { background: #FFF none repeat scroll 0%; }
293 299 p.pourcent {font-size: 80%;}
294 300 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
295 301
296 302 div#status_by { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; }
297 303
298 304 /***** Tabs *****/
299 305 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
300 306 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
301 307 #content .tabs>ul { bottom:-1px; } /* others */
302 308 #content .tabs ul li {
303 309 float:left;
304 310 list-style-type:none;
305 311 white-space:nowrap;
306 312 margin-right:8px;
307 313 background:#fff;
308 314 }
309 315 #content .tabs ul li a{
310 316 display:block;
311 317 font-size: 0.9em;
312 318 text-decoration:none;
313 319 line-height:1.3em;
314 320 padding:4px 6px 4px 6px;
315 321 border: 1px solid #ccc;
316 322 border-bottom: 1px solid #bbbbbb;
317 323 background-color: #eeeeee;
318 324 color:#777;
319 325 font-weight:bold;
320 326 }
321 327
322 328 #content .tabs ul li a:hover {
323 329 background-color: #ffffdd;
324 330 text-decoration:none;
325 331 }
326 332
327 333 #content .tabs ul li a.selected {
328 334 background-color: #fff;
329 335 border: 1px solid #bbbbbb;
330 336 border-bottom: 1px solid #fff;
331 337 }
332 338
333 339 #content .tabs ul li a.selected:hover {
334 340 background-color: #fff;
335 341 }
336 342
337 343 /***** Diff *****/
338 344 .diff_out { background: #fcc; }
339 345 .diff_in { background: #cfc; }
340 346
341 347 /***** Wiki *****/
342 348 div.wiki table {
343 349 border: 1px solid #505050;
344 350 border-collapse: collapse;
345 351 }
346 352
347 353 div.wiki table, div.wiki td, div.wiki th {
348 354 border: 1px solid #bbb;
349 355 padding: 4px;
350 356 }
351 357
352 358 div.wiki .external {
353 359 background-position: 0% 60%;
354 360 background-repeat: no-repeat;
355 361 padding-left: 12px;
356 362 background-image: url(../images/external.png);
357 363 }
358 364
359 365 div.wiki a.new {
360 366 color: #b73535;
361 367 }
362 368
363 369 div.wiki pre {
364 370 margin: 1em 1em 1em 1.6em;
365 371 padding: 2px;
366 372 background-color: #fafafa;
367 373 border: 1px solid #dadada;
368 374 width:95%;
369 375 overflow-x: auto;
370 376 }
371 377
372 378 div.wiki div.toc {
373 379 background-color: #ffffdd;
374 380 border: 1px solid #e4e4e4;
375 381 padding: 4px;
376 382 line-height: 1.2em;
377 383 margin-bottom: 12px;
378 384 margin-right: 12px;
379 385 display: table
380 386 }
381 387 * html div.wiki div.toc { width: 50%; } /* IE6 doesn't autosize div */
382 388
383 389 div.wiki div.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
384 390 div.wiki div.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
385 391
386 392 div.wiki div.toc a {
387 393 display: block;
388 394 font-size: 0.9em;
389 395 font-weight: normal;
390 396 text-decoration: none;
391 397 color: #606060;
392 398 }
393 399 div.wiki div.toc a:hover { color: #c61a1a; text-decoration: underline;}
394 400
395 401 div.wiki div.toc a.heading2 { margin-left: 6px; }
396 402 div.wiki div.toc a.heading3 { margin-left: 12px; font-size: 0.8em; }
397 403
398 404 /***** My page layout *****/
399 405 .block-receiver {
400 406 border:1px dashed #c0c0c0;
401 407 margin-bottom: 20px;
402 408 padding: 15px 0 15px 0;
403 409 }
404 410
405 411 .mypage-box {
406 412 margin:0 0 20px 0;
407 413 color:#505050;
408 414 line-height:1.5em;
409 415 }
410 416
411 417 .handle {
412 418 cursor: move;
413 419 }
414 420
415 421 a.close-icon {
416 422 display:block;
417 423 margin-top:3px;
418 424 overflow:hidden;
419 425 width:12px;
420 426 height:12px;
421 427 background-repeat: no-repeat;
422 428 cursor:pointer;
423 429 background-image:url('../images/close.png');
424 430 }
425 431
426 432 a.close-icon:hover {
427 433 background-image:url('../images/close_hl.png');
428 434 }
429 435
430 436 /***** Gantt chart *****/
431 437 .gantt_hdr {
432 438 position:absolute;
433 439 top:0;
434 440 height:16px;
435 441 border-top: 1px solid #c0c0c0;
436 442 border-bottom: 1px solid #c0c0c0;
437 443 border-right: 1px solid #c0c0c0;
438 444 text-align: center;
439 445 overflow: hidden;
440 446 }
441 447
442 448 .task {
443 449 position: absolute;
444 450 height:8px;
445 451 font-size:0.8em;
446 452 color:#888;
447 453 padding:0;
448 454 margin:0;
449 455 line-height:0.8em;
450 456 }
451 457
452 458 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
453 459 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
454 460 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
455 461 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
456 462
457 463 /***** Icons *****/
458 464 .icon {
459 465 background-position: 0% 40%;
460 466 background-repeat: no-repeat;
461 467 padding-left: 20px;
462 468 padding-top: 2px;
463 469 padding-bottom: 3px;
464 470 }
465 471
466 472 .icon22 {
467 473 background-position: 0% 40%;
468 474 background-repeat: no-repeat;
469 475 padding-left: 26px;
470 476 line-height: 22px;
471 477 vertical-align: middle;
472 478 }
473 479
474 480 .icon-add { background-image: url(../images/add.png); }
475 481 .icon-edit { background-image: url(../images/edit.png); }
476 482 .icon-copy { background-image: url(../images/copy.png); }
477 483 .icon-del { background-image: url(../images/delete.png); }
478 484 .icon-move { background-image: url(../images/move.png); }
479 485 .icon-save { background-image: url(../images/save.png); }
480 486 .icon-cancel { background-image: url(../images/cancel.png); }
481 487 .icon-pdf { background-image: url(../images/pdf.png); }
482 488 .icon-csv { background-image: url(../images/csv.png); }
483 489 .icon-html { background-image: url(../images/html.png); }
484 490 .icon-image { background-image: url(../images/image.png); }
485 491 .icon-txt { background-image: url(../images/txt.png); }
486 492 .icon-file { background-image: url(../images/file.png); }
487 493 .icon-folder { background-image: url(../images/folder.png); }
488 494 .open .icon-folder { background-image: url(../images/folder_open.png); }
489 495 .icon-package { background-image: url(../images/package.png); }
490 496 .icon-home { background-image: url(../images/home.png); }
491 497 .icon-user { background-image: url(../images/user.png); }
492 498 .icon-mypage { background-image: url(../images/user_page.png); }
493 499 .icon-admin { background-image: url(../images/admin.png); }
494 500 .icon-projects { background-image: url(../images/projects.png); }
495 501 .icon-logout { background-image: url(../images/logout.png); }
496 502 .icon-help { background-image: url(../images/help.png); }
497 503 .icon-attachment { background-image: url(../images/attachment.png); }
498 504 .icon-index { background-image: url(../images/index.png); }
499 505 .icon-history { background-image: url(../images/history.png); }
500 506 .icon-feed { background-image: url(../images/feed.png); }
501 507 .icon-time { background-image: url(../images/time.png); }
502 508 .icon-stats { background-image: url(../images/stats.png); }
503 509 .icon-warning { background-image: url(../images/warning.png); }
504 510 .icon-fav { background-image: url(../images/fav.png); }
505 511 .icon-fav-off { background-image: url(../images/fav_off.png); }
506 512 .icon-reload { background-image: url(../images/reload.png); }
507 513 .icon-lock { background-image: url(../images/locked.png); }
508 514 .icon-unlock { background-image: url(../images/unlock.png); }
509 515 .icon-note { background-image: url(../images/note.png); }
510 516 .icon-checked { background-image: url(../images/true.png); }
511 517
512 518 .icon22-projects { background-image: url(../images/22x22/projects.png); }
513 519 .icon22-users { background-image: url(../images/22x22/users.png); }
514 520 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
515 521 .icon22-role { background-image: url(../images/22x22/role.png); }
516 522 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
517 523 .icon22-options { background-image: url(../images/22x22/options.png); }
518 524 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
519 525 .icon22-authent { background-image: url(../images/22x22/authent.png); }
520 526 .icon22-info { background-image: url(../images/22x22/info.png); }
521 527 .icon22-comment { background-image: url(../images/22x22/comment.png); }
522 528 .icon22-package { background-image: url(../images/22x22/package.png); }
523 529 .icon22-settings { background-image: url(../images/22x22/settings.png); }
524 530 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
525 531
526 532 /***** Media print specific styles *****/
527 533 @media print {
528 534 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual { display:none; }
529 535 #main { background: #fff; }
530 536 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; }
531 537 }
General Comments 0
You need to be logged in to leave comments. Login now