Redmine 4.1.1

This commit is contained in:
Manuel Cillero 2020-11-22 21:20:06 +01:00
parent 33e7b881a5
commit 3d976f1b3b
1593 changed files with 36180 additions and 19489 deletions

View file

@ -0,0 +1,3 @@
<div id="projects-index">
<%= render_project_hierarchy(@entries) %>
</div>

View file

@ -10,7 +10,10 @@
<em class="info"><%= l(:text_length_between, :min => 1, :max => Project::IDENTIFIER_MAX_LENGTH) %> <%= l(:text_project_identifier_info).html_safe %></em>
<% end %></p>
<p><%= f.text_field :homepage, :size => 60 %></p>
<p><%= f.check_box :is_public %></p>
<p>
<%= f.check_box :is_public %>
<em class="info"><%= Setting.login_required? ? l(:text_project_is_public_non_member) : l(:text_project_is_public_anonymous) %></em>
</p>
<% unless @project.allowed_parents.compact.empty? %>
<p><%= label(:project, :parent_id, l(:field_parent)) %><%= parent_project_select_tag(@project) %></p>
@ -20,24 +23,16 @@
<p><%= f.check_box :inherit_members %></p>
<% end %>
<% if @project.safe_attribute?('default_version_id') && (default_version_options = project_default_version_options(@project)).present? %>
<p><%= f.select :default_version_id, project_default_version_options(@project), :include_blank => true %></p>
<% end %>
<% if @project.safe_attribute?('default_assigned_to_id') && (default_assigned_to_options = project_default_assigned_to_options(@project)).present? %>
<p><%= f.select :default_assigned_to_id, default_assigned_to_options, include_blank: true %></p>
<% end %>
<%= wikitoolbar_for 'project_description' %>
<% @project.custom_field_values.each do |value| %>
<% @project.visible_custom_field_values.each do |value| %>
<p><%= custom_field_tag_with_label :project, value %></p>
<% end %>
<%= call_hook(:view_projects_form, :project => @project, :form => f) %>
</div>
<% if @project.new_record? && @project.safe_attribute?('enabled_module_names') %>
<fieldset class="box tabular"><legend><%= l(:label_module_plural) %></legend>
<% if @project.safe_attribute?('enabled_module_names') %>
<fieldset class="box tabular" id="project_modules"><legend><%= toggle_checkboxes_link('#project_modules input[type="checkbox"]') %><%= l(:label_module_plural) %></legend>
<% Redmine::AccessControl.available_project_modules.each do |m| %>
<label class="floating">
<%= check_box_tag 'project[enabled_module_names][]', m, @project.module_enabled?(m), :id => "project_enabled_module_names_#{m}" %>
@ -47,34 +42,6 @@
<%= hidden_field_tag 'project[enabled_module_names][]', '' %>
</fieldset>
<% end %>
<% if @project.new_record? || @project.module_enabled?('issue_tracking') %>
<% unless @trackers.empty? %>
<fieldset class="box tabular" id="project_trackers"><legend><%=l(:label_tracker_plural)%></legend>
<% @trackers.each do |tracker| %>
<label class="floating">
<%= check_box_tag 'project[tracker_ids][]', tracker.id, @project.trackers.to_a.include?(tracker), :id => nil %>
<%= tracker %>
</label>
<% end %>
<%= hidden_field_tag 'project[tracker_ids][]', '' %>
</fieldset>
<% end %>
<% unless @issue_custom_fields.empty? %>
<fieldset class="box tabular" id="project_issue_custom_fields"><legend><%=l(:label_custom_field_plural)%></legend>
<% @issue_custom_fields.each do |custom_field| %>
<label class="floating">
<%= check_box_tag 'project[issue_custom_field_ids][]', custom_field.id, (@project.all_issue_custom_fields.include? custom_field),
:disabled => (custom_field.is_for_all? ? "disabled" : nil),
:id => nil %>
<%= custom_field_name_tag(custom_field) %>
</label>
<% end %>
<%= hidden_field_tag 'project[issue_custom_field_ids][]', '' %>
</fieldset>
<% end %>
<% end %>
<!--[eoform:project]-->
<% unless @project.identifier_frozen? %>
@ -96,15 +63,3 @@
});
<% end %>
<% end %>
<%= javascript_tag do %>
$(document).ready(function() {
$('#project_enabled_module_names_issue_tracking').on('change', function(){
if ($(this).prop('checked')){
$('#project_trackers, #project_issue_custom_fields').show();
} else {
$('#project_trackers, #project_issue_custom_fields').hide();
}
}).trigger('change');
});
<% end %>

