Approval workflow log view face changed

This commit is contained in:
Karel Picman 2013-06-06 10:27:08 +02:00
parent 2b03827aac
commit c9a4c35f10
10 changed files with 142 additions and 91 deletions

View File

@ -22,7 +22,7 @@ class DmsfWorkflowsController < ApplicationController
before_filter :find_workflow, :except => [:create, :new, :index, :assign, :assignment]
before_filter :find_project, :except => [:start]
before_filter :authorize_global #, :except => [:action, :new_action]
before_filter :authorize_global
def index
if @project
@ -36,7 +36,7 @@ class DmsfWorkflowsController < ApplicationController
end
def new_action
if params[:commit] == l(:submit_commit)
if params[:commit] == l(:button_submit)
action = DmsfWorkflowStepAction.new(
:dmsf_workflow_step_assignment_id => params[:dmsf_workflow_step_assignment_id],
:action => params[:step_action],
@ -57,13 +57,17 @@ class DmsfWorkflowsController < ApplicationController
end
def assignment
if params[:commit] == l(:button_assign)
if params[:commit] == l(:button_submit)
revision = DmsfFileRevision.find_by_id params[:dmsf_file_revision_id]
if revision
revision.set_workflow(params[:dmsf_workflow_id], params[:action])
revision.assign_workflow(params[:dmsf_workflow_id])
if request.post? && revision.save
flash[:notice] = l(:notice_successful_update)
if request.post?
if revision.save
flash[:notice] = l(:notice_successful_update)
else
flash[:error] = l(:error_workflow_assign)
end
end
end
end
@ -137,7 +141,7 @@ class DmsfWorkflowsController < ApplicationController
else
step = params[:step].to_i
end
operator = 1 ? params[:commit] == l(:dmsf_and) : 0
operator = (params[:commit] == l(:dmsf_and)) ? DmsfWorkflowStep::OPERATOR_AND : DmsfWorkflowStep::OPERATOR_OR
users.each do |user|
@workflow.dmsf_workflow_steps << DmsfWorkflowStep.new(
:dmsf_workflow_id => @workflow.id,

View File

@ -17,9 +17,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class DmsfWorkflow < ActiveRecord::Base
belongs_to :project
has_many :dmsf_workflow_steps, :dependent => :destroy
has_many :dmsf_workflow_steps, :dependent => :destroy, :order => 'step ASC, operator DESC'
validates_uniqueness_of :name
validates :name, :presence => true
@ -36,8 +34,7 @@ class DmsfWorkflow < ActiveRecord::Base
end
def project
@project = Project.find_by_id(project_id) unless @project
@project
Project.find_by_id(project_id) if project_id
end
def to_s
@ -51,7 +48,7 @@ class DmsfWorkflow < ActiveRecord::Base
wa << s
end
end
wa.sort_by { |obj| -obj.operator }
wa
end
def steps
@ -61,7 +58,7 @@ class DmsfWorkflow < ActiveRecord::Base
ws << s.step
end
end
ws.sort
ws
end
def reorder_steps(step, move_to)
@ -129,16 +126,31 @@ class DmsfWorkflow < ActiveRecord::Base
end
end
def get_free_assignment(user, dmsf_file_revision_id)
steps = DmsfWorkflowStep.where(:dmsf_workflow_id => self.id).all(:order => 'step ASC')
steps.each do |step|
def next_assignments(dmsf_file_revision_id)
self.dmsf_workflow_steps.each do |step|
unless step.finished?(dmsf_file_revision_id)
return step.get_free_assignment(dmsf_file_revision_id, user)
return step.next_assignments(dmsf_file_revision_id)
end
end
return nil
end
def self.assignments_to_users_str(assignments)
str = ''
if assignments
assignments.each_with_index do |assignment, index|
user = User.find_by_id assignment.user_id
if user
if index > 0
str << ', '
end
str << user.name
end
end
end
str
end
def assign(dmsf_file_revision_id)
dmsf_workflow_steps.each do |ws|
ws.assign(dmsf_file_revision_id)
@ -149,8 +161,7 @@ class DmsfWorkflow < ActiveRecord::Base
res = nil
case action.action
when DmsfWorkflowStepAction::ACTION_APPROVE
steps = DmsfWorkflowStep.where(:dmsf_workflow_id => self.id).all
steps.each do |step|
self.dmsf_workflow_steps.each do |step|
res = step.result dmsf_file_revision_id
unless step.finished? dmsf_file_revision_id
return

View File

@ -27,6 +27,9 @@ class DmsfWorkflowStep < ActiveRecord::Base
validates :operator, :presence => true
validates_uniqueness_of :user_id, :scope => [:dmsf_workflow_id, :step]
OPERATOR_OR = 0
OPERATOR_AND = 1
def soperator
operator == 1 ? l(:dmsf_and) : l(:dmsf_or)
end
@ -44,7 +47,7 @@ class DmsfWorkflowStep < ActiveRecord::Base
end
def finished?(dmsf_file_revision_id)
res = result(dmsf_file_revision_id)
res = self.result(dmsf_file_revision_id)
res == DmsfWorkflow::STATE_APPROVED || res == DmsfWorkflow::STATE_REJECTED
end
@ -72,21 +75,22 @@ class DmsfWorkflowStep < ActiveRecord::Base
end
end
def get_free_assignment(dmsf_file_revision_id, user)
assignment = DmsfWorkflowStepAssignment.where(
def next_assignments(dmsf_file_revision_id)
results = Array.new
assignments = DmsfWorkflowStepAssignment.where(
:dmsf_workflow_step_id => self.id,
:dmsf_file_revision_id => dmsf_file_revision_id,
:user_id => user.id).first
if assignment
actions = DmsfWorkflowStepAction.where(
:dmsf_workflow_step_assignment_id => assignment.id).all
actions.each do |action|
if action && action.is_finished?
return
end
end
return assignment.id
end
:dmsf_file_revision_id => dmsf_file_revision_id)
assignments.each do |assignment|
add = true
assignment.dmsf_workflow_step_actions.each do |action|
if action.is_finished?
add = false
break
end
end
results << assignment if add
end
return results
end
end

View File

@ -20,6 +20,7 @@ class DmsfWorkflowStepAssignment < ActiveRecord::Base
belongs_to :dmsf_workflow_step
has_many :dmsf_workflow_step_actions, :dependent => :destroy
has_one :dmsf_workflow_step_assignment
validates :dmsf_workflow_step_id, :presence => true
validates :dmsf_file_revision_id, :presence => true

View File

@ -150,6 +150,7 @@
</tr>
<% end %>
<% @files.each do |file| %>
<% wf = DmsfWorkflow.find_by_id(file.last_revision.dmsf_workflow_id) %>
<tr class="file">
<td class="check"><%= check_box_tag("files[]", file.id, false, :title => l(:title_check_for_zip_download_or_email)) %></td>
<td class="title">
@ -175,16 +176,14 @@
</td>
<td class="version"><%= file.last_revision.version %></td>
<td class="workflow">
<% wf = DmsfWorkflow.find_by_id(file.last_revision.dmsf_workflow_id) %>
<% if wf %>
<%= link_to(
file.last_revision.workflow_str(false),
log_dmsf_workflow_path(
:project_id => @project.id,
:id => wf.id,
#:dmsf_workflow_step_assignment_id => dmsf_workflow_step_assignment_id,
:dmsf_file_revision_id => file.last_revision.id),
#:title => l(:title_waiting_for_approval),
:title => DmsfWorkflow.assignments_to_users_str(wf.next_assignments(file.last_revision.id)),
:remote => true) %>
<% end %>
</td>
@ -203,16 +202,16 @@
<% end %>
<% case file.last_revision.workflow %>
<% when DmsfWorkflow::STATE_WAITING_FOR_APPROVAL %>
<% wf = DmsfWorkflow.find_by_id(file.last_revision.dmsf_workflow_id) %>
<% if wf %>
<% dmsf_workflow_step_assignment_id = wf.get_free_assignment(User.current, file.last_revision.id) %>
<% if dmsf_workflow_step_assignment_id %>
<% assignments = wf.next_assignments(file.last_revision.id) %>
<% index = assignments.find_index{|assignment| assignment.user_id == User.current.id} if assignments %>
<% if index %>
<%= link_to(
image_tag('waiting_for_approval.png', :plugin => :redmine_dmsf),
action_dmsf_workflow_path(
:project_id => @project.id,
:id => wf.id,
:dmsf_workflow_step_assignment_id => dmsf_workflow_step_assignment_id,
:dmsf_workflow_step_assignment_id => assignments[index].id,
:dmsf_file_revision_id => file.last_revision.id),
:title => l(:title_waiting_for_approval),
:remote => true) %>
@ -223,11 +222,15 @@
<% when DmsfWorkflow::STATE_APPROVED %>
<%= image_tag('approved.png', :title => l(:title_approved), :plugin => :redmine_dmsf) %>
<% when DmsfWorkflow::STATE_DRAFT %>
<%= link_to_function(image_tag('draft.png', :plugin => :redmine_dmsf),
<% if User.current && (file.last_revision.dmsf_workflow_assigned_by == User.current.id) %>
<%= link_to_function(image_tag('draft.png', :plugin => :redmine_dmsf),
"manipulation_link('#{start_dmsf_workflow_path(
:id => file.last_revision.dmsf_workflow_id,
:dmsf_file_revision_id => file.last_revision.id)}')",
:title => l(:label_dmsf_wokflow_action_start)) %>
<% else %>
<%= image_tag('draft.png', :title => l(:label_dmsf_wokflow_action_start), :plugin => :redmine_dmsf) %>
<% end %>
<% when DmsfWorkflow::STATE_REJECTED %>
<%= image_tag('rejected.png', :title => l(:title_rejected), :plugin => :redmine_dmsf) %>
<% else %>
@ -235,7 +238,6 @@
image_tag('none.png', :plugin => :redmine_dmsf),
assign_dmsf_workflow_path(
:project_id => @project.id,
:dmsf_workflow_step_assignment_id => dmsf_workflow_step_assignment_id,
:dmsf_file_revision_id => file.last_revision.id),
:title => l(:label_dmsf_wokflow_action_assign),
:remote => true) %>

