Workflow enhancement: editable and required fields configurable by role, tracker and status (#703, #3521).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@9977 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
1 parent
54d55a360a
commit
d7b669e50b
35 files changed
+1405
-431
No files matched your search
@@ -4,6 +4,9 @@
|
||||
<div class="splitcontentleft">
|
||||
<% if @issue.safe_attribute? 'status_id' %>
|
||||
<p><%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), :required => true %></p>
|
||||
<%= observe_field :issue_status_id, :url => project_issue_form_path(@project, :id => @issue),
|
||||
:with => "Form.serialize('issue-form')" %>
|
||||
|
||||
<% else %>
|
||||
<p><label><%= l(:field_status) %></label> <%= h(@issue.status.name) %></p>
|
||||
<% end %>
|
||||
@@ -13,11 +16,11 @@
|
||||
<% end %>
|
||||
|
||||
<% if @issue.safe_attribute? 'assigned_to_id' %>
|
||||
<p><%= f.select :assigned_to_id, principals_options_for_select(@issue.assignable_users, @issue.assigned_to), :include_blank => true %></p>
|
||||
<p><%= f.select :assigned_to_id, principals_options_for_select(@issue.assignable_users, @issue.assigned_to), :include_blank => true, :required => @issue.required_attribute?('assigned_to_id') %></p>
|
||||
<% end %>
|
||||
|
||||
<% if @issue.safe_attribute?('category_id') && @issue.project.issue_categories.any? %>
|
||||
<p><%= f.select :category_id, (@issue.project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true %>
|
||||
<p><%= f.select :category_id, (@issue.project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true, :required => @issue.required_attribute?('category_id') %>
|
||||
<%= link_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
|
||||
{:url => new_project_issue_category_path(@issue.project), :method => 'get'},
|
||||
:title => l(:label_issue_category_new),
|
||||
@@ -25,7 +28,7 @@
|
||||
<% end %>
|
||||
|
||||
<% if @issue.safe_attribute?('fixed_version_id') && @issue.assignable_versions.any? %>
|
||||
<p><%= f.select :fixed_version_id, version_options_for_select(@issue.assignable_versions, @issue.fixed_version), :include_blank => true %>
|
||||
<p><%= f.select :fixed_version_id, version_options_for_select(@issue.assignable_versions, @issue.fixed_version), :include_blank => true, :required => @issue.required_attribute?('fixed_version_id') %>
|
||||
<%= link_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
|
||||
{:url => new_project_version_path(@issue.project), :method => 'get'},
|
||||
:title => l(:label_version_new),
|
||||
@@ -36,25 +39,25 @@
|
||||
|
||||
<div class="splitcontentright">
|
||||
<% if @issue.safe_attribute? 'parent_issue_id' %>
|
||||
<p id="parent_issue"><%= f.text_field :parent_issue_id, :size => 10 %></p>
|
||||
<p id="parent_issue"><%= f.text_field :parent_issue_id, :size => 10, :required => @issue.required_attribute?('parent_issue_id') %></p>
|
||||
<div id="parent_issue_candidates" class="autocomplete"></div>
|
||||
<%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @issue.project) }')" %>
|
||||
<% end %>
|
||||
|
||||
<% if @issue.safe_attribute? 'start_date' %>
|
||||
<p><%= f.text_field :start_date, :size => 10, :disabled => !@issue.leaf? %><%= calendar_for('issue_start_date') if @issue.leaf? %></p>
|
||||
<p><%= f.text_field :start_date, :size => 10, :disabled => !@issue.leaf?, :required => @issue.required_attribute?('start_date') %><%= calendar_for('issue_start_date') if @issue.leaf? %></p>
|
||||
<% end %>
|
||||
|
||||
<% if @issue.safe_attribute? 'due_date' %>
|
||||
<p><%= f.text_field :due_date, :size => 10, :disabled => !@issue.leaf? %><%= calendar_for('issue_due_date') if @issue.leaf? %></p>
|
||||
<p><%= f.text_field :due_date, :size => 10, :disabled => !@issue.leaf?, :required => @issue.required_attribute?('due_date') %><%= calendar_for('issue_due_date') if @issue.leaf? %></p>
|
||||
<% end %>
|
||||
|
||||
<% if @issue.safe_attribute? 'estimated_hours' %>
|
||||
<p><%= f.text_field :estimated_hours, :size => 3, :disabled => !@issue.leaf? %> <%= l(:field_hours) %></p>
|
||||
<p><%= f.text_field :estimated_hours, :size => 3, :disabled => !@issue.leaf?, :required => @issue.required_attribute?('estimated_hours') %> <%= l(:field_hours) %></p>
|
||||
<% end %>
|
||||
|
||||
<% if @issue.safe_attribute?('done_ratio') && @issue.leaf? && Issue.use_field_for_done_ratio? %>
|
||||
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
|
||||
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }), :required => @issue.required_attribute?('done_ratio') %></p>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
<% if @issue.safe_attribute? 'project_id' %>
|
||||
<p><%= f.select :project_id, project_tree_options_for_select(@issue.allowed_target_projects, :selected => @issue.project), :required => true %></p>
|
||||
<%= observe_field :issue_project_id, :url => project_issue_form_path(@project, :id => @issue, :project_change => '1'),
|
||||
<%= observe_field :issue_project_id, :url => project_issue_form_path(@project, :id => @issue),
|
||||
:with => "Form.serialize('issue-form')" %>
|
||||
<% end %>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
<% if @issue.safe_attribute? 'description' %>
|
||||
<p>
|
||||
<label><%= l(:field_description) %></label>
|
||||
<%= f.label_for_field :description, :required => @issue.required_attribute?('description') %>
|
||||
<%= link_to_function image_tag('edit.png'),
|
||||
'Element.hide(this); Effect.toggle("issue_description_and_toolbar", "appear", {duration:0.3})' unless @issue.new_record? %>
|
||||
<%= content_tag 'span', :id => "issue_description_and_toolbar", :style => (@issue.new_record? ? nil : 'display:none') do %>
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<div class="splitcontentleft">
|
||||
<% i = 0 %>
|
||||
<% split_on = (@issue.custom_field_values.size / 2.0).ceil - 1 %>
|
||||
<% @issue.custom_field_values.each do |value| %>
|
||||
<p><%= custom_field_tag_with_label :issue, value %></p>
|
||||
<% @issue.editable_custom_field_values.each do |value| %>
|
||||
<p><%= custom_field_tag_with_label :issue, value, :required => @issue.required_attribute?(value.custom_field_id) %></p>
|
||||
<% if i == split_on -%>
|
||||
</div><div class="splitcontentright">
|
||||
<% end -%>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<% for tracker in @trackers %>
|
||||
<tr class="<%= cycle("odd", "even") %>">
|
||||
<td><%= link_to h(tracker.name), edit_tracker_path(tracker) %></td>
|
||||
<td align="center"><% unless tracker.workflows.count > 0 %><span class="icon icon-warning"><%= l(:text_tracker_no_workflow) %> (<%= link_to l(:button_edit), {:controller => 'workflows', :action => 'edit', :tracker_id => tracker} %>)</span><% end %></td>
|
||||
<td align="center"><% unless tracker.workflow_rules.count > 0 %><span class="icon icon-warning"><%= l(:text_tracker_no_workflow) %> (<%= link_to l(:button_edit), {:controller => 'workflows', :action => 'edit', :tracker_id => tracker} %>)</span><% end %></td>
|
||||
<td align="center" style="width:15%;"><%= reorder_links('tracker', {:action => 'update', :id => tracker}, :put) %></td>
|
||||
<td class="buttons">
|
||||
<%= delete_link tracker_path(tracker) %>
|
||||
|
||||
@@ -2,6 +2,13 @@
|
||||
|
||||
<h2><%=l(:label_workflow)%></h2>
|
||||
|
||||
<div class="tabs">
|
||||
<ul>
|
||||
<li><%= link_to 'Status transitions', {:action => 'edit', :role_id => @role, :tracker_id => @tracker}, :class => 'selected' %></li>
|
||||
<li><%= link_to 'Fields permissions', {:action => 'permissions', :role_id => @role, :tracker_id => @tracker} %></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<p><%=l(:text_workflow_edit)%>:</p>
|
||||
|
||||
<%= form_tag({}, :method => 'get') do %>
|
||||
@@ -12,11 +19,11 @@
|
||||
<label><%=l(:label_tracker)%>:
|
||||
<%= select_tag 'tracker_id', options_from_collection_for_select(@trackers, "id", "name", @tracker && @tracker.id) %></label>
|
||||
|
||||
<%= submit_tag l(:button_edit), :name => nil %>
|
||||
|
||||
<%= hidden_field_tag 'used_statuses_only', '0' %>
|
||||
<label><%= check_box_tag 'used_statuses_only', '1', @used_statuses_only %> <%= l(:label_display_used_statuses_only) %></label>
|
||||
</p>
|
||||
<p>
|
||||
<%= submit_tag l(:button_edit), :name => nil %>
|
||||
|
||||
</p>
|
||||
<% end %>
|
||||
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
<%= render :partial => 'action_menu' %>
|
||||
|
||||
<h2><%=l(:label_workflow)%></h2>
|
||||
|
||||
<div class="tabs">
|
||||
<ul>
|
||||
<li><%= link_to 'Status transitions', {:action => 'edit', :role_id => @role, :tracker_id => @tracker} %></li>
|
||||
<li><%= link_to 'Fields permissions', {:action => 'permissions', :role_id => @role, :tracker_id => @tracker}, :class => 'selected' %></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<p><%=l(:text_workflow_edit)%>:</p>
|
||||
|
||||
<%= form_tag({}, :method => 'get') do %>
|
||||
<p>
|
||||
<label><%=l(:label_role)%>:
|
||||
<%= select_tag 'role_id', options_from_collection_for_select(@roles, "id", "name", @role && @role.id) %></label>
|
||||
|
||||
<label><%=l(:label_tracker)%>:
|
||||
<%= select_tag 'tracker_id', options_from_collection_for_select(@trackers, "id", "name", @tracker && @tracker.id) %></label>
|
||||
|
||||
<%= submit_tag l(:button_edit), :name => nil %>
|
||||
</p>
|
||||
<% end %>
|
||||
|
||||
<% if @tracker && @role && @statuses.any? %>
|
||||
<%= form_tag({}, :id => 'workflow_form' ) do %>
|
||||
<%= hidden_field_tag 'tracker_id', @tracker.id %>
|
||||
<%= hidden_field_tag 'role_id', @role.id %>
|
||||
<div class="autoscroll">
|
||||
<table class="list fields_permissions">
|
||||
<thead>
|
||||
<tr>
|
||||
<th align="left">
|
||||
</th>
|
||||
<th align="center" colspan="<%= @statuses.length %>"><%=l(:label_issue_status)%></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<% for status in @statuses %>
|
||||
<td width="<%= 75 / @statuses.size %>%" align="center">
|
||||
<%=h status.name %>
|
||||
</td>
|
||||
<% end %>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="group open">
|
||||
<td colspan="<%= @statuses.size + 1 %>">
|
||||
<span class="expander" onclick="toggleRowGroup(this);"> </span>
|
||||
<%= l(:field_core_fields) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% @fields.each do |field, name| %>
|
||||
<tr class="<%= cycle("odd", "even") %>">
|
||||
<td>
|
||||
<%=h name %>
|
||||
</td>
|
||||
<% for status in @statuses -%>
|
||||
<td align="center" class="<%= @permissions[status.id][field] %>">
|
||||
<%= field_permission_tag(@permissions, status, field) %>
|
||||
</td>
|
||||
<% end -%>
|
||||
</tr>
|
||||
<% end %>
|
||||
<% if @custom_fields.any? %>
|
||||
<tr class="group open">
|
||||
<td colspan="<%= @statuses.size + 1 %>">
|
||||
<span class="expander" onclick="toggleRowGroup(this);"> </span>
|
||||
<%= l(:label_custom_field_plural) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% @custom_fields.each do |field| %>
|
||||
<tr class="<%= cycle("odd", "even") %>">
|
||||
<td>
|
||||
<%=h field.name %>
|
||||
</td>
|
||||
<% for status in @statuses -%>
|
||||
<td align="center" class="<%= @permissions[status.id][field.id.to_s] %>">
|
||||
<%= field_permission_tag(@permissions, status, field) %>
|
||||
</td>
|
||||
<% end -%>
|
||||
</tr>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<%= submit_tag l(:button_save) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
Reference in new issue
Block a user