View file

@ -0,0 +1,53 @@
<%= render_query_totals(@query) %>
<div class="autoscroll">
<table class="list projects odd-even <%= @query.css_classes %>">
<thead>
<tr>
<% @query.inline_columns.each do |column| %>
<%= column_header(@query, column) %>
<% end %>
</tr>
</thead>
<tbody>
<% grouped_project_list(entries, @query) do |entry, level, group_name, group_count, group_totals| -%>
<% if group_name %>
<% reset_cycle %>
<tr class="group open">
<td colspan="<%= @query.inline_columns.size %>">
<span class="expander icon icon-expended" onclick="toggleRowGroup(this);">&nbsp;</span>
<span class="name"><%= group_name %></span>
<% if group_count %>
<span class="count"><%= group_count %></span>
<% end %>
<span class="totals"><%= group_totals %></span>
<%= link_to_function("#{l(:button_collapse_all)}/#{l(:button_expand_all)}",
"toggleAllRowGroups(this)", :class => 'toggle-all') %>
</td>
</tr>
<% end %>
<tr id="project-<%= entry.id %>" class="<%= cycle('odd', 'even') %> <%= entry.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<% @query.inline_columns.each do |column| %>
<%= content_tag('td', column_content(column, entry), :class => column.css_classes) %>
<% end %>
</tr>
<% end -%>
</tbody>
</table>
</div>
<span class="pagination"><%= pagination_links_full @entry_pages, @entry_count %></span>
<div id="csv-export-options" style="display:none;">
<h3 class="title"><%= l(:label_export_options, :export_format => 'CSV') %></h3>
<%= form_tag(projects_path(:format => 'csv'), :method => :get, :id => 'csv-export-form') do %>
<%= query_as_hidden_field_tags(@query) %>
<p>
<label><%= radio_button_tag 'c[]', '', true %> <%= l(:description_selected_columns) %></label><br />
<label><%= radio_button_tag 'c[]', 'all_inline' %> <%= l(:description_all_columns) %></label>
</p>
<%= export_csv_encoding_select_tag %>
<p class="buttons">
<%= submit_tag l(:button_export), :name => nil, :onclick => "hideModal(this);", :data => { :disable_with => false } %>
<%= link_to_function l(:button_cancel), "hideModal(this);" %>
</p>
<% end %>
</div>

View file

@ -0,0 +1,2 @@
<%= render_sidebar_queries(ProjectQuery, @project) %>
<%= call_hook(:view_projects_sidebar_queries_bottom) %>

View file

@ -0,0 +1,2 @@
$('#project-jump div.drdn-items.projects').html('<%= j render_projects_for_jump_box(projects_for_jump_box(User.current), @project) %>');
$('.contextual a.icon.bookmark').replaceWith('<%= j bookmark_link @project %>');

View file