View File

@ -21,7 +21,7 @@
</p>
<p class="buttons">
<%= submit_tag l(:submit_commit), :name => 'commit', :onclick => 'hideModal(this);' %>
<%= submit_tag l(:button_submit), :name => 'commit', :onclick => 'hideModal(this);' %>
<%= submit_tag l(:button_cancel), :name => 'commit', :onclick => 'hideModal(this);' %>
</p>
<% end %>

View File

@ -1,21 +1,16 @@
<h3 class="title"><%= l(:label_dmsf_workflow) %></h3>
<%= form_tag({:controller => 'dmsf_workflows', :action => 'assignment'},
:method => :post,
:id => 'assignment-form') do %>
<%= hidden_field_tag :dmsf_workflow_step_assignment_id, params[:dmsf_workflow_step_assignment_id] %>
<%= hidden_field_tag :dmsf_file_revision_id, params[:dmsf_file_revision_id] %>
<p>
<%= label_tag('workflow', l(:label_workflow) + ':') %>
<%= select_tag(
'dmsf_workflow_id',
dmsf_workflows_for_select(@project, nil))%>
</p>
<p class="buttons">
<%= submit_tag l(:button_assign), :name => 'commit', :onclick => 'hideModal(this);' %>
<%= submit_tag l(:button_submit), :name => 'commit', :onclick => 'hideModal(this);' %>
<%= submit_tag l(:button_cancel), :name => 'commit', :onclick => 'hideModal(this);' %>
</p>
<% end %>

