From c9a4c35f1094d1c5d9d5fec89c0027d58093c3b1 Mon Sep 17 00:00:00 2001 From: Karel Picman Date: Thu, 6 Jun 2013 10:27:08 +0200 Subject: [PATCH] Approval workflow log view face changed --- app/controllers/dmsf_workflows_controller.rb | 16 ++++--- app/models/dmsf_workflow.rb | 47 ++++++++++++-------- app/models/dmsf_workflow_step.rb | 34 +++++++------- app/models/dmsf_workflow_step_assignment.rb | 1 + app/views/dmsf/show.html.erb | 34 +++++++------- app/views/dmsf_workflows/_action.html.erb | 2 +- app/views/dmsf_workflows/_assign.html.erb | 13 ++---- app/views/dmsf_workflows/_log.html.erb | 24 ++++++---- assets/stylesheets/dmsf.css | 28 +++++++++++- config/locales/en.yml | 34 +++++++------- 10 files changed, 142 insertions(+), 91 deletions(-) diff --git a/app/controllers/dmsf_workflows_controller.rb b/app/controllers/dmsf_workflows_controller.rb index 9416ea3b..d85d993c 100644 --- a/app/controllers/dmsf_workflows_controller.rb +++ b/app/controllers/dmsf_workflows_controller.rb @@ -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, diff --git a/app/models/dmsf_workflow.rb b/app/models/dmsf_workflow.rb index 7b995ee3..54d573d5 100644 --- a/app/models/dmsf_workflow.rb +++ b/app/models/dmsf_workflow.rb @@ -16,10 +16,8 @@ # along with this program; if not, write to the Free Software # 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 +class DmsfWorkflow < ActiveRecord::Base + has_many :dmsf_workflow_steps, :dependent => :destroy, :order => 'step ASC, operator DESC' validates_uniqueness_of :name validates :name, :presence => true @@ -35,9 +33,8 @@ class DmsfWorkflow < ActiveRecord::Base project ? where(:project_id => project) : where('project_id IS NULL') end - def project - @project = Project.find_by_id(project_id) unless @project - @project + def project + Project.find_by_id(project_id) if project_id end def to_s @@ -50,8 +47,8 @@ class DmsfWorkflow < ActiveRecord::Base if s.step == step wa << s end - end - wa.sort_by { |obj| -obj.operator } + end + wa end def steps @@ -60,8 +57,8 @@ class DmsfWorkflow < ActiveRecord::Base unless ws.include? s.step ws << s.step end - end - ws.sort + end + 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) @@ -148,9 +160,8 @@ class DmsfWorkflow < ActiveRecord::Base def try_finish(dmsf_file_revision_id, action, user_id) res = nil case action.action - when DmsfWorkflowStepAction::ACTION_APPROVE - steps = DmsfWorkflowStep.where(:dmsf_workflow_id => self.id).all - steps.each do |step| + when DmsfWorkflowStepAction::ACTION_APPROVE + self.dmsf_workflow_steps.each do |step| res = step.result dmsf_file_revision_id unless step.finished? dmsf_file_revision_id return diff --git a/app/models/dmsf_workflow_step.rb b/app/models/dmsf_workflow_step.rb index 52458ed6..2593fea4 100644 --- a/app/models/dmsf_workflow_step.rb +++ b/app/models/dmsf_workflow_step.rb @@ -26,6 +26,9 @@ class DmsfWorkflowStep < ActiveRecord::Base validates :user_id, :presence => true 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) @@ -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 \ No newline at end of file diff --git a/app/models/dmsf_workflow_step_assignment.rb b/app/models/dmsf_workflow_step_assignment.rb index 1ffc5250..7dd52f12 100644 --- a/app/models/dmsf_workflow_step_assignment.rb +++ b/app/models/dmsf_workflow_step_assignment.rb @@ -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 diff --git a/app/views/dmsf/show.html.erb b/app/views/dmsf/show.html.erb index d1a1f17b..bc022dca 100644 --- a/app/views/dmsf/show.html.erb +++ b/app/views/dmsf/show.html.erb @@ -149,7 +149,8 @@ <%= subfolder.deep_size %> <% end %> - <% @files.each do |file| %> + <% @files.each do |file| %> + <% wf = DmsfWorkflow.find_by_id(file.last_revision.dmsf_workflow_id) %> <%= check_box_tag("files[]", file.id, false, :title => l(:title_check_for_zip_download_or_email)) %> @@ -174,17 +175,15 @@ <% end %> <%= file.last_revision.version %> - - <% 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, + :id => wf.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 %> @@ -202,17 +201,17 @@ :title => l(:title_notifications_not_active_activate)) %> <% end %> <% case file.last_revision.workflow %> - <% when DmsfWorkflow::STATE_WAITING_FOR_APPROVAL %> - <% wf = DmsfWorkflow.find_by_id(file.last_revision.dmsf_workflow_id) %> + <% when DmsfWorkflow::STATE_WAITING_FOR_APPROVAL %> <% 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) %> @@ -222,20 +221,23 @@ <% end %> <% 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), + <% 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)) %> + :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 %> <%= link_to( 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, + :project_id => @project.id, :dmsf_file_revision_id => file.last_revision.id), :title => l(:label_dmsf_wokflow_action_assign), :remote => true) %> diff --git a/app/views/dmsf_workflows/_action.html.erb b/app/views/dmsf_workflows/_action.html.erb index 251982fd..84f99413 100644 --- a/app/views/dmsf_workflows/_action.html.erb +++ b/app/views/dmsf_workflows/_action.html.erb @@ -21,7 +21,7 @@