@ -3,18 +3,28 @@
<%= labelled_form_for @project, :url => { :action => "copy" } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<fieldset class="box tabular"><legend><%= l(:button_copy) %></legend>
<fieldset class="box tabular"><legend><%= toggle_checkboxes_link('.box input[type="checkbox"][name="only[]"]') %><%= l(:button_copy) %></legend>
<label class="block"><%= check_box_tag 'only[]', 'members', true, :id => nil %> <%= l(:label_member_plural) %> (<%= @source_project.members.count %>)</label>
<label class="block"><%= check_box_tag 'only[]', 'versions', true, :id => nil %> <%= l(:label_version_plural) %> (<%= @source_project.versions.count %>)</label>
<label class="block"><%= check_box_tag 'only[]', 'versions', true, :id => nil %> <%= l(:label_version_and_files, @source_project.versions.count) %></label>
<label class="block"><%= check_box_tag 'only[]', 'issue_categories', true, :id => nil %> <%= l(:label_issue_category_plural) %> (<%= @source_project.issue_categories.count %>)</label>
<label class="block"><%= check_box_tag 'only[]', 'issues', true, :id => nil %> <%= l(:label_issue_plural) %> (<%= @source_project.issues.count %>)</label>
<label class="block"><%= check_box_tag 'only[]', 'queries', true, :id => nil %> <%= l(:label_query_plural) %> (<%= @source_project.queries.count %>)</label>
<label class="block"><%= check_box_tag 'only[]', 'documents', true, :id => nil %> <%= l(:label_document_plural) %> (<%= @source_project.documents.count %>)</label>
<label class="block"><%= check_box_tag 'only[]', 'boards', true, :id => nil %> <%= l(:label_board_plural) %> (<%= @source_project.boards.count %>)</label>
<label class="block"><%= check_box_tag 'only[]', 'wiki', true, :id => nil %> <%= l(:label_wiki_page_plural) %> (<%= @source_project.wiki.nil? ? 0 : @source_project.wiki.pages.count %>)</label>
<%= call_hook :view_projects_copy_only_items, project: @source_project, f: f %>
<%= hidden_field_tag 'only[]', '' %>
<br />
<label class="block"><%= check_box_tag 'notifications', 1, params[:notifications] %> <%= l(:label_project_copy_notifications) %></label>
</fieldset>
<% @project.tracker_ids.each do |tracker_id| %>
<%= hidden_field_tag 'project[tracker_ids][]', tracker_id %>
<% end %>
<% @project.issue_custom_field_ids.each do |issue_custom_field_id| %>
<%= hidden_field_tag 'project[issue_custom_field_ids][]', issue_custom_field_id %>
<% end %>
<%= submit_tag l(:button_copy) %>
<% end %>

View file

@ -8,6 +8,7 @@ api.array :projects, api_meta(:total_count => @project_count, :offset => @offset
api.parent(:id => project.parent.id, :name => project.parent.name) if project.parent && project.parent.visible?
api.status project.status
api.is_public project.is_public?
api.inherit_members project.inherit_members?
render_api_custom_values project.visible_custom_field_values, api
render_api_includes(project, api)

View file

@ -1,31 +1,38 @@
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:action => 'index', :format => 'atom', :key => User.current.rss_key}) %>
<% end %>
<div class="contextual">
<%= form_tag({}, :method => :get) do %>
<label for="closed">
<%= check_box_tag 'closed', 1, params[:closed], :onchange => "this.form.submit();" %>
<%= l(:label_show_closed_projects) %>
</label>
<% end %>
<%= render_project_action_links %>
</div>
<h2><%= l(:label_project_plural) %></h2>
<h2><%= @query.new_record? ? l(:label_project_plural) : @query.name %></h2>
<div id="projects-index">
<%= render_project_hierarchy(@projects) %>
</div>
<%= form_tag(projects_path(@project, nil), :method => :get, :id => 'query_form') do %>
<%= render :partial => 'queries/query_form' %>
<% end %>
<% if @query.valid? %>
<% if @entries.empty? %>
<p class="nodata"><%= l(:label_no_data) %></p>
<% else %>
<%= render :partial => @query.display_type, :locals => { :entries => @entries }%>
<% end %>
<% end %>
<% if User.current.logged? %>
<p style="text-align:right;">
<span class="icon icon-fav my-project"><%= l(:label_my_projects) %></span>
<span class="icon icon-user my-project"><%= l(:label_my_projects) %></span>
</p>
<% end %>
<% content_for :sidebar do %>
<%= render :partial => 'projects/sidebar' %>
<% end %>
<% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %>
<% if @query.display_type == 'list' %>
<%= f.link_to_with_query_parameters 'CSV', {}, :onclick => "showModal('csv-export-options', '350px'); return false;" %>
<% end %>
<% end %>
<% html_title(l(:label_project_plural)) -%>

View file

