Feature #1472 ยป AllProjectsTableListView.patch
app/views/projects/index.rhtml (working copy) | ||
---|---|---|
1 | 1 |
<div class="contextual"> |
2 |
<%= link_to(l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'icon icon-add') + ' |' if User.current.admin? %> |
|
3 | 2 |
<%= link_to l(:label_issue_view_all), { :controller => 'issues' } %> | |
4 | 3 |
<%= link_to l(:label_overall_activity), { :controller => 'projects', :action => 'activity' }%> |
5 | 4 |
</div> |
6 | 5 | |
7 | 6 |
<h2><%=l(:label_project_plural)%></h2> |
8 | 7 | |
8 |
<TABLE cellspacing="0" width="100%"> |
|
9 |
<TR><TD colspan="8"><HR/></TD></TR> |
|
9 | 10 |
<% @project_tree.keys.sort.each do |project| %> |
10 |
<h3><%= link_to h(project.name), {:action => 'show', :id => project}, :class => (User.current.member_of?(project) ? "icon icon-fav" : "") %></h3> |
|
11 |
<%= textilizable(project.short_description, :project => project) %> |
|
12 | ||
11 |
<TR><TD width="10px" align="right" class=<%= (User.current.member_of?(project) ? "\"icon0 icon-fav\"" : "") %> > |
|
12 |
<TD align="left" valign="middle" NOWRAP colspan="3"> |
|
13 |
<h3><%= link_to(h(project.name), {:action => 'show', :id => project}) %></h3> |
|
14 |
</TD></TR> |
|
15 |
<TR><TD></TD><TD colspan="7"> |
|
16 |
<%= textilizable(project.description, :project => project) %> |
|
17 |
</TD></TR> |
|
13 | 18 |
<% if @project_tree[project].any? %> |
14 |
<p><%= l(:label_subproject_plural) %>: |
|
15 |
<%= @project_tree[project].sort.collect {|subproject| |
|
16 |
link_to(h(subproject.name), {:action => 'show', :id => subproject}, :class => (User.current.member_of?(subproject) ? "icon icon-fav" : ""))}.join(', ') %></p> |
|
19 |
<TR><TD colspan="8"><BR/></TD></TR> |
|
20 |
<TR><TD></TD><TD valign="top"><%= l(:label_subproject_plural) %>:</TD> |
|
21 |
<% index = 0 %> |
|
22 |
<% @project_tree[project].sort.each do |subproject| %> |
|
23 |
<TD width="10px" align="right" class=<%= (User.current.member_of?(subproject) ? "\"icon0 icon-fav\"" : "") %> ></TD> |
|
24 |
<TD align="left" valign="middle"> |
|
25 |
<%= link_to(h(subproject.name), {:action => 'show', :id => subproject}) %> |
|
26 |
</TD> |
|
27 |
<% index = index + 1 %> |
|
28 |
<% if index.modulo(3) == 0 %> |
|
29 |
</TR><TR><TD></TD><TD></TD> |
|
30 |
<% end %> |
|
31 |
<% end %> |
|
17 | 32 |
<% end %> |
33 |
<TR><TD colspan="8"><HR/></TD></TR> |
|
18 | 34 |
<% end %> |
35 |
</TABLE> |
|
19 | 36 | |
37 | ||
20 | 38 |
<% if User.current.logged? %> |
21 |
<p style="text-align:right;">
|
|
39 |
<div class="contextual">
|
|
22 | 40 |
<span class="icon icon-fav"><%= l(:label_my_projects) %></span> |
23 |
</p>
|
|
41 |
</div>
|
|
24 | 42 |
<% end %> |
25 | 43 | |
26 |
<p class="other-formats"> |
|
27 |
<%= l(:label_export_to) %> |
|
28 |
<span><%= link_to 'Atom', {:format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span> |
|
29 |
</p> |
|
30 | 44 | |
31 | 45 |
<% html_title(l(:label_project_plural)) -%> |
app/views/projects/show.rhtml (working copy) | ||
---|---|---|
1 |
<h2><%=l(:label_overview)%></h2>
|
|
2 |
|
|
1 |
<h2><%=l(:label_overview)%></h2> |
|
2 | ||
3 | 3 |
<div class="splitcontentleft"> |
4 |
<%= textilizable @project.description %> |
|
5 |
<ul>
|
|
6 |
<% unless @project.homepage.blank? %><li><%=l(:field_homepage)%>: <%= auto_link @project.homepage %></li><% end %>
|
|
4 |
<%= textilizable @project.description %> |
|
5 |
<ul>
|
|
6 |
<% unless @project.homepage.blank? %><li><%=l(:field_homepage)%>: <%= auto_link @project.homepage %></li><% end %>
|
|
7 | 7 |
<% if @subprojects.any? %> |
8 |
<li><%=l(:label_subproject_plural)%>: <%= @subprojects.collect{|p| link_to(h(p.name), :action => 'show', :id => p)}.join(", ") %></li> |
|
8 |
<TABLE cellspacing="0"> |
|
9 |
<TR><TD colspan="2"><%=l(:label_subproject_plural)%>:</TD></TR> |
|
10 |
<% @subprojects.collect do |subproject| %> |
|
11 |
<TR><TD width="10px" align="right" class=<%=(User.current.member_of?(subproject) ? "\"icon0 icon-fav\"" : "")%></TD> |
|
12 |
<TD align="left" valign="middle" NOWRAP> |
|
13 |
<%= link_to(h(subproject.name), {:action => 'show', :id => subproject}) %> |
|
14 |
</TD></TR> |
|
9 | 15 |
<% end %> |
10 |
<% if @project.parent %> |
|
11 |
<li><%=l(:field_parent)%>: <%= link_to h(@project.parent.name), :controller => 'projects', :action => 'show', :id => @project.parent %></li> |
|
12 |
<% end %> |
|
13 |
<% for custom_value in @custom_values %> |
|
14 |
<% if !custom_value.value.empty? %> |
|
15 |
<li><%= custom_value.custom_field.name%>: <%=h show_value(custom_value) %></li> |
|
16 |
<% end %> |
|
17 |
<% end %> |
|
18 |
</ul> |
|
16 |
</TABLE> |
|
17 |
<% end %> |
|
18 |
<% if @project.parent %> |
|
19 | 19 | |
20 |
<TABLE cellspacing="0"> |
|
21 |
<TR><TD colspan="2"><%=l(:field_parent)%>:</TD></TR> |
|
22 |
<TR><TD width="10px" align="right" class=<%=(User.current.member_of?(@project.parent) ? "\"icon0 icon-fav\"" : "")%></TD> |
|
23 |
<TD><%= link_to h(@project.parent.name), :controller => 'projects', :action => 'show', :id => @project.parent %></TD> |
|
24 |
</TR> |
|
25 |
</TABLE> |
|
26 |
<% end %> |
|
27 |
<% for custom_value in @custom_values %> |
|
28 |
<% if !custom_value.value.empty? %> |
|
29 |
<li><%= custom_value.custom_field.name%>: <%=h show_value(custom_value) %></li> |
|
30 |
<% end %> |
|
31 |
<% end %> |
|
32 |
</ul> |
|
33 |
</div> |
|
34 | ||
35 |
<div class="splitcontentright"> |
|
36 |
<% if @news.any? && authorize_for('news', 'index') %> |
|
37 |
<div class="box"> |
|
38 |
<h3><%=l(:label_news_latest)%></h3> |
|
39 |
<%= render :partial => 'news/news', :collection => @news %> |
|
40 |
<p><%= link_to l(:label_news_view_all), :controller => 'news', :action => 'index', :project_id => @project %></p> |
|
41 |
</div> |
|
42 |
<% end %> |
|
43 | ||
20 | 44 |
<% if User.current.allowed_to?(:view_issues, @project) %> |
21 |
<div class="box">
|
|
45 |
<div class="box"> |
|
22 | 46 |
<h3 class="icon22 icon22-tracker"><%=l(:label_issue_tracking)%></h3> |
23 | 47 |
<ul> |
24 |
<% for tracker in @trackers %>
|
|
25 |
<li><%= link_to tracker.name, :controller => 'issues', :action => 'index', :project_id => @project,
|
|
26 |
:set_filter => 1,
|
|
48 |
<% for tracker in @trackers %> |
|
49 |
<li><%= link_to tracker.name, :controller => 'issues', :action => 'index', :project_id => @project, |
|
50 |
:set_filter => 1, |
|
27 | 51 |
"tracker_id" => tracker.id %>: |
28 | 52 |
<%= @open_issues_by_tracker[tracker] || 0 %> <%= lwr(:label_open_issues, @open_issues_by_tracker[tracker] || 0) %> |
29 | 53 |
<%= l(:label_on) %> <%= @total_issues_by_tracker[tracker] || 0 %></li> |
... | ... | |
32 | 56 |
<p><%= link_to l(:label_issue_view_all), :controller => 'issues', :action => 'index', :project_id => @project, :set_filter => 1 %></p> |
33 | 57 |
</div> |
34 | 58 |
<% end %> |
35 |
</div> |
|
36 | 59 | |
37 |
<div class="splitcontentright"> |
|
38 | 60 |
<% if @members_by_role.any? %> |
39 |
<div class="box"> |
|
40 |
<h3 class="icon22 icon22-users"><%=l(:label_member_plural)%></h3> |
|
41 |
<p><% @members_by_role.keys.sort.each do |role| %> |
|
42 |
<%= role.name %>: |
|
43 |
<%= @members_by_role[role].collect(&:user).sort.collect{|u| link_to_user u}.join(", ") %> |
|
44 |
<br /> |
|
45 |
<% end %></p> |
|
46 |
</div> |
|
47 |
<% end %> |
|
48 |
|
|
49 |
<% if @news.any? && authorize_for('news', 'index') %> |
|
50 |
<div class="box"> |
|
51 |
<h3><%=l(:label_news_latest)%></h3> |
|
52 |
<%= render :partial => 'news/news', :collection => @news %> |
|
53 |
<p><%= link_to l(:label_news_view_all), :controller => 'news', :action => 'index', :project_id => @project %></p> |
|
54 |
</div> |
|
55 |
<% end %> |
|
61 |
<div class="box"> |
|
62 |
<h3 class="icon22 icon22-users"><%=l(:label_member_plural)%></h3> |
|
63 |
<p><% @members_by_role.keys.sort.each do |role| %> |
|
64 |
<%= role.name %>: |
|
65 |
<%= @members_by_role[role].collect(&:user).sort.collect{|u| link_to_user u}.join(", ") %> |
|
66 |
<br /> |
|
67 |
<% end %></p> |
|
68 |
</div> |
|
69 |
<% end %> |
|
70 | ||
56 | 71 |
</div> |
57 | 72 | |
58 | 73 |
<% content_for :sidebar do %> |
... | ... | |
64 | 79 |
<h3><%= l(:label_planning) %></h3> |
65 | 80 |
<p><%= planning_links.join(' | ') %></p> |
66 | 81 |
<% end %> |
67 |
|
|
82 | ||
68 | 83 |
<% if @total_hours && User.current.allowed_to?(:view_time_entries, @project) %> |
69 | 84 |
<h3><%= l(:label_spent_time) %></h3> |
70 | 85 |
<p><span class="icon icon-time"><%= lwr(:label_f_hour, @total_hours) %></span></p> |
public/stylesheets/application.css (working copy) | ||
---|---|---|
57 | 57 | |
58 | 58 |
#content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; height:600px; min-height: 600px;} |
59 | 59 |
* html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;} |
60 |
html>body #content { height: auto; min-height: 600px; overflow: auto; }
|
|
60 |
html>body #content { height: auto; min-height: 600px; overflow: auto; } |
|
61 | 61 | |
62 | 62 |
#main.nosidebar #sidebar{ display: none; } |
63 | 63 |
#main.nosidebar #content{ width: auto; border-right: 0; } |
... | ... | |
78 | 78 |
a.issue.closed, .issue.closed a { text-decoration: line-through; } |
79 | 79 | |
80 | 80 |
/***** Tables *****/ |
81 |
table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
|
|
81 |
table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px;} |
|
82 | 82 |
table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; } |
83 | 83 |
table.list td { vertical-align: top; } |
84 | 84 |
table.list td.id { width: 2%; text-align: center;} |
85 | 85 |
table.list td.checkbox { width: 15px; padding: 0px;} |
86 |
table.list.issues { margin-top: 10px; } |
|
87 |
table.projects { margin-top: 10px; } |
|
86 | 88 | |
87 |
table.list.issues { margin-top: 10px; } |
|
88 | 89 |
tr.issue { text-align: center; white-space: nowrap; } |
89 |
tr.issue td.subject, tr.issue td.category { white-space: normal; } |
|
90 |
tr.issue td.subject { text-align: left; }
|
|
90 |
tr.issue td.subject, tr.issue td.category, tr.issue td.last_comment { white-space: normal; }
|
|
91 |
tr.issue td.subject, tr.issue td.last_comment { text-align: left; width: 25%}
|
|
91 | 92 |
tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;} |
92 | 93 | |
93 | 94 |
tr.entry { border: 1px solid #f8f8f8; } |
... | ... | |
159 | 160 |
li p {margin-top: 0;} |
160 | 161 |
div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;} |
161 | 162 |
p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;} |
162 |
p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
|
|
163 |
p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; } |
|
163 | 164 | |
164 | 165 |
fieldset#filters { padding: 0.7em; } |
165 | 166 |
fieldset#filters p { margin: 1.2em 0 0.8em 2px; } |
... | ... | |
236 | 237 |
float: left; |
237 | 238 |
text-align: right; |
238 | 239 |
margin-left: -180px; /*width of left column*/ |
239 |
width: 175px; /*width of labels. Should be smaller than left column to create some right
|
|
240 |
width: 175px; /*width of labels. Should be smaller than left column to create some right |
|
240 | 241 |
margin*/ |
241 | 242 |
} |
242 | 243 | |
... | ... | |
272 | 273 |
#errorExplanation, div.flash, .nodata, .warning { |
273 | 274 |
padding: 4px 4px 4px 30px; |
274 | 275 |
margin-bottom: 12px; |
275 |
font-size: 1.1em;
|
|
276 |
border: 2px solid;
|
|
276 |
font-size: 1.1em;
|
|
277 |
border: 2px solid;
|
|
277 | 278 |
} |
278 | 279 | |
279 | 280 |
div.flash {margin-top: 8px;} |
280 | 281 | |
281 | 282 |
div.flash.error, #errorExplanation { |
282 | 283 |
background: url(../images/false.png) 8px 5px no-repeat; |
283 |
background-color: #ffe3e3;
|
|
284 |
border-color: #dd0000;
|
|
285 |
color: #550000;
|
|
284 |
background-color: #ffe3e3;
|
|
285 |
border-color: #dd0000;
|
|
286 |
color: #550000;
|
|
286 | 287 |
} |
287 | 288 | |
288 | 289 |
div.flash.notice { |
289 | 290 |
background: url(../images/true.png) 8px 5px no-repeat; |
290 |
background-color: #dfffdf;
|
|
291 |
border-color: #9fcf9f;
|
|
292 |
color: #005f00;
|
|
291 |
background-color: #dfffdf;
|
|
292 |
border-color: #9fcf9f;
|
|
293 |
color: #005f00;
|
|
293 | 294 |
} |
294 | 295 | |
295 | 296 |
.nodata, .warning { |
296 | 297 |
text-align: center; |
297 |
background-color: #FFEBC1;
|
|
298 |
border-color: #FDBF3B;
|
|
299 |
color: #A6750C;
|
|
298 |
background-color: #FFEBC1;
|
|
299 |
border-color: #FDBF3B;
|
|
300 |
color: #A6750C;
|
|
300 | 301 |
} |
301 | 302 | |
302 | 303 |
#errorExplanation ul { font-size: 0.9em;} |
... | ... | |
528 | 529 |
} |
529 | 530 | |
530 | 531 |
.task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; } |
531 |
.task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
|
|
532 |
.task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; } |
|
532 | 533 |
.task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; } |
533 | 534 |
.milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; } |
534 | 535 | |
... | ... | |
549 | 550 |
vertical-align: middle; |
550 | 551 |
} |
551 | 552 | |
553 |
.icon0 { |
|
554 |
background-position: 0% 30%; |
|
555 |
background-repeat: no-repeat; |
|
556 |
padding-left: 0px; |
|
557 |
padding-right: 0px; |
|
558 |
padding-top: 0px; |
|
559 |
padding-bottom: 0px; |
|
560 |
} |
|
561 | ||
552 | 562 |
.icon-add { background-image: url(../images/add.png); } |
553 | 563 |
.icon-edit { background-image: url(../images/edit.png); } |
554 | 564 |
.icon-copy { background-image: url(../images/copy.png); } |