Approval workflow log view face changed
This commit is contained in:
parent
2b03827aac
commit
c9a4c35f10
@ -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
|
||||
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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
: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
|
||||
return assignment.id
|
||||
results << assignment if add
|
||||
end
|
||||
return results
|
||||
end
|
||||
|
||||
end
|
||||
@ -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
|
||||
|
||||
@ -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 %>
|
||||
<% 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) %>
|
||||
|
||||
@ -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 %>
|
||||
|
||||
@ -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 %>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -256,6 +256,30 @@ div.revision_box .ui-widget-header {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
table.steps td.note {
|
||||
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}
|
||||
@ -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
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user