@ -1,3 +1,13 @@
<div class="contextual">
<%= link_to(l(:button_reset), project_enumerations_path(@project),
:method => :delete,
:data => {:confirm => l(:text_are_you_sure)},
:class => 'icon icon-del') %>
<% if User.current.admin? %>
<%= link_to l(:label_administration), enumerations_path, :class => "icon icon-settings" %>
<% end %>
</div>
<%= form_tag(project_enumerations_path(@project), :method => :put, :class => "tabular") do %>
<table class="list">
@ -7,7 +17,7 @@
<% TimeEntryActivity.new.available_custom_fields.each do |value| %>
<th><%= value.name %></th>
<% end %>
<th><%= l(:field_active) %></th>
<th><%= toggle_checkboxes_link('input.enumerations_active') %> <%= l(:field_active) %></th>
</tr></thead>
<% @project.activities(true).each do |enumeration| %>
@ -24,19 +34,12 @@
</td>
<% end %>
<td>
<%= ff.check_box :active %>
<%= ff.check_box :active, :class => 'enumerations_active' %>
</td>
</tr>
<% end %>
<% end %>
</table>
<div class="contextual">
<%= link_to(l(:button_reset), project_enumerations_path(@project),
:method => :delete,
:data => {:confirm => l(:text_are_you_sure)},
:class => 'icon icon-del') %>
</div>
<%= submit_tag l(:button_save) %>
<% end %>

View file

@ -0,0 +1,47 @@
<%= labelled_form_for @project do |f| %>
<%= hidden_field_tag 'tab', 'issues' %>
<% unless @trackers.empty? %>
<fieldset class="box tabular" id="project_trackers"><legend><%= toggle_checkboxes_link('#project_trackers input[type=checkbox]') %><%= l(:label_tracker_plural)%></legend>
<% if User.current.admin? %>
<div class="contextual"><%= link_to l(:label_administration), trackers_path, :class => "icon icon-settings" %></div>
<% end %>
<% @trackers.each do |tracker| %>
<label class="floating">
<%= check_box_tag 'project[tracker_ids][]', tracker.id, @project.trackers.to_a.include?(tracker), :id => nil %>
<%= tracker_name_tag tracker %>
</label>
<% end %>
<%= hidden_field_tag 'project[tracker_ids][]', '' %>
</fieldset>
<% end %>
<% unless @issue_custom_fields.empty? %>
<fieldset class="box tabular" id="project_issue_custom_fields"><legend><%= toggle_checkboxes_link('#project_issue_custom_fields input[type=checkbox]:enabled') %><%=l(:label_custom_field_plural)%></legend>
<% if User.current.admin? %>
<div class="contextual"><%= link_to l(:label_administration), custom_fields_path, :class => "icon icon-settings" %></div>
<% end %>
<% @issue_custom_fields.each do |custom_field| %>
<label class="floating">
<%= check_box_tag 'project[issue_custom_field_ids][]', custom_field.id, (@project.all_issue_custom_fields.include? custom_field),
:disabled => (custom_field.is_for_all? ? "disabled" : nil),
:id => nil %>
<%= custom_field_name_tag(custom_field) %>
</label>
<% end %>
<%= hidden_field_tag 'project[issue_custom_field_ids][]', '' %>
</fieldset>
<% end %>
<div class="box tabular">
<% if @project.safe_attribute?('default_version_id') %>
<p><%= f.select :default_version_id, project_default_version_options(@project), include_blank: l(:label_none) %></p>
<% end %>
<% if @project.safe_attribute?('default_assigned_to_id') %>
<p><%= f.select :default_assigned_to_id, project_default_assigned_to_options(@project), include_blank: l(:label_none) %></p>
<% end %>
</div>
<p><%= submit_tag l(:button_save) %></p>
<% end %>

View file

@ -1,5 +1,8 @@
<% members = @project.memberships.sorted.to_a %>
<% members = @project.memberships.preload(:project).sorted.to_a %>
<% if User.current.admin? %>
<div class="contextual"><%= link_to l(:label_administration), users_path, :class => "icon icon-settings" %></div>
<% end %>
<p><%= link_to l(:label_member_new), new_project_membership_path(@project), :remote => true, :class => "icon icon-add" %></p>
<% if members.any? %>

View file

@ -1,18 +0,0 @@
<%= form_for @project,
:url => { :action => 'modules', :id => @project },
:html => {:id => 'modules-form',
:method => :post} do |f| %>
<fieldset class="box">
<legend><%= l(:text_select_project_modules) %></legend>
<% Redmine::AccessControl.available_project_modules.each do |m| %>
<p><label><%= check_box_tag 'enabled_module_names[]', m, @project.module_enabled?(m), :id => nil -%>
<%= l_or_humanize(m, :prefix => "project_module_") %></label></p>
<% end %>
</fieldset>
<p><%= check_all_links 'modules-form' %></p>
<p><%= submit_tag l(:button_save) %></p>
<% end %>

View file

