Revision 912:5e80956cc792 app/views/issues
| app/views/issues/_action_menu.html.erb | ||
|---|---|---|
| 1 |
<div class="contextual"> |
|
| 2 |
<%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
|
|
| 3 |
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'new', :issue_id => @issue}, :class => 'icon icon-time-add' %>
|
|
| 4 |
<%= watcher_tag(@issue, User.current) %> |
|
| 5 |
<%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %>
|
|
| 6 |
<%= link_to_if_authorized l(:button_copy), {:controller => 'issue_moves', :action => 'new', :id => @issue, :copy_options => {:copy => 't'}}, :class => 'icon icon-copy' %>
|
|
| 7 |
<%= link_to_if_authorized l(:button_move), {:controller => 'issue_moves', :action => 'new', :id => @issue}, :class => 'icon icon-move' %>
|
|
| 8 |
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => issues_destroy_confirmation_message(@issue), :method => :post, :class => 'icon icon-del' %>
|
|
| 9 |
</div> |
|
| app/views/issues/_action_menu.rhtml | ||
|---|---|---|
| 1 |
<div class="contextual"> |
|
| 2 |
<%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
|
|
| 3 |
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'new', :issue_id => @issue}, :class => 'icon icon-time-add' %>
|
|
| 4 |
<%= watcher_tag(@issue, User.current) %> |
|
| 5 |
<%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %>
|
|
| 6 |
<%= link_to_if_authorized l(:button_copy), {:controller => 'issue_moves', :action => 'new', :id => @issue, :copy_options => {:copy => 't'}}, :class => 'icon icon-copy' %>
|
|
| 7 |
<%= link_to_if_authorized l(:button_move), {:controller => 'issue_moves', :action => 'new', :id => @issue}, :class => 'icon icon-move' %>
|
|
| 8 |
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => issues_destroy_confirmation_message(@issue), :method => :post, :class => 'icon icon-del' %>
|
|
| 9 |
</div> |
|
| app/views/issues/_attributes.html.erb | ||
|---|---|---|
| 1 |
<% fields_for :issue, @issue, :builder => TabularFormBuilder do |f| %> |
|
| 2 |
|
|
| 3 |
<div class="splitcontentleft"> |
|
| 4 |
<% if @issue.new_record? || @allowed_statuses.any? %> |
|
| 5 |
<p><%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), :required => true %></p>
|
|
| 6 |
<% else %> |
|
| 7 |
<p><label><%= l(:field_status) %></label> <%= h(@issue.status.name) %></p> |
|
| 8 |
<% end %> |
|
| 9 |
|
|
| 10 |
<p><%= f.select :priority_id, (@priorities.collect {|p| [p.name, p.id]}), {:required => true}, :disabled => !@issue.leaf? %></p>
|
|
| 11 |
<p><%= f.select :assigned_to_id, principals_options_for_select(@issue.assignable_users, @issue.assigned_to), :include_blank => true %></p> |
|
| 12 |
<% unless @project.issue_categories.empty? %> |
|
| 13 |
<p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true %>
|
|
| 14 |
<%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
|
|
| 15 |
l(:label_issue_category_new), |
|
| 16 |
'issue_category[name]', |
|
| 17 |
{:controller => 'issue_categories', :action => 'create', :project_id => @project},
|
|
| 18 |
:title => l(:label_issue_category_new), |
|
| 19 |
:tabindex => 199) if authorize_for('issue_categories', 'new') %></p>
|
|
| 20 |
<% end %> |
|
| 21 |
<% unless @issue.assignable_versions.empty? %> |
|
| 22 |
<p><%= f.select :fixed_version_id, version_options_for_select(@issue.assignable_versions, @issue.fixed_version), :include_blank => true %> |
|
| 23 |
<%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
|
|
| 24 |
l(:label_version_new), |
|
| 25 |
'version[name]', |
|
| 26 |
{:controller => 'versions', :action => 'create', :project_id => @project},
|
|
| 27 |
:title => l(:label_version_new), |
|
| 28 |
:tabindex => 200) if authorize_for('versions', 'new') %>
|
|
| 29 |
</p> |
|
| 30 |
<% end %> |
|
| 31 |
</div> |
|
| 32 |
|
|
| 33 |
<div class="splitcontentright"> |
|
| 34 |
<% if User.current.allowed_to?(:manage_subtasks, @project) %> |
|
| 35 |
<p id="parent_issue"><%= f.text_field :parent_issue_id, :size => 10 %></p> |
|
| 36 |
<div id="parent_issue_candidates" class="autocomplete"></div> |
|
| 37 |
<%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %>
|
|
| 38 |
<% end %> |
|
| 39 |
<p><%= f.text_field :start_date, :size => 10, :disabled => !@issue.leaf? %><%= calendar_for('issue_start_date') if @issue.leaf? %></p>
|
|
| 40 |
<p><%= f.text_field :due_date, :size => 10, :disabled => !@issue.leaf? %><%= calendar_for('issue_due_date') if @issue.leaf? %></p>
|
|
| 41 |
<p><%= f.text_field :estimated_hours, :size => 3, :disabled => !@issue.leaf? %> <%= l(:field_hours) %></p> |
|
| 42 |
<% if @issue.leaf? && Issue.use_field_for_done_ratio? %> |
|
| 43 |
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
|
|
| 44 |
<% end %> |
|
| 45 |
</div> |
|
| 46 |
|
|
| 47 |
<div style="clear:both;"> </div> |
|
| 48 |
<%= render :partial => 'issues/form_custom_fields' %> |
|
| 49 |
|
|
| 50 |
<% end %> |
|
| app/views/issues/_attributes.rhtml | ||
|---|---|---|
| 1 |
<% fields_for :issue, @issue, :builder => TabularFormBuilder do |f| %> |
|
| 2 |
|
|
| 3 |
<div class="splitcontentleft"> |
|
| 4 |
<% if @issue.new_record? || @allowed_statuses.any? %> |
|
| 5 |
<p><%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), :required => true %></p>
|
|
| 6 |
<% else %> |
|
| 7 |
<p><label><%= l(:field_status) %></label> <%= @issue.status.name %></p> |
|
| 8 |
<% end %> |
|
| 9 |
|
|
| 10 |
<p><%= f.select :priority_id, (@priorities.collect {|p| [p.name, p.id]}), {:required => true}, :disabled => !@issue.leaf? %></p>
|
|
| 11 |
<p><%= f.select :assigned_to_id, (@issue.assignable_users.collect {|m| [m.name, m.id]}), {:include_blank => true} %></p>
|
|
| 12 |
<% unless @project.issue_categories.empty? %> |
|
| 13 |
<p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true %>
|
|
| 14 |
<%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
|
|
| 15 |
l(:label_issue_category_new), |
|
| 16 |
'category[name]', |
|
| 17 |
{:controller => 'issue_categories', :action => 'new', :project_id => @project},
|
|
| 18 |
:title => l(:label_issue_category_new), |
|
| 19 |
:tabindex => 199) if authorize_for('issue_categories', 'new') %></p>
|
|
| 20 |
<% end %> |
|
| 21 |
<% unless @issue.assignable_versions.empty? %> |
|
| 22 |
<p><%= f.select :fixed_version_id, version_options_for_select(@issue.assignable_versions, @issue.fixed_version), :include_blank => true %> |
|
| 23 |
<%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
|
|
| 24 |
l(:label_version_new), |
|
| 25 |
'version[name]', |
|
| 26 |
{:controller => 'versions', :action => 'create', :project_id => @project},
|
|
| 27 |
:title => l(:label_version_new), |
|
| 28 |
:tabindex => 200) if authorize_for('versions', 'new') %>
|
|
| 29 |
</p> |
|
| 30 |
<% end %> |
|
| 31 |
</div> |
|
| 32 |
|
|
| 33 |
<div class="splitcontentright"> |
|
| 34 |
<% if User.current.allowed_to?(:manage_subtasks, @project) %> |
|
| 35 |
<p id="parent_issue"><%= f.text_field :parent_issue_id, :size => 10 %></p> |
|
| 36 |
<div id="parent_issue_candidates" class="autocomplete"></div> |
|
| 37 |
<%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %>
|
|
| 38 |
<% end %> |
|
| 39 |
<p><%= f.text_field :start_date, :size => 10, :disabled => !@issue.leaf? %><%= calendar_for('issue_start_date') if @issue.leaf? %></p>
|
|
| 40 |
<p><%= f.text_field :due_date, :size => 10, :disabled => !@issue.leaf? %><%= calendar_for('issue_due_date') if @issue.leaf? %></p>
|
|
| 41 |
<p><%= f.text_field :estimated_hours, :size => 3, :disabled => !@issue.leaf? %> <%= l(:field_hours) %></p> |
|
| 42 |
<% if @issue.leaf? && Issue.use_field_for_done_ratio? %> |
|
| 43 |
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
|
|
| 44 |
<% end %> |
|
| 45 |
</div> |
|
| 46 |
|
|
| 47 |
<div style="clear:both;"> </div> |
|
| 48 |
<%= render :partial => 'issues/form_custom_fields' %> |
|
| 49 |
|
|
| 50 |
<% end %> |
|
| app/views/issues/_changesets.html.erb | ||
|---|---|---|
| 1 |
<% changesets.each do |changeset| %> |
|
| 2 |
<div class="changeset <%= cycle('odd', 'even') %>">
|
|
| 3 |
<p><%= link_to_revision(changeset, changeset.project, |
|
| 4 |
:text => "#{l(:label_revision)} #{changeset.format_identifier}") %><br />
|
|
| 5 |
<span class="author"><%= authoring(changeset.committed_on, changeset.author) %></span></p> |
|
| 6 |
<div class="wiki"> |
|
| 7 |
<%= textilizable(changeset, :comments) %> |
|
| 8 |
</div> |
|
| 9 |
</div> |
|
| 10 |
<% end %> |
|
| app/views/issues/_changesets.rhtml | ||
|---|---|---|
| 1 |
<% changesets.each do |changeset| %> |
|
| 2 |
<div class="changeset <%= cycle('odd', 'even') %>">
|
|
| 3 |
<p><%= link_to_revision(changeset, changeset.project, |
|
| 4 |
:text => "#{l(:label_revision)} #{changeset.format_identifier}") %><br />
|
|
| 5 |
<span class="author"><%= authoring(changeset.committed_on, changeset.author) %></span></p> |
|
| 6 |
<div class="wiki"> |
|
| 7 |
<%= textilizable(changeset, :comments) %> |
|
| 8 |
</div> |
|
| 9 |
</div> |
|
| 10 |
<% end %> |
|
| app/views/issues/_edit.html.erb | ||
|---|---|---|
| 1 |
<% labelled_tabular_form_for :issue, @issue, |
|
| 2 |
:url => {:action => 'update', :id => @issue},
|
|
| 3 |
:html => {:id => 'issue-form',
|
|
| 4 |
:class => nil, |
|
| 5 |
:method => :put, |
|
| 6 |
:multipart => true} do |f| %> |
|
| 7 |
<%= error_messages_for 'issue', 'time_entry' %> |
|
| 8 |
<div class="box"> |
|
| 9 |
<% if @edit_allowed || !@allowed_statuses.empty? %> |
|
| 10 |
<fieldset class="tabular"><legend><%= l(:label_change_properties) %> |
|
| 11 |
<% if !@issue.new_record? && !@issue.errors.any? && @edit_allowed %> |
|
| 12 |
<small>(<%= link_to l(:label_more), {}, :onclick => 'Effect.toggle("issue_descr_fields", "appear", {duration:0.3}); return false;' %>)</small>
|
|
| 13 |
<% end %> |
|
| 14 |
</legend> |
|
| 15 |
<%= render :partial => (@edit_allowed ? 'form' : 'form_update'), :locals => {:f => f} %>
|
|
| 16 |
</fieldset> |
|
| 17 |
<% end %> |
|
| 18 |
<% if User.current.allowed_to?(:log_time, @project) %> |
|
| 19 |
<fieldset class="tabular"><legend><%= l(:button_log_time) %></legend> |
|
| 20 |
<% fields_for :time_entry, @time_entry, { :builder => TabularFormBuilder, :lang => current_language} do |time_entry| %>
|
|
| 21 |
<div class="splitcontentleft"> |
|
| 22 |
<p><%= time_entry.text_field :hours, :size => 6, :label => :label_spent_time %> <%= l(:field_hours) %></p> |
|
| 23 |
</div> |
|
| 24 |
<div class="splitcontentright"> |
|
| 25 |
<p><%= time_entry.select :activity_id, activity_collection_for_select_options %></p> |
|
| 26 |
</div> |
|
| 27 |
<p><%= time_entry.text_field :comments, :size => 60 %></p> |
|
| 28 |
<% @time_entry.custom_field_values.each do |value| %> |
|
| 29 |
<p><%= custom_field_tag_with_label :time_entry, value %></p> |
|
| 30 |
<% end %> |
|
| 31 |
<% end %> |
|
| 32 |
</fieldset> |
|
| 33 |
<% end %> |
|
| 34 |
|
|
| 35 |
<fieldset><legend><%= l(:field_notes) %></legend> |
|
| 36 |
<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %> |
|
| 37 |
<%= wikitoolbar_for 'notes' %> |
|
| 38 |
<%= call_hook(:view_issues_edit_notes_bottom, { :issue => @issue, :notes => @notes, :form => f }) %>
|
|
| 39 |
|
|
| 40 |
<p><%=l(:label_attachment_plural)%><br /><%= render :partial => 'attachments/form' %></p> |
|
| 41 |
</fieldset> |
|
| 42 |
</div> |
|
| 43 |
|
|
| 44 |
<%= f.hidden_field :lock_version %> |
|
| 45 |
<%= submit_tag l(:button_submit) %> |
|
| 46 |
<%= link_to_remote l(:label_preview), |
|
| 47 |
{ :url => preview_issue_path(:project_id => @project, :id => @issue),
|
|
| 48 |
:method => 'post', |
|
| 49 |
:update => 'preview', |
|
| 50 |
:with => 'Form.serialize("issue-form")',
|
|
| 51 |
:complete => "Element.scrollTo('preview')"
|
|
| 52 |
}, :accesskey => accesskey(:preview) %> |
|
| 53 |
<% end %> |
|
| 54 |
|
|
| 55 |
<div id="preview" class="wiki"></div> |
|
| app/views/issues/_edit.rhtml | ||
|---|---|---|
| 1 |
<% labelled_tabular_form_for :issue, @issue, |
|
| 2 |
:url => {:action => 'update', :id => @issue},
|
|
| 3 |
:html => {:id => 'issue-form',
|
|
| 4 |
:class => nil, |
|
| 5 |
:method => :put, |
|
| 6 |
:multipart => true} do |f| %> |
|
| 7 |
<%= error_messages_for 'issue', 'time_entry' %> |
|
| 8 |
<div class="box"> |
|
| 9 |
<% if @edit_allowed || !@allowed_statuses.empty? %> |
|
| 10 |
<fieldset class="tabular"><legend><%= l(:label_change_properties) %> |
|
| 11 |
<% if !@issue.new_record? && !@issue.errors.any? && @edit_allowed %> |
|
| 12 |
<small>(<%= link_to l(:label_more), {}, :onclick => 'Effect.toggle("issue_descr_fields", "appear", {duration:0.3}); return false;' %>)</small>
|
|
| 13 |
<% end %> |
|
| 14 |
</legend> |
|
| 15 |
<%= render :partial => (@edit_allowed ? 'form' : 'form_update'), :locals => {:f => f} %>
|
|
| 16 |
</fieldset> |
|
| 17 |
<% end %> |
|
| 18 |
<% if authorize_for('timelog', 'edit') %>
|
|
| 19 |
<fieldset class="tabular"><legend><%= l(:button_log_time) %></legend> |
|
| 20 |
<% fields_for :time_entry, @time_entry, { :builder => TabularFormBuilder, :lang => current_language} do |time_entry| %>
|
|
| 21 |
<div class="splitcontentleft"> |
|
| 22 |
<p><%= time_entry.text_field :hours, :size => 6, :label => :label_spent_time %> <%= l(:field_hours) %></p> |
|
| 23 |
</div> |
|
| 24 |
<div class="splitcontentright"> |
|
| 25 |
<p><%= time_entry.select :activity_id, activity_collection_for_select_options %></p> |
|
| 26 |
</div> |
|
| 27 |
<p><%= time_entry.text_field :comments, :size => 60 %></p> |
|
| 28 |
<% @time_entry.custom_field_values.each do |value| %> |
|
| 29 |
<p><%= custom_field_tag_with_label :time_entry, value %></p> |
|
| 30 |
<% end %> |
|
| 31 |
<% end %> |
|
| 32 |
</fieldset> |
|
| 33 |
<% end %> |
|
| 34 |
|
|
| 35 |
<fieldset><legend><%= l(:field_notes) %></legend> |
|
| 36 |
<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %> |
|
| 37 |
<%= wikitoolbar_for 'notes' %> |
|
| 38 |
<%= call_hook(:view_issues_edit_notes_bottom, { :issue => @issue, :notes => @notes, :form => f }) %>
|
|
| 39 |
|
|
| 40 |
<p><%=l(:label_attachment_plural)%><br /><%= render :partial => 'attachments/form' %></p> |
|
| 41 |
</fieldset> |
|
| 42 |
</div> |
|
| 43 |
|
|
| 44 |
<%= f.hidden_field :lock_version %> |
|
| 45 |
<%= submit_tag l(:button_submit) %> |
|
| 46 |
<%= link_to_remote l(:label_preview), |
|
| 47 |
{ :url => preview_issue_path(:project_id => @project, :id => @issue),
|
|
| 48 |
:method => 'post', |
|
| 49 |
:update => 'preview', |
|
| 50 |
:with => 'Form.serialize("issue-form")',
|
|
| 51 |
:complete => "Element.scrollTo('preview')"
|
|
| 52 |
}, :accesskey => accesskey(:preview) %> |
|
| 53 |
<% end %> |
|
| 54 |
|
|
| 55 |
<div id="preview" class="wiki"></div> |
|
| app/views/issues/_form.html.erb | ||
|---|---|---|
| 1 |
<%= call_hook(:view_issues_form_details_top, { :issue => @issue, :form => f }) %>
|
|
| 2 |
|
|
| 3 |
<div id="issue_descr_fields" <%= 'style="display:none"' unless @issue.new_record? || @issue.errors.any? %>> |
|
| 4 |
<% if @issue.safe_attribute_names.include?('is_private') %>
|
|
| 5 |
<p style="float:right; margin-right:1em;"> |
|
| 6 |
<label class="inline" for="issue_is_private" id="issue_is_private_label"><%= f.check_box :is_private, :no_label => true %> <%= l(:field_is_private) %></label> |
|
| 7 |
</p> |
|
| 8 |
<% end %> |
|
| 9 |
<p><%= f.select :tracker_id, @project.trackers.collect {|t| [t.name, t.id]}, :required => true %></p>
|
|
| 10 |
<%= observe_field :issue_tracker_id, :url => { :action => :new, :project_id => @project, :id => @issue },
|
|
| 11 |
:update => :attributes, |
|
| 12 |
:with => "Form.serialize('issue-form')" %>
|
|
| 13 |
|
|
| 14 |
<p><%= f.text_field :subject, :size => 80, :required => true %></p> |
|
| 15 |
|
|
| 16 |
<p><%= f.text_area :description, |
|
| 17 |
:cols => 60, |
|
| 18 |
:rows => (@issue.description.blank? ? 10 : [[10, @issue.description.length / 50].max, 100].min), |
|
| 19 |
:accesskey => accesskey(:edit), |
|
| 20 |
:class => 'wiki-edit' %></p> |
|
| 21 |
</div> |
|
| 22 |
|
|
| 23 |
<div id="attributes" class="attributes"> |
|
| 24 |
<%= render :partial => 'issues/attributes' %> |
|
| 25 |
</div> |
|
| 26 |
|
|
| 27 |
<% if @issue.new_record? %> |
|
| 28 |
<p id="attachments_form"><%= label_tag('attachments[1][file]', l(:label_attachment_plural))%><%= render :partial => 'attachments/form' %></p>
|
|
| 29 |
<% end %> |
|
| 30 |
|
|
| 31 |
<% if @issue.new_record? && User.current.allowed_to?(:add_issue_watchers, @project) -%> |
|
| 32 |
<p id="watchers_form"><label><%= l(:label_issue_watchers) %></label> |
|
| 33 |
<% @issue.project.users.sort.each do |user| -%> |
|
| 34 |
<label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, !!(@issue.watched_by?(user) or user == User.current) %> <%=h user %></label> |
|
| 35 |
<% end -%> |
|
| 36 |
</p> |
|
| 37 |
<% end %> |
|
| 38 |
|
|
| 39 |
<%= call_hook(:view_issues_form_details_bottom, { :issue => @issue, :form => f }) %>
|
|
| 40 |
|
|
| 41 |
<%= wikitoolbar_for 'issue_description' %> |
|
| app/views/issues/_form.rhtml | ||
|---|---|---|
| 1 |
<%= call_hook(:view_issues_form_details_top, { :issue => @issue, :form => f }) %>
|
|
| 2 |
|
|
| 3 |
<div id="issue_descr_fields" <%= 'style="display:none"' unless @issue.new_record? || @issue.errors.any? %>> |
|
| 4 |
<% if @issue.safe_attribute_names.include?('is_private') %>
|
|
| 5 |
<p style="float:right; margin-right:1em;"> |
|
| 6 |
<label class="inline" for="issue_is_private"><%= f.check_box :is_private, :no_label => true %> <%= l(:field_is_private) %></label> |
|
| 7 |
</p> |
|
| 8 |
<% end %> |
|
| 9 |
<p><%= f.select :tracker_id, @project.trackers.collect {|t| [t.name, t.id]}, :required => true %></p>
|
|
| 10 |
<%= observe_field :issue_tracker_id, :url => { :action => :new, :project_id => @project, :id => @issue },
|
|
| 11 |
:update => :attributes, |
|
| 12 |
:with => "Form.serialize('issue-form')" %>
|
|
| 13 |
|
|
| 14 |
<p><%= f.text_field :subject, :size => 80, :required => true %></p> |
|
| 15 |
|
|
| 16 |
<p><%= f.text_area :description, |
|
| 17 |
:cols => 60, |
|
| 18 |
:rows => (@issue.description.blank? ? 10 : [[10, @issue.description.length / 50].max, 100].min), |
|
| 19 |
:accesskey => accesskey(:edit), |
|
| 20 |
:class => 'wiki-edit' %></p> |
|
| 21 |
</div> |
|
| 22 |
|
|
| 23 |
<div id="attributes" class="attributes"> |
|
| 24 |
<%= render :partial => 'issues/attributes' %> |
|
| 25 |
</div> |
|
| 26 |
|
|
| 27 |
<% if @issue.new_record? %> |
|
| 28 |
<p id="attachments_form"><%= label_tag('attachments[1][file]', l(:label_attachment_plural))%><%= render :partial => 'attachments/form' %></p>
|
|
| 29 |
<% end %> |
|
| 30 |
|
|
| 31 |
<% if @issue.new_record? && User.current.allowed_to?(:add_issue_watchers, @project) -%> |
|
| 32 |
<p id="watchers_form"><label><%= l(:label_issue_watchers) %></label> |
|
| 33 |
<% @issue.project.users.sort.each do |user| -%> |
|
| 34 |
<label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, !!(@issue.watched_by?(user) or user == User.current) %> <%=h user %></label> |
|
| 35 |
<% end -%> |
|
| 36 |
</p> |
|
| 37 |
<% end %> |
|
| 38 |
|
|
| 39 |
<%= call_hook(:view_issues_form_details_bottom, { :issue => @issue, :form => f }) %>
|
|
| 40 |
|
|
| 41 |
<%= wikitoolbar_for 'issue_description' %> |
|
| app/views/issues/_form_custom_fields.html.erb | ||
|---|---|---|
| 1 |
<div class="splitcontentleft"> |
|
| 2 |
<% i = 0 %> |
|
| 3 |
<% split_on = (@issue.custom_field_values.size / 2.0).ceil - 1 %> |
|
| 4 |
<% @issue.custom_field_values.each do |value| %> |
|
| 5 |
<p><%= custom_field_tag_with_label :issue, value %></p> |
|
| 6 |
<% if i == split_on -%> |
|
| 7 |
</div><div class="splitcontentright"> |
|
| 8 |
<% end -%> |
|
| 9 |
<% i += 1 -%> |
|
| 10 |
<% end -%> |
|
| 11 |
</div> |
|
| 12 |
<div style="clear:both;"> </div> |
|
| app/views/issues/_form_custom_fields.rhtml | ||
|---|---|---|
| 1 |
<div class="splitcontentleft"> |
|
| 2 |
<% i = 0 %> |
|
| 3 |
<% split_on = (@issue.custom_field_values.size / 2.0).ceil - 1 %> |
|
| 4 |
<% @issue.custom_field_values.each do |value| %> |
|
| 5 |
<p><%= custom_field_tag_with_label :issue, value %></p> |
|
| 6 |
<% if i == split_on -%> |
|
| 7 |
</div><div class="splitcontentright"> |
|
| 8 |
<% end -%> |
|
| 9 |
<% i += 1 -%> |
|
| 10 |
<% end -%> |
|
| 11 |
</div> |
|
| 12 |
<div style="clear:both;"> </div> |
|
| app/views/issues/_form_update.html.erb | ||
|---|---|---|
| 1 |
<div class="attributes"> |
|
| 2 |
<div class="splitcontentleft"> |
|
| 3 |
<p><%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), :required => true %></p>
|
|
| 4 |
<p><%= f.select :assigned_to_id, principals_options_for_select(@issue.assignable_users, @issue.assigned_to), :include_blank => true %></p> |
|
| 5 |
</div> |
|
| 6 |
<div class="splitcontentright"> |
|
| 7 |
<% if Issue.use_field_for_done_ratio? %> |
|
| 8 |
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
|
|
| 9 |
<% end %> |
|
| 10 |
<% unless @issue.assignable_versions.empty? %> |
|
| 11 |
<p><%= f.select :fixed_version_id, (@issue.assignable_versions.collect {|v| [v.name, v.id]}), :include_blank => true %></p>
|
|
| 12 |
<% end %> |
|
| 13 |
</div> |
|
| 14 |
</div> |
|
| app/views/issues/_form_update.rhtml | ||
|---|---|---|
| 1 |
<div class="attributes"> |
|
| 2 |
<div class="splitcontentleft"> |
|
| 3 |
<p><%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), :required => true %></p>
|
|
| 4 |
<p><%= f.select :assigned_to_id, (@issue.assignable_users.collect {|m| [m.name, m.id]}), :include_blank => true %></p>
|
|
| 5 |
</div> |
|
| 6 |
<div class="splitcontentright"> |
|
| 7 |
<% if Issue.use_field_for_done_ratio? %> |
|
| 8 |
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
|
|
| 9 |
<% end %> |
|
| 10 |
<% unless @issue.assignable_versions.empty? %> |
|
| 11 |
<p><%= f.select :fixed_version_id, (@issue.assignable_versions.collect {|v| [v.name, v.id]}), :include_blank => true %></p>
|
|
| 12 |
<% end %> |
|
| 13 |
</div> |
|
| 14 |
</div> |
|
| app/views/issues/_history.html.erb | ||
|---|---|---|
| 1 |
<% reply_links = authorize_for('issues', 'edit') -%>
|
|
| 2 |
<% for journal in journals %> |
|
| 3 |
<div id="change-<%= journal.id %>" class="<%= journal.css_classes %>"> |
|
| 4 |
<h4><div class="journal-link"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
|
|
| 5 |
<%= avatar(journal.user, :size => "24") %> |
|
| 6 |
<%= content_tag('a', '', :name => "note-#{journal.indice}")%>
|
|
| 7 |
<%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %></h4> |
|
| 8 |
|
|
| 9 |
<% if journal.details.any? %> |
|
| 10 |
<ul class="details"> |
|
| 11 |
<% for detail in journal.details %> |
|
| 12 |
<li><%= show_detail(detail) %></li> |
|
| 13 |
<% end %> |
|
| 14 |
</ul> |
|
| 15 |
<% end %> |
|
| 16 |
<%= render_notes(issue, journal, :reply_links => reply_links) unless journal.notes.blank? %> |
|
| 17 |
</div> |
|
| 18 |
<%= call_hook(:view_issues_history_journal_bottom, { :journal => journal }) %>
|
|
| 19 |
<% end %> |
|
| 20 |
|
|
| 21 |
<% heads_for_wiki_formatter if User.current.allowed_to?(:edit_issue_notes, issue.project) || User.current.allowed_to?(:edit_own_issue_notes, issue.project) %> |
|
| app/views/issues/_history.rhtml | ||
|---|---|---|
| 1 |
<% reply_links = authorize_for('issues', 'edit') -%>
|
|
| 2 |
<% for journal in journals %> |
|
| 3 |
<div id="change-<%= journal.id %>" class="<%= journal.css_classes %>"> |
|
| 4 |
<h4><div class="journal-link"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
|
|
| 5 |
<%= avatar(journal.user, :size => "24") %> |
|
| 6 |
<%= content_tag('a', '', :name => "note-#{journal.indice}")%>
|
|
| 7 |
<%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %></h4> |
|
| 8 |
|
|
| 9 |
<% if journal.details.any? %> |
|
| 10 |
<ul class="details"> |
|
| 11 |
<% for detail in journal.details %> |
|
| 12 |
<li><%= show_detail(detail) %></li> |
|
| 13 |
<% end %> |
|
| 14 |
</ul> |
|
| 15 |
<% end %> |
|
| 16 |
<%= render_notes(issue, journal, :reply_links => reply_links) unless journal.notes.blank? %> |
|
| 17 |
</div> |
|
| 18 |
<%= call_hook(:view_issues_history_journal_bottom, { :journal => journal }) %>
|
|
| 19 |
<% end %> |
|
| 20 |
|
|
| 21 |
<% heads_for_wiki_formatter if User.current.allowed_to?(:edit_issue_notes, issue.project) || User.current.allowed_to?(:edit_own_issue_notes, issue.project) %> |
|
| app/views/issues/_list.html.erb | ||
|---|---|---|
| 1 |
<% form_tag({}) do -%>
|
|
| 2 |
<%= hidden_field_tag 'back_url', url_for(params) %> |
|
| 3 |
<div class="autoscroll"> |
|
| 4 |
<table class="list issues"> |
|
| 5 |
<thead><tr> |
|
| 6 |
<th class="checkbox hide-when-print"><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;',
|
|
| 7 |
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
|
|
| 8 |
</th> |
|
| 9 |
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
|
|
| 10 |
<% query.columns.each do |column| %> |
|
| 11 |
<%= column_header(column) %> |
|
| 12 |
<% end %> |
|
| 13 |
</tr></thead> |
|
| 14 |
<% previous_group = false %> |
|
| 15 |
<tbody> |
|
| 16 |
<% issue_list(issues) do |issue, level| -%> |
|
| 17 |
<% if @query.grouped? && (group = @query.group_by_column.value(issue)) != previous_group %> |
|
| 18 |
<% reset_cycle %> |
|
| 19 |
<tr class="group open"> |
|
| 20 |
<td colspan="<%= query.columns.size + 2 %>"> |
|
| 21 |
<span class="expander" onclick="toggleRowGroup(this);"> </span> |
|
| 22 |
<%= group.blank? ? 'None' : column_content(@query.group_by_column, issue) %> <span class="count">(<%= @issue_count_by_group[group] %>)</span> |
|
| 23 |
<%= link_to_function("#{l(:button_collapse_all)}/#{l(:button_expand_all)}", "toggleAllRowGroups(this)", :class => 'toggle-all') %>
|
|
| 24 |
</td> |
|
| 25 |
</tr> |
|
| 26 |
<% previous_group = group %> |
|
| 27 |
<% end %> |
|
| 28 |
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
|
|
| 29 |
<td class="checkbox hide-when-print"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
|
|
| 30 |
<td class="id"><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td> |
|
| 31 |
<% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.css_classes %><% end %> |
|
| 32 |
</tr> |
|
| 33 |
<% end -%> |
|
| 34 |
</tbody> |
|
| 35 |
</table> |
|
| 36 |
</div> |
|
| 37 |
<% end -%> |
|
| app/views/issues/_list.rhtml | ||
|---|---|---|
| 1 |
<% form_tag({}) do -%>
|
|
| 2 |
<%= hidden_field_tag 'back_url', url_for(params) %> |
|
| 3 |
<div class="autoscroll"> |
|
| 4 |
<table class="list issues"> |
|
| 5 |
<thead><tr> |
|
| 6 |
<th class="checkbox hide-when-print"><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;',
|
|
| 7 |
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
|
|
| 8 |
</th> |
|
| 9 |
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
|
|
| 10 |
<% query.columns.each do |column| %> |
|
| 11 |
<%= column_header(column) %> |
|
| 12 |
<% end %> |
|
| 13 |
</tr></thead> |
|
| 14 |
<% previous_group = false %> |
|
| 15 |
<tbody> |
|
| 16 |
<% issue_list(issues) do |issue, level| -%> |
|
| 17 |
<% if @query.grouped? && (group = @query.group_by_column.value(issue)) != previous_group %> |
|
| 18 |
<% reset_cycle %> |
|
| 19 |
<tr class="group open"> |
|
| 20 |
<td colspan="<%= query.columns.size + 2 %>"> |
|
| 21 |
<span class="expander" onclick="toggleRowGroup(this); return false;"> </span> |
|
| 22 |
<%= group.blank? ? 'None' : column_content(@query.group_by_column, issue) %> <span class="count">(<%= @issue_count_by_group[group] %>)</span> |
|
| 23 |
<%= link_to_function("#{l(:button_collapse_all)}/#{l(:button_expand_all)}", "toggleAllRowGroups(this)", :class => 'toggle-all') %>
|
|
| 24 |
</td> |
|
| 25 |
</tr> |
|
| 26 |
<% previous_group = group %> |
|
| 27 |
<% end %> |
|
| 28 |
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
|
|
| 29 |
<td class="checkbox hide-when-print"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
|
|
| 30 |
<td class="id"><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td> |
|
| 31 |
<% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.css_classes %><% end %> |
|
| 32 |
</tr> |
|
| 33 |
<% end -%> |
|
| 34 |
</tbody> |
|
| 35 |
</table> |
|
| 36 |
</div> |
|
| 37 |
<% end -%> |
|
| app/views/issues/_list_simple.html.erb | ||
|---|---|---|
| 1 |
<% if issues && issues.any? %> |
|
| 2 |
<% form_tag({}) do %>
|
|
| 3 |
<table class="list issues"> |
|
| 4 |
<thead><tr> |
|
| 5 |
<th>#</th> |
|
| 6 |
<th><%=l(:field_project)%></th> |
|
| 7 |
<th><%=l(:field_tracker)%></th> |
|
| 8 |
<th><%=l(:field_subject)%></th> |
|
| 9 |
</tr></thead> |
|
| 10 |
<tbody> |
|
| 11 |
<% for issue in issues %> |
|
| 12 |
<tr id="issue-<%= h(issue.id) %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %>">
|
|
| 13 |
<td class="id"> |
|
| 14 |
<%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %>
|
|
| 15 |
<%= link_to(h(issue.id), :controller => 'issues', :action => 'show', :id => issue) %> |
|
| 16 |
</td> |
|
| 17 |
<td class="project"><%= link_to_project(issue.project) %></td> |
|
| 18 |
<td class="tracker"><%=h issue.tracker %></td> |
|
| 19 |
<td class="subject"> |
|
| 20 |
<%= link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue %> (<%=h issue.status %>) |
|
| 21 |
</td> |
|
| 22 |
</tr> |
|
| 23 |
<% end %> |
|
| 24 |
</tbody> |
|
| 25 |
</table> |
|
| 26 |
<% end %> |
|
| 27 |
<% else %> |
|
| 28 |
<p class="nodata"><%= l(:label_no_data) %></p> |
|
| 29 |
<% end %> |
|
| app/views/issues/_list_simple.rhtml | ||
|---|---|---|
| 1 |
<% if issues && issues.any? %> |
|
| 2 |
<% form_tag({}) do %>
|
|
| 3 |
<table class="list issues"> |
|
| 4 |
<thead><tr> |
|
| 5 |
<th>#</th> |
|
| 6 |
<th><%=l(:field_project)%></th> |
|
| 7 |
<th><%=l(:field_tracker)%></th> |
|
| 8 |
<th><%=l(:field_subject)%></th> |
|
| 9 |
</tr></thead> |
|
| 10 |
<tbody> |
|
| 11 |
<% for issue in issues %> |
|
| 12 |
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %>">
|
|
| 13 |
<td class="id"> |
|
| 14 |
<%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %>
|
|
| 15 |
<%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %> |
|
| 16 |
</td> |
|
| 17 |
<td class="project"><%= link_to_project(issue.project) %></td> |
|
| 18 |
<td class="tracker"><%=h issue.tracker %></td> |
|
| 19 |
<td class="subject"> |
|
| 20 |
<%= link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue %> (<%=h issue.status %>) |
|
| 21 |
</td> |
|
| 22 |
</tr> |
|
| 23 |
<% end %> |
|
| 24 |
</tbody> |
|
| 25 |
</table> |
|
| 26 |
<% end %> |
|
| 27 |
<% else %> |
|
| 28 |
<p class="nodata"><%= l(:label_no_data) %></p> |
|
| 29 |
<% end %> |
|
| app/views/issues/_relations.html.erb | ||
|---|---|---|
| 1 |
<div class="contextual"> |
|
| 2 |
<% if User.current.allowed_to?(:manage_issue_relations, @project) %> |
|
| 3 |
<%= toggle_link l(:button_add), 'new-relation-form', {:focus => 'relation_issue_to_id'} %>
|
|
| 4 |
<% end %> |
|
| 5 |
</div> |
|
| 6 |
|
|
| 7 |
<p><strong><%=l(:label_related_issues)%></strong></p> |
|
| 8 |
|
|
| 9 |
<% if @relations.present? %> |
|
| 10 |
<form> |
|
| 11 |
<table class="list issues"> |
|
| 12 |
<% @relations.each do |relation| %> |
|
| 13 |
<tr class="issue hascontextmenu" id="relation-<%= relation.id %>"> |
|
| 14 |
<td class="checkbox"><%= check_box_tag("ids[]", relation.other_issue(@issue).id, false, :id => nil) %></td>
|
|
| 15 |
<td class="subject"><%= l(relation.label_for(@issue)) %> <%= "(#{l('datetime.distance_in_words.x_days', :count => relation.delay)})" if relation.delay && relation.delay != 0 %>
|
|
| 16 |
<%= h(relation.other_issue(@issue).project) + ' - ' if Setting.cross_project_issue_relations? %> |
|
| 17 |
<%= link_to_issue(relation.other_issue(@issue), :truncate => 60) %> |
|
| 18 |
</td> |
|
| 19 |
<td class="status"><%=h relation.other_issue(@issue).status.name %></td> |
|
| 20 |
<td class="start_date"><%= format_date(relation.other_issue(@issue).start_date) %></td> |
|
| 21 |
<td class="due_date"><%= format_date(relation.other_issue(@issue).due_date) %></td> |
|
| 22 |
<td class="buttons"><%= link_to_remote(image_tag('link_break.png'), { :url => {:controller => 'issue_relations', :action => 'destroy', :id => relation},
|
|
| 23 |
:method => :delete |
|
| 24 |
}, :title => l(:label_relation_delete)) if authorize_for('issue_relations', 'destroy') %></td>
|
|
| 25 |
</tr> |
|
| 26 |
<% end %> |
|
| 27 |
</table> |
|
| 28 |
</form> |
|
| 29 |
<% end %> |
|
| 30 |
|
|
| 31 |
<% remote_form_for(:relation, @relation, |
|
| 32 |
:url => {:controller => 'issue_relations', :action => 'create', :issue_id => @issue},
|
|
| 33 |
:method => :post, |
|
| 34 |
:complete => "Form.Element.focus('relation_issue_to_id');",
|
|
| 35 |
:html => {:id => 'new-relation-form', :style => (@relation ? '' : 'display: none;')}) do |f| %>
|
|
| 36 |
<%= render :partial => 'issue_relations/form', :locals => {:f => f}%>
|
|
| 37 |
<% end %> |
|
| app/views/issues/_relations.rhtml | ||
|---|---|---|
| 1 |
<div class="contextual"> |
|
| 2 |
<% if User.current.allowed_to?(:manage_issue_relations, @project) %> |
|
| 3 |
<%= toggle_link l(:button_add), 'new-relation-form', {:focus => 'relation_issue_to_id'} %>
|
|
| 4 |
<% end %> |
|
| 5 |
</div> |
|
| 6 |
|
|
| 7 |
<p><strong><%=l(:label_related_issues)%></strong></p> |
|
| 8 |
|
|
| 9 |
<% if @relations.present? %> |
|
| 10 |
<form> |
|
| 11 |
<table class="list issues"> |
|
| 12 |
<% @relations.each do |relation| %> |
|
| 13 |
<tr class="issue hascontextmenu"> |
|
| 14 |
<td class="checkbox"><%= check_box_tag("ids[]", relation.other_issue(@issue).id, false, :id => nil) %></td>
|
|
| 15 |
<td class="subject"><%= l(relation.label_for(@issue)) %> <%= "(#{l('datetime.distance_in_words.x_days', :count => relation.delay)})" if relation.delay && relation.delay != 0 %>
|
|
| 16 |
<%= h(relation.other_issue(@issue).project) + ' - ' if Setting.cross_project_issue_relations? %> |
|
| 17 |
<%= link_to_issue(relation.other_issue(@issue), :truncate => 60) %> |
|
| 18 |
</td> |
|
| 19 |
<td class="status"><%= relation.other_issue(@issue).status.name %></td> |
|
| 20 |
<td class="start_date"><%= format_date(relation.other_issue(@issue).start_date) %></td> |
|
| 21 |
<td class="due_date"><%= format_date(relation.other_issue(@issue).due_date) %></td> |
|
| 22 |
<td class="buttons"><%= link_to_remote(image_tag('link_break.png'), { :url => {:controller => 'issue_relations', :action => 'destroy', :issue_id => @issue, :id => relation},
|
|
| 23 |
:method => :post |
|
| 24 |
}, :title => l(:label_relation_delete)) if authorize_for('issue_relations', 'destroy') %></td>
|
|
| 25 |
</tr> |
|
| 26 |
<% end %> |
|
| 27 |
</table> |
|
| 28 |
</form> |
|
| 29 |
<% end %> |
|
| 30 |
|
|
| 31 |
<% remote_form_for(:relation, @relation, |
|
| 32 |
:url => {:controller => 'issue_relations', :action => 'new', :issue_id => @issue},
|
|
| 33 |
:method => :post, |
|
| 34 |
:complete => "Form.Element.focus('relation_issue_to_id');",
|
|
| 35 |
:html => {:id => 'new-relation-form', :style => (@relation ? '' : 'display: none;')}) do |f| %>
|
|
| 36 |
<%= render :partial => 'issue_relations/form', :locals => {:f => f}%>
|
|
| 37 |
<% end %> |
|
| app/views/issues/_sidebar.html.erb | ||
|---|---|---|
| 1 |
<h3><%= l(:label_issue_plural) %></h3> |
|
| 2 |
<%= link_to l(:label_issue_view_all), { :controller => 'issues', :action => 'index', :project_id => @project, :set_filter => 1 } %><br />
|
|
| 3 |
<% if @project %> |
|
| 4 |
<%= link_to l(:field_summary), :controller => 'reports', :action => 'issue_report', :id => @project %><br /> |
|
| 5 |
<% end %> |
|
| 6 |
<%= call_hook(:view_issues_sidebar_issues_bottom) %> |
|
| 7 |
|
|
| 8 |
<% if User.current.allowed_to?(:view_calendar, @project, :global => true) %> |
|
| 9 |
<%= link_to(l(:label_calendar), :controller => 'calendars', :action => 'show', :project_id => @project) %><br /> |
|
| 10 |
<% end %> |
|
| 11 |
<% if User.current.allowed_to?(:view_gantt, @project, :global => true) %> |
|
| 12 |
<%= link_to(l(:label_gantt), :controller => 'gantts', :action => 'show', :project_id => @project) %><br /> |
|
| 13 |
<% end %> |
|
| 14 |
<%= call_hook(:view_issues_sidebar_planning_bottom) %> |
|
| 15 |
|
|
| 16 |
<%= render_sidebar_queries %> |
|
| 17 |
<%= call_hook(:view_issues_sidebar_queries_bottom) %> |
|
| app/views/issues/_sidebar.rhtml | ||
|---|---|---|
| 1 |
<h3><%= l(:label_issue_plural) %></h3> |
|
| 2 |
<%= link_to l(:label_issue_view_all), { :controller => 'issues', :action => 'index', :project_id => @project, :set_filter => 1 } %><br />
|
|
| 3 |
<% if @project %> |
|
| 4 |
<%= link_to l(:field_summary), :controller => 'reports', :action => 'issue_report', :id => @project %><br /> |
|
| 5 |
<% end %> |
|
| 6 |
<%= call_hook(:view_issues_sidebar_issues_bottom) %> |
|
| 7 |
|
|
| 8 |
<% if User.current.allowed_to?(:view_calendar, @project, :global => true) %> |
|
| 9 |
<%= link_to(l(:label_calendar), :controller => 'calendars', :action => 'show', :project_id => @project) %><br /> |
|
| 10 |
<% end %> |
|
| 11 |
<% if User.current.allowed_to?(:view_gantt, @project, :global => true) %> |
|
| 12 |
<%= link_to(l(:label_gantt), :controller => 'gantts', :action => 'show', :project_id => @project) %><br /> |
|
| 13 |
<% end %> |
|
| 14 |
<%= call_hook(:view_issues_sidebar_planning_bottom) %> |
|
| 15 |
|
|
| 16 |
<%= render_sidebar_queries %> |
|
| 17 |
<%= call_hook(:view_issues_sidebar_queries_bottom) %> |
|
| app/views/issues/bulk_edit.html.erb | ||
|---|---|---|
| 1 |
<h2><%= l(:label_bulk_edit_selected_issues) %></h2> |
|
| 2 |
|
|
| 3 |
<ul><%= @issues.collect {|i| content_tag('li', link_to(h("#{i.tracker} ##{i.id}"), { :action => 'show', :id => i }) + h(": #{i.subject}")) }.join("\n") %></ul>
|
|
| 4 |
|
|
| 5 |
<% form_tag(:action => 'bulk_update') do %> |
|
| 6 |
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
|
|
| 7 |
<div class="box tabular"> |
|
| 8 |
<fieldset class="attributes"> |
|
| 9 |
<legend><%= l(:label_change_properties) %></legend> |
|
| 10 |
|
|
| 11 |
<div class="splitcontentleft"> |
|
| 12 |
<p> |
|
| 13 |
<label for="issue_tracker_id"><%= l(:field_tracker) %></label> |
|
| 14 |
<%= select_tag('issue[tracker_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@trackers, :id, :name)) %>
|
|
| 15 |
</p> |
|
| 16 |
<% if @available_statuses.any? %> |
|
| 17 |
<p> |
|
| 18 |
<label for='issue_status_id'><%= l(:field_status) %></label> |
|
| 19 |
<%= select_tag('issue[status_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@available_statuses, :id, :name)) %>
|
|
| 20 |
</p> |
|
| 21 |
<% end %> |
|
| 22 |
<p> |
|
| 23 |
<label for='issue_priority_id'><%= l(:field_priority) %></label> |
|
| 24 |
<%= select_tag('issue[priority_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(IssuePriority.active, :id, :name)) %>
|
|
| 25 |
</p> |
|
| 26 |
<p> |
|
| 27 |
<label for='issue_assigned_to_id'><%= l(:field_assigned_to) %></label> |
|
| 28 |
<%= select_tag('issue[assigned_to_id]', content_tag('option', l(:label_no_change_option), :value => '') +
|
|
| 29 |
content_tag('option', l(:label_nobody), :value => 'none') +
|
|
| 30 |
principals_options_for_select(@assignables)) %> |
|
| 31 |
</p> |
|
| 32 |
<% if @project %> |
|
| 33 |
<p> |
|
| 34 |
<label for='issue_category_id'><%= l(:field_category) %></label> |
|
| 35 |
<%= select_tag('issue[category_id]', content_tag('option', l(:label_no_change_option), :value => '') +
|
|
| 36 |
content_tag('option', l(:label_none), :value => 'none') +
|
|
| 37 |
options_from_collection_for_select(@project.issue_categories, :id, :name)) %> |
|
| 38 |
</p> |
|
| 39 |
<% end %> |
|
| 40 |
<% #TODO: allow editing versions when multiple projects %> |
|
| 41 |
<% if @project %> |
|
| 42 |
<p> |
|
| 43 |
<label for='issue_fixed_version_id'><%= l(:field_fixed_version) %></label> |
|
| 44 |
<%= select_tag('issue[fixed_version_id]', content_tag('option', l(:label_no_change_option), :value => '') +
|
|
| 45 |
content_tag('option', l(:label_none), :value => 'none') +
|
|
| 46 |
version_options_for_select(@project.shared_versions.open.sort)) %> |
|
| 47 |
</p> |
|
| 48 |
<% end %> |
|
| 49 |
|
|
| 50 |
<% @custom_fields.each do |custom_field| %> |
|
| 51 |
<p><label><%= h(custom_field.name) %> <%= custom_field_tag_for_bulk_edit('issue', custom_field, @projects) %></label></p>
|
|
| 52 |
<% end %> |
|
| 53 |
|
|
| 54 |
<%= call_hook(:view_issues_bulk_edit_details_bottom, { :issues => @issues }) %>
|
|
| 55 |
</div> |
|
| 56 |
|
|
| 57 |
<div class="splitcontentright"> |
|
| 58 |
<% if @project && User.current.allowed_to?(:manage_subtasks, @project) %> |
|
| 59 |
<p> |
|
| 60 |
<label for='issue_parent_issue_id'><%= l(:field_parent_issue) %></label> |
|
| 61 |
<%= text_field_tag 'issue[parent_issue_id]', '', :size => 10 %> |
|
| 62 |
</p> |
|
| 63 |
<div id="parent_issue_candidates" class="autocomplete"></div> |
|
| 64 |
<%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:project_id => @project) }')" %>
|
|
| 65 |
<% end %> |
|
| 66 |
<p> |
|
| 67 |
<label for='issue_start_date'><%= l(:field_start_date) %></label> |
|
| 68 |
<%= text_field_tag 'issue[start_date]', '', :size => 10 %><%= calendar_for('issue_start_date') %>
|
|
| 69 |
</p> |
|
| 70 |
<p> |
|
| 71 |
<label for='issue_due_date'><%= l(:field_due_date) %></label> |
|
| 72 |
<%= text_field_tag 'issue[due_date]', '', :size => 10 %><%= calendar_for('issue_due_date') %>
|
|
| 73 |
</p> |
|
| 74 |
<% if Issue.use_field_for_done_ratio? %> |
|
| 75 |
<p> |
|
| 76 |
<label for='issue_done_ratio'><%= l(:field_done_ratio) %></label> |
|
| 77 |
<%= select_tag 'issue[done_ratio]', options_for_select([[l(:label_no_change_option), '']] + (0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %>
|
|
| 78 |
</p> |
|
| 79 |
<% end %> |
|
| 80 |
</div> |
|
| 81 |
|
|
| 82 |
</fieldset> |
|
| 83 |
|
|
| 84 |
<fieldset><legend><%= l(:field_notes) %></legend> |
|
| 85 |
<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %> |
|
| 86 |
<%= wikitoolbar_for 'notes' %> |
|
| 87 |
</fieldset> |
|
| 88 |
</div> |
|
| 89 |
|
|
| 90 |
<p><%= submit_tag l(:button_submit) %></p> |
|
| 91 |
<% end %> |
|
| app/views/issues/bulk_edit.rhtml | ||
|---|---|---|
| 1 |
<h2><%= l(:label_bulk_edit_selected_issues) %></h2> |
|
| 2 |
|
|
| 3 |
<ul><%= @issues.collect {|i| content_tag('li', link_to(h("#{i.tracker} ##{i.id}"), { :action => 'show', :id => i }) + h(": #{i.subject}")) }.join("\n") %></ul>
|
|
| 4 |
|
|
| 5 |
<% form_tag(:action => 'bulk_update') do %> |
|
| 6 |
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
|
|
| 7 |
<div class="box tabular"> |
|
| 8 |
<fieldset class="attributes"> |
|
| 9 |
<legend><%= l(:label_change_properties) %></legend> |
|
| 10 |
|
|
| 11 |
<div class="splitcontentleft"> |
|
| 12 |
<p> |
|
| 13 |
<label><%= l(:field_tracker) %></label> |
|
| 14 |
<%= select_tag('issue[tracker_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@trackers, :id, :name)) %>
|
|
| 15 |
</p> |
|
| 16 |
<% if @available_statuses.any? %> |
|
| 17 |
<p> |
|
| 18 |
<label><%= l(:field_status) %></label> |
|
| 19 |
<%= select_tag('issue[status_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@available_statuses, :id, :name)) %>
|
|
| 20 |
</p> |
|
| 21 |
<% end %> |
|
| 22 |
<p> |
|
| 23 |
<label><%= l(:field_priority) %></label> |
|
| 24 |
<%= select_tag('issue[priority_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(IssuePriority.all, :id, :name)) %>
|
|
| 25 |
</p> |
|
| 26 |
<p> |
|
| 27 |
<label><%= l(:field_assigned_to) %></label> |
|
| 28 |
<%= select_tag('issue[assigned_to_id]', content_tag('option', l(:label_no_change_option), :value => '') +
|
|
| 29 |
content_tag('option', l(:label_nobody), :value => 'none') +
|
|
| 30 |
options_from_collection_for_select(@assignables, :id, :name)) %> |
|
| 31 |
</p> |
|
| 32 |
<% if @project %> |
|
| 33 |
<p> |
|
| 34 |
<label><%= l(:field_category) %></label> |
|
| 35 |
<%= select_tag('issue[category_id]', content_tag('option', l(:label_no_change_option), :value => '') +
|
|
| 36 |
content_tag('option', l(:label_none), :value => 'none') +
|
|
| 37 |
options_from_collection_for_select(@project.issue_categories, :id, :name)) %> |
|
| 38 |
</p> |
|
| 39 |
<% end %> |
|
| 40 |
<% #TODO: allow editing versions when multiple projects %> |
|
| 41 |
<% if @project %> |
|
| 42 |
<p> |
|
| 43 |
<label><%= l(:field_fixed_version) %></label> |
|
| 44 |
<%= select_tag('issue[fixed_version_id]', content_tag('option', l(:label_no_change_option), :value => '') +
|
|
| 45 |
content_tag('option', l(:label_none), :value => 'none') +
|
|
| 46 |
version_options_for_select(@project.shared_versions.open.sort)) %> |
|
| 47 |
</p> |
|
| 48 |
<% end %> |
|
| 49 |
|
|
| 50 |
<% @custom_fields.each do |custom_field| %> |
|
| 51 |
<p><label><%= h(custom_field.name) %></label> <%= custom_field_tag_for_bulk_edit('issue', custom_field, @projects) %></p>
|
|
| 52 |
<% end %> |
|
| 53 |
|
|
| 54 |
<%= call_hook(:view_issues_bulk_edit_details_bottom, { :issues => @issues }) %>
|
|
| 55 |
</div> |
|
| 56 |
|
|
| 57 |
<div class="splitcontentright"> |
|
| 58 |
<% if @project && User.current.allowed_to?(:manage_subtasks, @project) %> |
|
| 59 |
<p> |
|
| 60 |
<label><%= l(:field_parent_issue) %></label> |
|
| 61 |
<%= text_field_tag 'issue[parent_issue_id]', '', :size => 10 %> |
|
| 62 |
</p> |
|
| 63 |
<div id="parent_issue_candidates" class="autocomplete"></div> |
|
| 64 |
<%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:project_id => @project) }')" %>
|
|
| 65 |
<% end %> |
|
| 66 |
<p> |
|
| 67 |
<label><%= l(:field_start_date) %></label> |
|
| 68 |
<%= text_field_tag 'issue[start_date]', '', :size => 10 %><%= calendar_for('issue_start_date') %>
|
|
| 69 |
</p> |
|
| 70 |
<p> |
|
| 71 |
<label><%= l(:field_due_date) %></label> |
|
| 72 |
<%= text_field_tag 'issue[due_date]', '', :size => 10 %><%= calendar_for('issue_due_date') %>
|
|
| 73 |
</p> |
|
| 74 |
<% if Issue.use_field_for_done_ratio? %> |
|
| 75 |
<p> |
|
| 76 |
<label><%= l(:field_done_ratio) %></label> |
|
| 77 |
<%= select_tag 'issue[done_ratio]', options_for_select([[l(:label_no_change_option), '']] + (0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %>
|
|
| 78 |
</p> |
|
| 79 |
<% end %> |
|
| 80 |
</div> |
|
| 81 |
|
|
| 82 |
</fieldset> |
|
| 83 |
|
|
| 84 |
<fieldset><legend><%= l(:field_notes) %></legend> |
|
| 85 |
<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %> |
|
| 86 |
<%= wikitoolbar_for 'notes' %> |
|
| 87 |
</fieldset> |
|
| 88 |
</div> |
|
| 89 |
|
|
| 90 |
<p><%= submit_tag l(:button_submit) %></p> |
|
| 91 |
<% end %> |
|
| app/views/issues/destroy.html.erb | ||
|---|---|---|
| 1 |
<h2><%= l(:label_confirmation) %></h2> |
|
| 2 |
|
|
| 3 |
<% form_tag do %> |
|
| 4 |
<%= @issues.collect {|i| hidden_field_tag 'ids[]', i.id } %>
|
|
| 5 |
<div class="box"> |
|
| 6 |
<p><strong><%= l(:text_destroy_time_entries_question, :hours => number_with_precision(@hours, :precision => 2)) %></strong></p> |
|
| 7 |
<p> |
|
| 8 |
<label><%= radio_button_tag 'todo', 'destroy', true %> <%= l(:text_destroy_time_entries) %></label><br /> |
|
| 9 |
<label><%= radio_button_tag 'todo', 'nullify', false %> <%= l(:text_assign_time_entries_to_project) %></label><br /> |
|
| 10 |
<label><%= radio_button_tag 'todo', 'reassign', false, :onchange => 'if (this.checked) { $("reassign_to_id").focus(); }' %> <%= l(:text_reassign_time_entries) %></label>
|
|
| 11 |
<%= text_field_tag 'reassign_to_id', params[:reassign_to_id], :size => 6, :onfocus => '$("todo_reassign").checked=true;' %>
|
|
| 12 |
</p> |
|
| 13 |
</div> |
|
| 14 |
<%= submit_tag l(:button_apply) %> |
|
| 15 |
<% end %> |
|
| app/views/issues/destroy.rhtml | ||
|---|---|---|
| 1 |
<h2><%= l(:label_confirmation) %></h2> |
|
| 2 |
|
|
| 3 |
<% form_tag do %> |
|
| 4 |
<%= @issues.collect {|i| hidden_field_tag 'ids[]', i.id } %>
|
|
| 5 |
<div class="box"> |
|
| 6 |
<p><strong><%= l(:text_destroy_time_entries_question, :hours => number_with_precision(@hours, :precision => 2)) %></strong></p> |
|
| 7 |
<p> |
|
| 8 |
<label><%= radio_button_tag 'todo', 'destroy', true %> <%= l(:text_destroy_time_entries) %></label><br /> |
|
| 9 |
<label><%= radio_button_tag 'todo', 'nullify', false %> <%= l(:text_assign_time_entries_to_project) %></label><br /> |
|
| 10 |
<label><%= radio_button_tag 'todo', 'reassign', false, :onchange => 'if (this.checked) { $("reassign_to_id").focus(); }' %> <%= l(:text_reassign_time_entries) %></label>
|
|
| 11 |
<%= text_field_tag 'reassign_to_id', params[:reassign_to_id], :size => 6, :onfocus => '$("todo_reassign").checked=true;' %>
|
|
| 12 |
</p> |
|
| 13 |
</div> |
|
| 14 |
<%= submit_tag l(:button_apply) %> |
|
| 15 |
<% end %> |
|
| app/views/issues/edit.html.erb | ||
|---|---|---|
| 1 |
<h2><%=h "#{@issue.tracker.name} ##{@issue.id}" %></h2>
|
|
| 2 |
|
|
| 3 |
<%= render :partial => 'edit' %> |
|
| 4 |
<% content_for :header_tags do %> |
|
| 5 |
<%= robot_exclusion_tag %> |
|
| 6 |
<% end %> |
|
| app/views/issues/edit.rhtml | ||
|---|---|---|
| 1 |
<h2><%=h "#{@issue.tracker.name} ##{@issue.id}" %></h2>
|
|
| 2 |
|
|
| 3 |
<%= render :partial => 'edit' %> |
|
| 4 |
<% content_for :header_tags do %> |
|
| 5 |
<%= robot_exclusion_tag %> |
|
| 6 |
<% end %> |
|
| app/views/issues/index.api.rsb | ||
|---|---|---|
| 11 | 11 |
api.category(:id => issue.category_id, :name => issue.category.name) unless issue.category.nil? |
| 12 | 12 |
api.fixed_version(:id => issue.fixed_version_id, :name => issue.fixed_version.name) unless issue.fixed_version.nil? |
| 13 | 13 |
api.parent(:id => issue.parent_id) unless issue.parent.nil? |
| 14 |
|
|
| 15 |
api.subject issue.subject
|
|
| 14 |
|
|
| 15 |
api.subject issue.subject
|
|
| 16 | 16 |
api.description issue.description |
| 17 |
api.start_date issue.start_date
|
|
| 18 |
api.due_date issue.due_date
|
|
| 19 |
api.done_ratio issue.done_ratio
|
|
| 17 |
api.start_date issue.start_date
|
|
| 18 |
api.due_date issue.due_date
|
|
| 19 |
api.done_ratio issue.done_ratio
|
|
| 20 | 20 |
api.estimated_hours issue.estimated_hours |
| 21 |
|
|
| 21 |
|
|
| 22 | 22 |
render_api_custom_values issue.custom_field_values, api |
| 23 |
|
|
| 23 |
|
|
| 24 | 24 |
api.created_on issue.created_on |
| 25 | 25 |
api.updated_on issue.updated_on |
| 26 |
|
|
| 27 |
api.array :relations do |
|
| 28 |
issue.relations.each do |relation| |
|
| 29 |
api.relation(:id => relation.id, :issue_id => relation.issue_from_id, :issue_to_id => relation.issue_to_id, :relation_type => relation.relation_type, :delay => relation.delay) |
|
| 30 |
end |
|
| 31 |
end if include_in_api_response?('relations')
|
|
| 26 | 32 |
end |
| 27 | 33 |
end |
| 28 | 34 |
end |
| app/views/issues/index.html.erb | ||
|---|---|---|
| 1 |
<div class="contextual"> |
|
| 2 |
<% if !@query.new_record? && @query.editable_by?(User.current) %> |
|
| 3 |
<%= link_to l(:button_edit), edit_query_path(@query), :class => 'icon icon-edit' %> |
|
| 4 |
<%= link_to l(:button_delete), query_path(@query), :confirm => l(:text_are_you_sure), :method => :delete, :class => 'icon icon-del' %> |
|
| 5 |
<% end %> |
|
| 6 |
</div> |
|
| 7 |
|
|
| 8 |
<h2><%= @query.new_record? ? l(:label_issue_plural) : h(@query.name) %></h2> |
|
| 9 |
<% html_title(@query.new_record? ? l(:label_issue_plural) : @query.name) %> |
|
| 10 |
|
|
| 11 |
<% form_tag({ :controller => 'issues', :action => 'index', :project_id => @project }, :method => :get, :id => 'query_form') do %>
|
|
| 12 |
<%= hidden_field_tag 'set_filter', '1' %> |
|
| 13 |
<div id="query_form_content" class="hide-when-print"> |
|
| 14 |
<fieldset id="filters" class="collapsible <%= @query.new_record? ? "" : "collapsed" %>"> |
|
| 15 |
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend> |
|
| 16 |
<div style="<%= @query.new_record? ? "" : "display: none;" %>"> |
|
| 17 |
<%= render :partial => 'queries/filters', :locals => {:query => @query} %>
|
|
| 18 |
</div> |
|
| 19 |
</fieldset> |
|
| 20 |
<fieldset class="collapsible collapsed"> |
|
| 21 |
<legend onclick="toggleFieldset(this);"><%= l(:label_options) %></legend> |
|
| 22 |
<div style="display: none;"> |
|
| 23 |
<table> |
|
| 24 |
<tr> |
|
| 25 |
<td><%= l(:field_column_names) %></td> |
|
| 26 |
<td><%= render :partial => 'queries/columns', :locals => {:query => @query} %></td>
|
|
| 27 |
</tr> |
|
| 28 |
<tr> |
|
| 29 |
<td><label for='group_by'><%= l(:field_group_by) %></label></td> |
|
| 30 |
<td><%= select_tag('group_by', options_for_select([[]] + @query.groupable_columns.collect {|c| [c.caption, c.name.to_s]}, @query.group_by)) %></td>
|
|
| 31 |
</tr> |
|
| 32 |
</table> |
|
| 33 |
</div> |
|
| 34 |
</fieldset> |
|
| 35 |
</div> |
|
| 36 |
<p class="buttons hide-when-print"> |
|
| 37 |
|
|
| 38 |
<%= link_to_function l(:button_apply), 'submit_query_form("query_form")', :class => 'icon icon-checked' %>
|
|
| 39 |
<%= link_to l(:button_clear), { :set_filter => 1, :project_id => @project }, :class => 'icon icon-reload' %>
|
|
| 40 |
<% if @query.new_record? && User.current.allowed_to?(:save_queries, @project, :global => true) %> |
|
| 41 |
<%= link_to_function l(:button_save), "$('query_form').action='#{ @project ? new_project_query_path : new_query_path }'; submit_query_form('query_form')", :class => 'icon icon-save' %>
|
|
| 42 |
<% end %> |
|
| 43 |
</p> |
|
| 44 |
<% end %> |
|
| 45 |
|
|
| 46 |
<%= error_messages_for 'query' %> |
|
| 47 |
<% if @query.valid? %> |
|
| 48 |
<% if @issues.empty? %> |
|
| 49 |
<p class="nodata"><%= l(:label_no_data) %></p> |
|
| 50 |
<% else %> |
|
| 51 |
<%= render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query} %>
|
|
| 52 |
<p class="pagination"><%= pagination_links_full @issue_pages, @issue_count %></p> |
|
| 53 |
<% end %> |
|
| 54 |
|
|
| 55 |
<% other_formats_links do |f| %> |
|
| 56 |
<%= f.link_to 'Atom', :url => params.merge(:key => User.current.rss_key) %> |
|
| 57 |
<%= f.link_to 'CSV', :url => params, :onclick => "showModal('csv-export-options', '330px'); return false;" %>
|
|
| 58 |
<%= f.link_to 'PDF', :url => params %> |
|
| 59 |
<% end %> |
|
| 60 |
|
|
| 61 |
<div id="csv-export-options" style="display:none;"> |
|
| 62 |
<h3 class="title"><%= l(:label_export_options, :export_format => 'CSV') %></h3> |
|
| 63 |
<% form_tag(params.merge({:format => 'csv',:page=>nil}), :method => :get, :id => 'csv-export-form') do %>
|
|
| 64 |
<p> |
|
| 65 |
<label><%= radio_button_tag 'columns', '', true %> <%= l(:description_selected_columns) %></label><br /> |
|
| 66 |
<label><%= radio_button_tag 'columns', 'all' %> <%= l(:description_all_columns) %></label> |
|
| 67 |
</p> |
|
| 68 |
<p> |
|
| 69 |
<label><%= check_box_tag 'description', '1' %> <%= l(:field_description) %></label> |
|
| 70 |
</p> |
|
| 71 |
<p class="buttons"> |
|
| 72 |
<%= submit_tag l(:button_export), :name => nil, :onclick => "hideModal(this);" %> |
|
| 73 |
<%= submit_tag l(:button_cancel), :name => nil, :onclick => "hideModal(this);", :type => 'button' %> |
|
| 74 |
</p> |
|
| 75 |
<% end %> |
|
| 76 |
</div> |
|
| 77 |
|
|
| 78 |
<% end %> |
|
| 79 |
<%= call_hook(:view_issues_index_bottom, { :issues => @issues, :project => @project, :query => @query }) %>
|
|
| 80 |
|
|
| 81 |
<% content_for :sidebar do %> |
|
| 82 |
<%= render :partial => 'issues/sidebar' %> |
|
| 83 |
<% end %> |
|
| 84 |
|
|
| 85 |
<% content_for :header_tags do %> |
|
| 86 |
<%= auto_discovery_link_tag(:atom, {:query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_issue_plural)) %>
|
|
| 87 |
<%= auto_discovery_link_tag(:atom, {:controller => 'journals', :action => 'index', :query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_changes_details)) %>
|
|
| 88 |
<% end %> |
|
| 89 |
|
|
| 90 |
<%= context_menu issues_context_menu_path %> |
|
| app/views/issues/index.rhtml | ||
|---|---|---|
| 1 |
<div class="contextual"> |
|
| 2 |
<% if !@query.new_record? && @query.editable_by?(User.current) %> |
|
| 3 |
<%= link_to l(:button_edit), {:controller => 'queries', :action => 'edit', :id => @query}, :class => 'icon icon-edit' %>
|
|
| 4 |
<%= link_to l(:button_delete), {:controller => 'queries', :action => 'destroy', :id => @query}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
|
|
| 5 |
<% end %> |
|
| 6 |
</div> |
|
| 7 |
|
|
| 8 |
<h2><%= @query.new_record? ? l(:label_issue_plural) : h(@query.name) %></h2> |
|
| 9 |
<% html_title(@query.new_record? ? l(:label_issue_plural) : @query.name) %> |
|
| 10 |
|
|
| 11 |
<% form_tag({ :controller => 'issues', :action => 'index', :project_id => @project }, :method => :get, :id => 'query_form') do %>
|
|
| 12 |
<%= hidden_field_tag 'set_filter', '1' %> |
|
| 13 |
<div id="query_form_content" class="hide-when-print"> |
|
| 14 |
<fieldset id="filters" class="collapsible <%= @query.new_record? ? "" : "collapsed" %>"> |
|
| 15 |
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend> |
|
| 16 |
<div style="<%= @query.new_record? ? "" : "display: none;" %>"> |
|
| 17 |
<%= render :partial => 'queries/filters', :locals => {:query => @query} %>
|
|
| 18 |
</div> |
|
| 19 |
</fieldset> |
|
| 20 |
<fieldset class="collapsible collapsed"> |
|
| 21 |
<legend onclick="toggleFieldset(this);"><%= l(:label_options) %></legend> |
|
| 22 |
<div style="display: none;"> |
|
| 23 |
<table> |
|
| 24 |
<tr> |
|
| 25 |
<td><%= l(:field_column_names) %></td> |
|
| 26 |
<td><%= render :partial => 'queries/columns', :locals => {:query => @query} %></td>
|
|
| 27 |
</tr> |
|
| 28 |
<tr> |
|
| 29 |
<td><%= l(:field_group_by) %></td> |
|
| 30 |
<td><%= select_tag('group_by', options_for_select([[]] + @query.groupable_columns.collect {|c| [c.caption, c.name.to_s]}, @query.group_by)) %></td>
|
|
| 31 |
</tr> |
|
| 32 |
</table> |
|
| 33 |
</div> |
|
| 34 |
</fieldset> |
|
| 35 |
</div> |
|
| 36 |
<p class="buttons hide-when-print"> |
|
| 37 |
|
|
| 38 |
<%= link_to_function l(:button_apply), 'submit_query_form("query_form")', :class => 'icon icon-checked' %>
|
|
| 39 |
<%= link_to l(:button_clear), { :set_filter => 1, :project_id => @project }, :class => 'icon icon-reload' %>
|
|
| 40 |
<% if @query.new_record? && User.current.allowed_to?(:save_queries, @project, :global => true) %> |
|
| 41 |
<%= link_to_function l(:button_save), "$('query_form').action='#{ url_for :controller => 'queries', :action => 'new', :project_id => @project }'; submit_query_form('query_form')", :class => 'icon icon-save' %>
|
|
| 42 |
<% end %> |
|
| 43 |
</p> |
|
| 44 |
<% end %> |
|
| 45 |
|
|
| 46 |
<%= error_messages_for 'query' %> |
|
| 47 |
<% if @query.valid? %> |
|
| 48 |
<% if @issues.empty? %> |
|
| 49 |
<p class="nodata"><%= l(:label_no_data) %></p> |
|
| 50 |
<% else %> |
|
| 51 |
<%= render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query} %>
|
|
| 52 |
<p class="pagination"><%= pagination_links_full @issue_pages, @issue_count %></p> |
|
| 53 |
<% end %> |
|
| 54 |
|
|
| 55 |
<% other_formats_links do |f| %> |
|
| 56 |
<%= f.link_to 'Atom', :url => params.merge(:key => User.current.rss_key) %> |
|
| 57 |
<%= f.link_to 'CSV', :url => params %> |
|
| 58 |
<%= f.link_to 'PDF', :url => params %> |
|
| 59 |
<% end %> |
|
| 60 |
|
|
| 61 |
<% end %> |
|
| 62 |
<%= call_hook(:view_issues_index_bottom, { :issues => @issues, :project => @project, :query => @query }) %>
|
|
| 63 |
|
|
| 64 |
<% content_for :sidebar do %> |
|
| 65 |
<%= render :partial => 'issues/sidebar' %> |
|
| 66 |
<% end %> |
|
| 67 |
|
|
| 68 |
<% content_for :header_tags do %> |
|
| 69 |
<%= auto_discovery_link_tag(:atom, {:query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_issue_plural)) %>
|
|
| 70 |
<%= auto_discovery_link_tag(:atom, {:controller => 'journals', :action => 'index', :query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_changes_details)) %>
|
|
| 71 |
<% end %> |
|
| 72 |
|
|
| 73 |
<%= context_menu issues_context_menu_path %> |
|
| app/views/issues/new.html.erb | ||
|---|---|---|
| 1 |
<h2><%=l(:label_issue_new)%></h2> |
|
| 2 |
|
|
| 3 |
<% labelled_tabular_form_for :issue, @issue, :url => {:controller => 'issues', :action => 'create', :project_id => @project},
|
|
| 4 |
:html => {:multipart => true, :id => 'issue-form', :class => 'tabular new-issue-form'} do |f| %>
|
|
| 5 |
<%= error_messages_for 'issue' %> |
|
| 6 |
<div class="box"> |
|
| 7 |
<%= render :partial => 'issues/form', :locals => {:f => f} %>
|
|
| 8 |
</div> |
|
| 9 |
<%= submit_tag l(:button_create) %> |
|
| 10 |
<%= submit_tag l(:button_create_and_continue), :name => 'continue' %> |
|
| 11 |
<%= link_to_remote l(:label_preview), |
|
| 12 |
{ :url => preview_issue_path(:project_id => @project),
|
|
| 13 |
:method => 'post', |
|
| 14 |
:update => 'preview', |
|
| 15 |
:with => "Form.serialize('issue-form')",
|
|
| 16 |
:complete => "Element.scrollTo('preview')"
|
|
| 17 |
}, :accesskey => accesskey(:preview) %> |
|
| 18 |
|
|
| 19 |
<%= javascript_tag "Form.Element.focus('issue_subject');" %>
|
|
| 20 |
<% end %> |
|
| 21 |
|
|
| 22 |
<div id="preview" class="wiki"></div> |
|
| 23 |
|
|
| 24 |
<% content_for :header_tags do %> |
|
| 25 |
<%= stylesheet_link_tag 'scm' %> |
|
| 26 |
<%= robot_exclusion_tag %> |
|
| 27 |
<% end %> |
|
| app/views/issues/new.rhtml | ||
|---|---|---|
| 1 |
<h2><%=l(:label_issue_new)%></h2> |
|
| 2 |
|
|
| 3 |
<% labelled_tabular_form_for :issue, @issue, :url => {:controller => 'issues', :action => 'create', :project_id => @project},
|
|
| 4 |
:html => {:multipart => true, :id => 'issue-form', :class => 'tabular new-issue-form'} do |f| %>
|
|
| 5 |
<%= error_messages_for 'issue' %> |
|
| 6 |
<div class="box"> |
|
| 7 |
<%= render :partial => 'issues/form', :locals => {:f => f} %>
|
|
| 8 |
</div> |
|
| 9 |
<%= submit_tag l(:button_create) %> |
|
| 10 |
<%= submit_tag l(:button_create_and_continue), :name => 'continue' %> |
|
| 11 |
<%= link_to_remote l(:label_preview), |
|
| 12 |
{ :url => preview_issue_path(:project_id => @project),
|
|
| 13 |
:method => 'post', |
|
| 14 |
:update => 'preview', |
|
| 15 |
:with => "Form.serialize('issue-form')",
|
|
| 16 |
:complete => "Element.scrollTo('preview')"
|
|
| 17 |
}, :accesskey => accesskey(:preview) %> |
|
| 18 |
|
|
| 19 |
<%= javascript_tag "Form.Element.focus('issue_subject');" %>
|
|
| 20 |
<% end %> |
|
| 21 |
|
|
| 22 |
<div id="preview" class="wiki"></div> |
|
| 23 |
|
|
| 24 |
<% content_for :header_tags do %> |
|
| 25 |
<%= stylesheet_link_tag 'scm' %> |
|
| 26 |
<%= robot_exclusion_tag %> |
|
| 27 |
<% end %> |
|
| app/views/issues/show.api.rsb | ||
|---|---|---|
| 9 | 9 |
api.category(:id => @issue.category_id, :name => @issue.category.name) unless @issue.category.nil? |
| 10 | 10 |
api.fixed_version(:id => @issue.fixed_version_id, :name => @issue.fixed_version.name) unless @issue.fixed_version.nil? |
| 11 | 11 |
api.parent(:id => @issue.parent_id) unless @issue.parent.nil? |
| 12 |
|
|
| 12 |
|
|
| 13 | 13 |
api.subject @issue.subject |
| 14 | 14 |
api.description @issue.description |
| 15 | 15 |
api.start_date @issue.start_date |
| ... | ... | |
| 17 | 17 |
api.done_ratio @issue.done_ratio |
| 18 | 18 |
api.estimated_hours @issue.estimated_hours |
| 19 | 19 |
api.spent_hours(@issue.spent_hours) if User.current.allowed_to?(:view_time_entries, @project) |
| 20 |
|
|
| 20 |
|
|
| 21 | 21 |
render_api_custom_values @issue.custom_field_values, api |
| 22 |
|
|
| 22 |
|
|
| 23 | 23 |
api.created_on @issue.created_on |
| 24 | 24 |
api.updated_on @issue.updated_on |
| 25 |
|
|
| 25 |
|
|
| 26 | 26 |
render_api_issue_children(@issue, api) if include_in_api_response?('children')
|
| 27 |
|
|
| 27 |
|
|
| 28 |
api.array :attachments do |
|
| 29 |
@issue.attachments.each do |attachment| |
|
| 30 |
render_api_attachment(attachment, api) |
|
| 31 |
end |
|
| 32 |
end if include_in_api_response?('attachments')
|
|
| 33 |
|
|
| 28 | 34 |
api.array :relations do |
| 29 | 35 |
@relations.each do |relation| |
| 30 |
api.relation(:id => relation.id, :issue_id => relation.other_issue(@issue).id, :relation_type => relation.relation_type_for(@issue), :delay => relation.delay)
|
|
| 36 |
api.relation(:id => relation.id, :issue_id => relation.issue_from_id, :issue_to_id => relation.issue_to_id, :relation_type => relation.relation_type, :delay => relation.delay)
|
|
| 31 | 37 |
end |
| 32 | 38 |
end if include_in_api_response?('relations') && @relations.present?
|
| 33 |
|
|
| 39 |
|
|
| 34 | 40 |
api.array :changesets do |
| 35 | 41 |
@issue.changesets.each do |changeset| |
| 36 | 42 |
api.changeset :revision => changeset.revision do |
| ... | ... | |
| 40 | 46 |
end |
| 41 | 47 |
end |
| 42 | 48 |
end if include_in_api_response?('changesets') && User.current.allowed_to?(:view_changesets, @project)
|
| 43 |
|
|
| 49 |
|
|
| 44 | 50 |
api.array :journals do |
| 45 | 51 |
@issue.journals.each do |journal| |
| 46 | 52 |
api.journal :id => journal.id do |
| app/views/issues/show.html.erb | ||
|---|---|---|
| 1 |
<%= render :partial => 'action_menu' %> |
|
| 2 |
|
|
| 3 |
<h2><%= issue_heading(@issue) %></h2> |
|
| 4 |
|
|
| 5 |
<div class="<%= @issue.css_classes %> details"> |
|
| 6 |
<%= avatar(@issue.author, :size => "50") %> |
|
| 7 |
|
|
| 8 |
<div class="subject"> |
|
| 9 |
<%= render_issue_subject_with_tree(@issue) %> |
|
| 10 |
</div> |
|
| 11 |
<p class="author"> |
|
| 12 |
<%= authoring @issue.created_on, @issue.author %>. |
|
| 13 |
<% if @issue.created_on != @issue.updated_on %> |
|
| 14 |
<%= l(:label_updated_time, time_tag(@issue.updated_on)) %>. |
|
| 15 |
<% end %> |
|
| 16 |
</p> |
|
| 17 |
|
|
| 18 |
<table class="attributes"> |
|
| 19 |
<tr> |
|
| 20 |
<th class="status"><%=l(:field_status)%>:</th><td class="status"><%= h(@issue.status.name) %></td> |
|
| 21 |
<th class="start-date"><%=l(:field_start_date)%>:</th><td class="start-date"><%= format_date(@issue.start_date) %></td> |
|
| 22 |
</tr> |
|
| 23 |
<tr> |
|
| 24 |
<th class="priority"><%=l(:field_priority)%>:</th><td class="priority"><%= h(@issue.priority.name) %></td> |
|
| 25 |
<th class="due-date"><%=l(:field_due_date)%>:</th><td class="due-date"><%= format_date(@issue.due_date) %></td> |
|
| 26 |
</tr> |
|
| 27 |
<tr> |
|
| 28 |
<th class="assigned-to"><%=l(:field_assigned_to)%>:</th><td class="assigned-to"><%= avatar(@issue.assigned_to, :size => "14") %><%= @issue.assigned_to ? link_to_user(@issue.assigned_to) : "-" %></td> |
|
| 29 |
<th class="progress"><%=l(:field_done_ratio)%>:</th><td class="progress"><%= progress_bar @issue.done_ratio, :width => '80px', :legend => "#{@issue.done_ratio}%" %></td>
|
|
| 30 |
</tr> |
|
| 31 |
<tr> |
|
| 32 |
<th class="category"><%=l(:field_category)%>:</th><td class="category"><%=h(@issue.category ? @issue.category.name : "-") %></td> |
|
| 33 |
<% if User.current.allowed_to?(:view_time_entries, @project) %> |
|
| 34 |
<th class="spent-time"><%=l(:label_spent_time)%>:</th> |
|
| 35 |
<td class="spent-time"><%= @issue.spent_hours > 0 ? (link_to l_hours(@issue.spent_hours), {:controller => 'timelog', :action => 'index', :project_id => @project, :issue_id => @issue}) : "-" %></td>
|
|
| 36 |
<% end %> |
|
| 37 |
</tr> |
|
| 38 |
<tr> |
|
| 39 |
<th class="fixed-version"><%=l(:field_fixed_version)%>:</th><td class="fixed-version"><%= @issue.fixed_version ? link_to_version(@issue.fixed_version) : "-" %></td> |
|
| 40 |
<% if @issue.estimated_hours %> |
|
| 41 |
<th class="estimated-hours"><%=l(:field_estimated_hours)%>:</th><td class="estimated-hours"><%= l_hours(@issue.estimated_hours) %></td> |
|
| 42 |
<% end %> |
|
| 43 |
</tr> |
|
| 44 |
<%= render_custom_fields_rows(@issue) %> |
|
| 45 |
<%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %> |
|
| 46 |
</table> |
|
| 47 |
|
|
| 48 |
<% if @issue.description? || @issue.attachments.any? -%> |
|
| 49 |
<hr /> |
|
| 50 |
<% if @issue.description? %> |
|
| 51 |
<div class="contextual"> |
|
| 52 |
<%= link_to_remote_if_authorized(l(:button_quote), { :url => {:controller => 'journals', :action => 'new', :id => @issue} }, :class => 'icon icon-comment') %>
|
|
| 53 |
</div> |
|
| 54 |
|
|
| 55 |
<p><strong><%=l(:field_description)%></strong></p> |
|
| 56 |
<div class="wiki"> |
|
| 57 |
<%= textilizable @issue, :description, :attachments => @issue.attachments %> |
|
| 58 |
</div> |
|
| 59 |
<% end %> |
|
| 60 |
<%= link_to_attachments @issue %> |
|
| 61 |
<% end -%> |
|
| 62 |
|
|
| 63 |
<%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %> |
|
| 64 |
|
|
| 65 |
<% if !@issue.leaf? || User.current.allowed_to?(:manage_subtasks, @project) %> |
|
| 66 |
<hr /> |
|
| 67 |
<div id="issue_tree"> |
|
| 68 |
<div class="contextual"> |
|
| 69 |
<%= link_to(l(:button_add), {:controller => 'issues', :action => 'new', :project_id => @project, :issue => {:parent_issue_id => @issue}}) if User.current.allowed_to?(:manage_subtasks, @project) %>
|
|
| 70 |
</div> |
|
| 71 |
<p><strong><%=l(:label_subtask_plural)%></strong></p> |
|
| 72 |
<%= render_descendants_tree(@issue) unless @issue.leaf? %> |
|
| 73 |
</div> |
|
| 74 |
<% end %> |
|
| 75 |
|
|
| 76 |
<% if @relations.present? || User.current.allowed_to?(:manage_issue_relations, @project) %> |
|
| 77 |
<hr /> |
|
| 78 |
<div id="relations"> |
|
| 79 |
<%= render :partial => 'relations' %> |
|
| 80 |
</div> |
|
| 81 |
<% end %> |
|
| 82 |
|
|
| 83 |
</div> |
|
| 84 |
|
|
| 85 |
<% if @changesets.present? %> |
|
| 86 |
<div id="issue-changesets"> |
|
| 87 |
<h3><%=l(:label_associated_revisions)%></h3> |
|
| 88 |
<%= render :partial => 'changesets', :locals => { :changesets => @changesets} %>
|
|
| 89 |
</div> |
|
| 90 |
<% end %> |
|
| 91 |
|
|
| 92 |
<% if @journals.present? %> |
|
| 93 |
<div id="history"> |
|
| 94 |
<h3><%=l(:label_history)%></h3> |
|
| 95 |
<%= render :partial => 'history', :locals => { :issue => @issue, :journals => @journals } %>
|
|
| 96 |
</div> |
|
| 97 |
<% end %> |
|
| 98 |
|
|
| 99 |
|
|
| 100 |
<div style="clear: both;"></div> |
|
| 101 |
<%= render :partial => 'action_menu' %> |
|
| 102 |
|
|
| 103 |
<div style="clear: both;"></div> |
|
| 104 |
<% if authorize_for('issues', 'edit') %>
|
|
| 105 |
<div id="update" style="display:none;"> |
|
| 106 |
<h3><%= l(:button_update) %></h3> |
|
| 107 |
<%= render :partial => 'edit' %> |
|
| 108 |
</div> |
|
| 109 |
<% end %> |
|
| 110 |
|
|
| 111 |
<% other_formats_links do |f| %> |
|
| 112 |
<%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %>
|
|
| 113 |
<%= f.link_to 'PDF' %> |
|
| 114 |
<% end %> |
|
| 115 |
|
|
| 116 |
<% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
|
|
| 117 |
|
|
| 118 |
<% content_for :sidebar do %> |
|
| 119 |
<%= render :partial => 'issues/sidebar' %> |
|
| 120 |
|
|
| 121 |
<% if User.current.allowed_to?(:add_issue_watchers, @project) || |
|
| 122 |
(@issue.watchers.present? && User.current.allowed_to?(:view_issue_watchers, @project)) %> |
|
| 123 |
<div id="watchers"> |
|
| 124 |
<%= render :partial => 'watchers/watchers', :locals => {:watched => @issue} %>
|
|
| 125 |
</div> |
|
| 126 |
<% end %> |
|
| 127 |
<% end %> |
|
| 128 |
|
|
| 129 |
<% content_for :header_tags do %> |
|
| 130 |
<%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %>
|
|
| 131 |
<%= stylesheet_link_tag 'scm' %> |
|
| 132 |
<%= javascript_include_tag 'context_menu' %> |
|
| 133 |
<%= stylesheet_link_tag 'context_menu' %> |
|
| 134 |
<%= stylesheet_link_tag 'context_menu_rtl' if l(:direction) == 'rtl' %> |
|
| 135 |
<% end %> |
|
| 136 |
<div id="context-menu" style="display: none;"></div> |
|
| 137 |
<%= javascript_tag "new ContextMenu('#{issues_context_menu_path}')" %>
|
|
| app/views/issues/show.rhtml | ||
|---|---|---|
| 1 |
<%= render :partial => 'action_menu' %> |
|
| 2 |
|
|
| 3 |
<h2><%= issue_heading(@issue) %></h2> |
|
| 4 |
|
|
| 5 |
<div class="<%= @issue.css_classes %> details"> |
|
| 6 |
<%= avatar(@issue.author, :size => "50") %> |
|
| 7 |
|
|
| 8 |
<div class="subject"> |
|
| 9 |
<%= render_issue_subject_with_tree(@issue) %> |
|
| 10 |
</div> |
|
| 11 |
<p class="author"> |
|
| 12 |
<%= authoring @issue.created_on, @issue.author %>. |
|
| 13 |
<% if @issue.created_on != @issue.updated_on %> |
|
| 14 |
<%= l(:label_updated_time, time_tag(@issue.updated_on)) %>. |
|
| 15 |
<% end %> |
|
| 16 |
</p> |
|
| 17 |
|
|
| 18 |
<table class="attributes"> |
|
| 19 |
<tr> |
|
| 20 |
<th class="status"><%=l(:field_status)%>:</th><td class="status"><%= @issue.status.name %></td> |
|
| 21 |
<th class="start-date"><%=l(:field_start_date)%>:</th><td class="start-date"><%= format_date(@issue.start_date) %></td> |
|
| 22 |
</tr> |
|
| 23 |
<tr> |
|
| 24 |
<th class="priority"><%=l(:field_priority)%>:</th><td class="priority"><%= @issue.priority.name %></td> |
|
| 25 |
<th class="due-date"><%=l(:field_due_date)%>:</th><td class="due-date"><%= format_date(@issue.due_date) %></td> |
|
| 26 |
</tr> |
|
Also available in: Unified diff