View File

@ -1,12 +1,20 @@
<h3 class="title"><%= l(:title_dmsf_workflow_log) %></h3>
<p>
<% if params[:dmsf_file_revision_id].present? %>
<% revision = DmsfFileRevision.find_by_id(params[:dmsf_file_revision_id]) %>
<% if revision %>
<%= link_to @workflow.name, edit_dmsf_workflow_path(@workflow) %><%= " - #{revision.workflow_str false}" %>
<div class="log_header_box">
<div class="log_header_left">
<%= label_tag 'workflow_name', "#{l(:field_name)}: " %>
<%= link_to @workflow.name, edit_dmsf_workflow_path(@workflow) %>
</div>
<div>
<%= label_tag 'workflow_status', "#{l(:field_status)}: " %>
<%= revision.workflow_str false %>
</div>
</div>
<div class="tab-content" id="tab-content-members">
<table class="steps">
<table class="list">
<thead><tr>
<th><%= l(:label_dmsf_workflow_step) %></th>
<th><%= l(:label_user) %> </th>
@ -15,15 +23,15 @@
<th><%=l(:label_date)%></th>
</tr></thead>
<tbody>
<tr id="step-0" class="<%= cycle 'odd', 'even' %> step">
<td class="step">-</td>
<tr id="step-0" class="odd">
<td class="step"></td>
<td class="user"><%= link_to_user User.find_by_id(revision.dmsf_workflow_assigned_by) if revision.dmsf_workflow_assigned_by %></td>
<td class="action"><%= DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_ASSIGN) %></td>
<td class="note"></td>
<td class="date" align="center"><%= format_time(revision.dmsf_workflow_assigned_at) if revision.dmsf_workflow_assigned_at %></td>
</tr>
<tr id="step-1" class="<%= cycle 'odd', 'even' %> step">
<td class="step">-</td>
<tr id="step-1" class="even">
<td class="step"></td>
<td class="user"><%= link_to_user User.find_by_id(revision.dmsf_workflow_started_by) if revision.dmsf_workflow_started_by %></td>
<td class="action"><%= DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_START) %></td>
<td class="note"></td>
@ -32,7 +40,7 @@
<% sql = "SELECT c.action, c.note, c.created_at, c.author_id, a.user_id, s.step FROM dmsf_workflow_step_actions c RIGHT JOIN dmsf_workflow_step_assignments a ON a.id = c.dmsf_workflow_step_assignment_id JOIN dmsf_workflow_steps s ON s.id = a.dmsf_workflow_step_id WHERE a.dmsf_file_revision_id = #{revision.id} ORDER BY s.step, c.created_at" %>
<% result = DmsfWorkflowStep.connection.execute sql %>
<% result.each_with_index do |row, i| %>
<tr id="step-<%= i + 2 %> " class="<%= cycle 'odd', 'even' %> step">
<tr id="step-<%= i + 2 %> " class="<%= cycle 'odd', 'even' %>">
<td class="step"><%= row[5] %></td>
<td class="user"><%= link_to_user User.find_by_id(row[3].present? ? row[3] : row[4]) %></td>
<td class="action"><%= DmsfWorkflowStepAction.action_str(row[0]) %></td>