- <%= 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);' %>

<% end %> diff --git a/app/views/dmsf_workflows/_assign.html.erb b/app/views/dmsf_workflows/_assign.html.erb index f2be82d6..ec5c5c2c 100644 --- a/app/views/dmsf_workflows/_assign.html.erb +++ b/app/views/dmsf_workflows/_assign.html.erb @@ -1,21 +1,16 @@

<%= l(:label_dmsf_workflow) %>

- <%= 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] %> - + :id => 'assignment-form') do %> + <%= hidden_field_tag :dmsf_file_revision_id, params[:dmsf_file_revision_id] %>

<%= label_tag('workflow', l(:label_workflow) + ':') %> <%= select_tag( 'dmsf_workflow_id', dmsf_workflows_for_select(@project, nil))%> -

- +

- <%= 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);' %>

<% end %> diff --git a/app/views/dmsf_workflows/_log.html.erb b/app/views/dmsf_workflows/_log.html.erb index 5524da96..eb649cdc 100644 --- a/app/views/dmsf_workflows/_log.html.erb +++ b/app/views/dmsf_workflows/_log.html.erb @@ -1,12 +1,20 @@

<%= l(:title_dmsf_workflow_log) %>

-

<% 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}" %> +

+
+ <%= label_tag 'workflow_name', "#{l(:field_name)}: " %> + <%= link_to @workflow.name, edit_dmsf_workflow_path(@workflow) %> +
+
+ <%= label_tag 'workflow_status', "#{l(:field_status)}: " %> + <%= revision.workflow_str false %> +
+
- +
@@ -15,15 +23,15 @@ - - + + - - + + @@ -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| %> - + diff --git a/assets/stylesheets/dmsf.css b/assets/stylesheets/dmsf.css index 5c8623cb..13e64c1c 100644 --- a/assets/stylesheets/dmsf.css +++ b/assets/stylesheets/dmsf.css @@ -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} \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 03eb745c..7f4d56a0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -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 - info_revision: "r%{rev}" - link_workflow: Workflow - button_assign: Assign - error_empty_note: "The note can't be empty" + title_started: Started title_dmsf_workflow_log: 'Approval workflow log' - label_action: Action - label_note: Note \ No newline at end of file + dmsf_and: AND + dmsf_or: OR + dmsf_new_step: New step + message_dmsf_wokflow_note: Your note... + info_revision: "r%{rev}" + link_workflow: Workflow + + \ No newline at end of file
<%= l(:label_dmsf_workflow_step) %> <%= l(:label_user) %> <%=l(:label_date)%>
-
<%= link_to_user User.find_by_id(revision.dmsf_workflow_assigned_by) if revision.dmsf_workflow_assigned_by %> <%= DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_ASSIGN) %> <%= format_time(revision.dmsf_workflow_assigned_at) if revision.dmsf_workflow_assigned_at %>
-
<%= link_to_user User.find_by_id(revision.dmsf_workflow_started_by) if revision.dmsf_workflow_started_by %> <%= DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_START) %>
<%= row[5] %> <%= link_to_user User.find_by_id(row[3].present? ? row[3] : row[4]) %> <%= DmsfWorkflowStepAction.action_str(row[0]) %>