@ -1,4 +1,11 @@
<p><%= link_to l(:label_version_new), new_project_version_path(@project, :back_url => ''), :class => 'icon icon-add' if User.current.allowed_to?(:manage_versions, @project) %></p>
<% if @versions.any? %>
<div class="contextual">
<%= link_to l(:label_close_versions), close_completed_project_versions_path(@project), :class => 'icon icon-locked', :method => :put %>
</div>
<% end %>
<p>
<%= link_to l(:label_version_new), new_project_version_path(@project, :back_url => ''), :class => 'icon icon-add' if User.current.allowed_to?(:manage_versions, @project) %>
</p>
<%= form_tag(settings_project_path(@project, :tab => 'versions'), :method => :get) do %>
<fieldset><legend><%= l(:label_filter_plural) %></legend>
@ -16,6 +23,7 @@
<table class="list versions">
<thead><tr>
<th><%= l(:label_version) %></th>
<th><%= l(:field_default_version) %></th>
<th><%= l(:field_effective_date) %></th>
<th><%= l(:field_description) %></th>
<th><%= l(:field_status) %></th>
@ -24,9 +32,10 @@
<th style="width:15%"></th>
</tr></thead>
<tbody>
<% @versions.sort.each do |version| %>
<% @versions.each do |version| %>
<tr class="version <%=h version.status %> <%= 'shared' if version.project != @project %>">
<td class="name <%= 'icon icon-shared' if version.project != @project %>"><%= link_to_version version %></td>
<td class="tick"><%= checked_image(version.id == @project.default_version_id) %></td>
<td class="date"><%= format_date(version.effective_date) %></td>
<td class="description"><%= version.description %></td>
<td class="status"><%= l("version_status_#{version.status}") %></td>
@ -45,9 +54,3 @@
<% else %>
<p class="nodata"><%= l(:label_no_data) %></p>
<% end %>
<div class="contextual">
<% if @versions.any? %>
<%= link_to l(:label_close_versions), close_completed_project_versions_path(@project), :method => :put %>
<% end %>
</div>

View file

@ -1,19 +0,0 @@
<%= labelled_form_for @wiki,
:as => :wiki,
:url => { :controller => 'wikis', :action => 'edit', :id => @project },
:remote => true, :method => 'post' do |f| %>
<%= error_messages_for 'wiki' %>
<div class="box tabular">
<p><%= f.text_field :start_page, :size => 60, :required => true %>
<em class="info"><%= l(:text_unallowed_characters) %>: , . / ? ; : |</em></p>
</div>
<div class="contextual">
<%= link_to(l(:button_delete), {:controller => 'wikis', :action => 'destroy', :id => @project},
:class => 'icon icon-del') if @wiki && !@wiki.new_record? %>
</div>
<%= submit_tag((@wiki.nil? || @wiki.new_record?) ? l(:button_create) : l(:button_save)) %>
<% end %>

View file

@ -7,6 +7,9 @@ api.project do
api.parent(:id => @project.parent.id, :name => @project.parent.name) if @project.parent && @project.parent.visible?
api.status @project.status
api.is_public @project.is_public?
api.inherit_members @project.inherit_members?
api.default_version(:id => @project.default_version.id, :name => @project.default_version.name) if @project.default_version
api.default_assignee(:id => @project.project.default_assigned_to.id, :name => @project.project.default_assigned_to.name) if @project.default_assigned_to
render_api_custom_values @project.visible_custom_field_values, api
render_api_includes(@project, api)

View file