View File

@ -256,6 +256,30 @@ div.revision_box .ui-widget-header {
font-weight: normal;
}
table.steps td.note {
width: 30%;
table.list td.note {
width: 30%;
}
table.list td.step, td.date {
text-align: center;
}
.log_header_box{
padding:6px;
margin-bottom: 10px;
}
.log_header_left {
width: 50%;
float: left;
}
.log_header_box label{
font-weight: bold;
margin-left: 0px;
margin-right: 3px;
padding: 3px 0 3px 0;
}
.modal a, a:link, a:visited{ color: #169; text-decoration: none; }
.modal a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
.modal{ font-size: 12px}

View File

@ -207,33 +207,35 @@ en:
:label_webdav_strategy: "Webdav strategy"
:note_webdav_strategy: "Enables the administrator to decide if webdav is a read-only or read-write platform for end users."
label_dmsf_workflow_new: New approval workflow
label_dmsf_workflow: Approval workflow
label_dmsf_workflow_plural: Approval workflows
error_unable_delete_dmsf_workflow: Unable to delete the workflow
error_unable_delete_dmsf_workflow: 'Unable to delete the workflow'
error_empty_note: "The note can't be empty"
error_workflow_assign: 'An error occured while assigning'
label_dmsf_workflow_new: 'New approval workflow'
label_dmsf_workflow: 'Approval workflow'
label_dmsf_workflow_plural: 'Approval workflows'
label_dmsf_workflow_step: Step
label_dmsf_workflow_step_plural: Steps
label_dmsf_workflow_approval: Approval
label_dmsf_workflow_approval_plural: Approvals
dmsf_and: AND
dmsf_or: OR
dmsf_new_step: New step
label_dmsf: DMSF
label_dmsf_wokflow_action_approve: Approve
label_dmsf_wokflow_action_reject: Reject
label_dmsf_wokflow_action_delegate: 'Delegate to'
label_dmsf_wokflow_action_assign: 'Assign an approval workflow'
message_dmsf_wokflow_note: Your note...
label_dmsf_wokflow_action_start: 'Start workflow'
label_action: Action
label_note: Note
title_draft: Draft
title_rejected: Rejected
title_delegated: Delegated
title_assigned: Assigned
title_started: Started
label_dmsf_wokflow_action_start: Start workflow
title_dmsf_workflow_log: 'Approval workflow log'
dmsf_and: AND
dmsf_or: OR
dmsf_new_step: New step
message_dmsf_wokflow_note: Your note...
info_revision: "r%{rev}"
link_workflow: Workflow
button_assign: Assign
error_empty_note: "The note can't be empty"
title_dmsf_workflow_log: 'Approval workflow log'
label_action: Action
label_note: Note