@ -1,4 +1,7 @@
<div class="contextual">
<%= bookmark_link @project %>
<%= actions_dropdown do %>
<% if User.current.allowed_to?(:add_subprojects, @project) %>
<%= link_to l(:label_subproject_new), new_project_path(:parent_id => @project), :class => 'icon icon-add' %>
<% end %>
@ -9,6 +12,10 @@
<%= link_to l(:button_reopen), reopen_project_path(@project), :data => {:confirm => l(:text_are_you_sure)}, :method => :post, :class => 'icon icon-unlock' %>
<% end %>
<% end %>
<%= link_to_if_authorized l(:label_settings),
{:controller => 'projects', :action => 'settings', :id => @project},
:class => 'icon icon-settings' if User.current.allowed_to?(:edit_project, @project) %>
<% end %>
</div>
<h2><%=l(:label_overview)%></h2>
@ -17,6 +24,7 @@
<p class="warning"><span class="icon icon-lock"><%= l(:text_project_closed) %></span></p>
<% end %>
<div class="splitcontent">
<div class="splitcontentleft">
<% if @project.description.present? %>
<div class="wiki">
@ -29,14 +37,20 @@
<li><span class="label"><%=l(:field_homepage)%>:</span> <%= link_to_if uri_with_safe_scheme?(@project.homepage), @project.homepage, @project.homepage %></li>
<% end %>
<% render_custom_field_values(@project) do |custom_field, formatted| %>
<li><span class="label"><%= custom_field.name %>:</span> <%= formatted %></li>
<li class="<%= custom_field.css_classes %>"><span class="label"><%= custom_field.name %>:</span> <%= formatted %></li>
<% end %>
</ul>
<% end %>
<% if User.current.allowed_to?(:view_issues, @project) %>
<div class="issues box">
<h3 class="icon icon-issue"><%=l(:label_issue_tracking)%></h3>
<h3 class="icon icon-issue">
<%=l(:label_issue_tracking)%>&nbsp;
<%= link_to l(:label_details),
project_issues_report_details_path(@project, :detail => 'tracker'),
:class => 'icon-only icon-zoom-in',
:title => l(:label_details) %>
</h3>
<% if @trackers.present? %>
<table class="list issue-report">
<thead>
@ -51,7 +65,7 @@
<% @trackers.each do |tracker| %>
<tr>
<td class="name">
<%= link_to tracker.name, project_issues_path(@project, :set_filter => 1, :tracker_id => tracker.id) %>
<%= link_to tracker.name, project_issues_path(@project, :set_filter => 1, :tracker_id => tracker.id), :title => tracker.description %>
</td>
<td>
<%= link_to @open_issues_by_tracker[tracker].to_i, project_issues_path(@project, :set_filter => 1, :tracker_id => tracker.id) %>
@ -69,6 +83,7 @@
<% end %>
<p>
<%= link_to l(:label_issue_view_all), project_issues_path(@project, :set_filter => 1) %>
| <%= link_to l(:field_summary), project_issues_report_path(@project) %>
<% if User.current.allowed_to?(:view_calendar, @project, :global => true) %>
| <%= link_to l(:label_calendar), project_calendar_path(@project) %>
<% end %>
@ -81,10 +96,15 @@
<% if User.current.allowed_to?(:view_time_entries, @project) %>
<div class="spent_time box">
<h3 class="icon icon-time"><%= l(:label_spent_time) %></h3>
<% if @total_hours.present? %>
<p><%= l_hours(@total_hours) %></p>
<% end %>
<h3 class="icon icon-time"><%= l(:label_time_tracking) %></h3>
<ul>
<% if @total_estimated_hours.present? %>
<li><%= l(:field_estimated_hours) %>: <%= l_hours(@total_estimated_hours) %>
<% end %>
<% if @total_hours.present? %>
<li><%= l(:label_spent_time) %>: <%= l_hours(@total_hours) %>
<% end %>
</ul>
<p>
<% if User.current.allowed_to?(:log_time, @project) %>
<%= link_to l(:button_log_time), new_project_time_entry_path(@project) %> |
@ -98,8 +118,6 @@
</div>
<div class="splitcontentright">
<%= render :partial => 'members_box' %>
<% if @news.any? && authorize_for('news', 'index') %>
<div class="news box">
<h3 class="icon icon-news"><%=l(:label_news_latest)%></h3>
@ -108,15 +126,22 @@
</div>
<% end %>
<%= render :partial => 'members_box' %>
<% if @subprojects.any? %>
<div class="projects box">
<h3 class="icon icon-projects"><%=l(:label_subproject_plural)%></h3>
<%= @subprojects.collect{|p| link_to p, project_path(p), :class => p.css_classes}.join(", ").html_safe %>
<ul class="subprojects">
<% @subprojects.each do |project| %>
<li><%= link_to(project.name, project_path(project), :class => project.css_classes).html_safe %></li>
<% end %>
</ul>
</div>
<% end %>
<%= call_hook(:view_projects_show_right, :project => @project) %>
</div>
</div>
<% content_for :sidebar do %>
<%= call_hook(:view_projects_show_sidebar_bottom, :project => @project) %>