From b2106ad01b621fa00b129503159c9383bb947f25 Mon Sep 17 00:00:00 2001 From: Karel Picman Date: Mon, 3 Jun 2013 07:10:32 +0200 Subject: [PATCH] Approval workflow - log view --- app/models/dmsf_file_revision.rb | 16 +++--- app/models/dmsf_workflow_step_action.rb | 12 ++++- app/views/dmsf/show.html.erb | 32 ++++++++---- app/views/dmsf_workflows/_log.html.erb | 49 +++++++++++++++++++ app/views/dmsf_workflows/log.html.erb | 1 - app/views/dmsf_workflows/log.js.erb | 3 ++ app/views/dmsf_workflows/new_action.js.erb | 2 - assets/stylesheets/dmsf.css | 20 ++++---- config/locales/en.yml | 7 ++- config/routes.rb | 1 + .../20120822100401_create_dmsf_workflows.rb | 8 +++ ...00404_create_dmsf_workflow_step_actions.rb | 1 + init.rb | 2 +- 13 files changed, 120 insertions(+), 34 deletions(-) create mode 100644 app/views/dmsf_workflows/_log.html.erb delete mode 100644 app/views/dmsf_workflows/log.html.erb create mode 100644 app/views/dmsf_workflows/log.js.erb delete mode 100644 app/views/dmsf_workflows/new_action.js.erb diff --git a/app/models/dmsf_file_revision.rb b/app/models/dmsf_file_revision.rb index 0ce4c46f..c9afb538 100644 --- a/app/models/dmsf_file_revision.rb +++ b/app/models/dmsf_file_revision.rb @@ -182,20 +182,22 @@ class DmsfFileRevision < ActiveRecord::Base unless dmsf_workflow_id.blank? self.dmsf_workflow_id = dmsf_workflow_id if commit == 'start' - self.workflow = DmsfWorkflow::STATE_WAITING_FOR_APPROVAL # Waiting for approval + self.workflow = DmsfWorkflow::STATE_WAITING_FOR_APPROVAL + self.dmsf_workflow_started_by = User.current.id if User.current + self.dmsf_workflow_started_at = DateTime.now else - self.workflow = DmsfWorkflow::STATE_DRAFT # Draft + self.workflow = DmsfWorkflow::STATE_DRAFT + self.dmsf_workflow_assigned_by = User.current.id if User.current + self.dmsf_workflow_assigned_at = DateTime.now end end end end def assign_workflow(dmsf_workflow_id) - if User.current.allowed_to?(:file_approval, self.file.project) - #if self.workflow == DmsfWorkflow::STATE_DRAFT # Waiting for approval - wf = DmsfWorkflow.find_by_id(dmsf_workflow_id) - wf.assign(self.id) if wf && self.id - #end + if User.current.allowed_to?(:file_approval, self.file.project) + wf = DmsfWorkflow.find_by_id(dmsf_workflow_id) + wf.assign(self.id) if wf && self.id end end diff --git a/app/models/dmsf_workflow_step_action.rb b/app/models/dmsf_workflow_step_action.rb index 568e4252..718bb16d 100644 --- a/app/models/dmsf_workflow_step_action.rb +++ b/app/models/dmsf_workflow_step_action.rb @@ -17,17 +17,25 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class DmsfWorkflowStepAction < ActiveRecord::Base - + belongs_to :dmsf_workflow_step_assignment validates :dmsf_workflow_step_assignment_id, :presence => true validates :action, :presence => true validates :note, :presence => true, :unless => lambda { self.action == DmsfWorkflowStepAction::ACTION_APPROVE } + validates :author_id, :presence => true ACTION_APPROVE = 1 ACTION_REJECT = 2 ACTION_DELEGATE = 3 + ACTION_ASSIGN = 4 + ACTION_START = 5 + def initialize(*args) + super + self.author_id = User.current.id if User.current + end + def self.is_finished?(action) action == DmsfWorkflowStepAction::ACTION_APPROVE || action == DmsfWorkflowStepAction::ACTION_REJECT @@ -36,5 +44,5 @@ class DmsfWorkflowStepAction < ActiveRecord::Base def is_finished? DmsfWorkflowStepAction.is_finished? self.action end - + end \ No newline at end of file diff --git a/app/views/dmsf/show.html.erb b/app/views/dmsf/show.html.erb index aec9a1c3..52f8ae8b 100644 --- a/app/views/dmsf/show.html.erb +++ b/app/views/dmsf/show.html.erb @@ -65,8 +65,9 @@ <%= l(:link_title) %> <%= l(:link_size) %> <%= l(:link_modified) %> - <%= l(:link_ver) %> - <%= l(:link_author) %> + <%= l(:link_ver) %> + <%= l(:link_workflow) %> + <%= l(:link_author) %> @@ -93,7 +94,8 @@ <%= image_tag("lockedbycurrent.png", :title => l(:title_locked_by_you), :plugin => :redmine_dmsf) %> <% end %> - + + <%= h(subfolder.user) %> <% if User.current.allowed_to?(:file_approval, @project) %> @@ -171,9 +173,21 @@ <%= image_tag("lockedbycurrent.png", :title => l(:title_locked_by_you), :plugin => :redmine_dmsf) %> <% end %> - - <%= "#{file.last_revision.version} #{file.last_revision.workflow_str(false)}" %> - + <%= 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, + :dmsf_file_revision_id => file.last_revision.id), + #:title => l(:title_waiting_for_approval), + :remote => true) %> + <% end %> + <%= h(file.last_revision.user) %> <% if User.current.allowed_to?(:file_approval, @project) %> @@ -314,9 +328,9 @@ sUrl = "jquery.dataTables/#{I18n.locale.to_s.downcase}.json" if I18n.locale && ! "aaSorting": [[1,'asc']], "aaSortingFixed": [[7,'asc']], "aoColumnDefs": [ - { "bSearchable": false, "aTargets": [0, 6, 7, 8] }, - { "bSortable": false, "aTargets": [0, 6, 7] }, - { "iDataSort": 8, "aTargets": [ 2 ] } + { "bSearchable": false, "aTargets": [0, 7, 8, 9] }, + { "bSortable": false, "aTargets": [0, 7, 8] }, + { "iDataSort": 9, "aTargets": [ 2 ] } ], "fnInitComplete": function() { jQuery("div.controls").prependTo(jQuery("#browser_wrapper div.fg-toolbar")[0]); diff --git a/app/views/dmsf_workflows/_log.html.erb b/app/views/dmsf_workflows/_log.html.erb new file mode 100644 index 00000000..ac84c720 --- /dev/null +++ b/app/views/dmsf_workflows/_log.html.erb @@ -0,0 +1,49 @@ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + <% 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 c.created_at" %> + <% result = DmsfWorkflowStep.connection.execute sql %> + <% result.each_with_index do |row, i| %> + + + + + + + + <% end; reset_cycle %> + +
<%= l(:label_dmsf_workflow_step) %><%= l(:label_user) %> <%= l(:label_action) %><%= l(:label_note) %><%=l(:label_date)%>
-<%= link_to_user User.find_by_id(revision.dmsf_workflow_assigned_by) if revision.dmsf_workflow_assigned_by %>Assigned<%= 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 %>Started<%= format_time(revision.dmsf_workflow_started_at) if revision.dmsf_workflow_started_at %>
<%= row[5] %><%= link_to_user User.find_by_id(row[3].present? ? row[3] : row[4]) %><%= revision.workflow_str false %><%= row[1] %><%= format_time(row[2]) if row[2].present? %>
+
+ <% end %> + <% end %> +

+ diff --git a/app/views/dmsf_workflows/log.html.erb b/app/views/dmsf_workflows/log.html.erb deleted file mode 100644 index 6231320b..00000000 --- a/app/views/dmsf_workflows/log.html.erb +++ /dev/null @@ -1 +0,0 @@ -

WorkflowController#log

diff --git a/app/views/dmsf_workflows/log.js.erb b/app/views/dmsf_workflows/log.js.erb new file mode 100644 index 00000000..de409eaa --- /dev/null +++ b/app/views/dmsf_workflows/log.js.erb @@ -0,0 +1,3 @@ +$('#ajax-modal').html('<%= escape_javascript(render :partial => 'log', :locals => {:workflow => @workflow}) %>'); +showModal('ajax-modal', '640px'); +$('#ajax-modal').addClass('workflow-log'); \ No newline at end of file diff --git a/app/views/dmsf_workflows/new_action.js.erb b/app/views/dmsf_workflows/new_action.js.erb deleted file mode 100644 index 92d31fd2..00000000 --- a/app/views/dmsf_workflows/new_action.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$('#ajax-modal').modal('hide').empty(); -window.location.reload(); \ No newline at end of file diff --git a/assets/stylesheets/dmsf.css b/assets/stylesheets/dmsf.css index 21f077df..5c8623cb 100644 --- a/assets/stylesheets/dmsf.css +++ b/assets/stylesheets/dmsf.css @@ -14,8 +14,8 @@ table.entries { } table.entries td.modified { - min-width: 140px; - width: 140px; + min-width: 104px; + width: 104px; } table.entries td.actions { @@ -24,7 +24,7 @@ table.entries td.actions { } table.entries td.title { - width: 50%; + width: 40%; } table.entries th.check, table.entries td.check { @@ -136,6 +136,11 @@ td.version img { vertical-align:text-top; } +td.workflow { + font-size: 0.8em; + white-space: nowrap; +} + /* DMSF entries list icons */ div.right_icon_box { @@ -251,11 +256,6 @@ div.revision_box .ui-widget-header { font-weight: normal; } -td.workflow { - font-size: 0.8em; - white-space: nowrap; +table.steps td.note { + width: 30%; } - -td.workflow img { - vertical-align:text-top; -} \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 60c31ada..5e6cd109 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -45,7 +45,7 @@ en: :link_title: "Title" :link_size: "Size" :link_modified: "Modified" - :link_ver: "Version" + :link_ver: "Ver." :link_author: "Author" :title_check_for_zip_download_or_email: "Check for Zip download or email" :title_delete: "Delete" @@ -230,4 +230,7 @@ en: info_revision: "r%{rev}" link_workflow: Workflow button_assign: Assign - error_empty_note: "The note can't be empty" \ No newline at end of file + error_empty_note: "The note can't be empty" + title_dmsf_workflow_log: 'Approval workflow log' + label_action: Action + label_note: Note \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 83b8e729..193a6379 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -107,6 +107,7 @@ RedmineApp::Application.routes.draw do get 'autocomplete_for_user' get 'action' get 'assign' + get 'log' post 'new_action' post 'start' post 'assignment' diff --git a/db/migrate/20120822100401_create_dmsf_workflows.rb b/db/migrate/20120822100401_create_dmsf_workflows.rb index fbb00c29..8bc9de19 100644 --- a/db/migrate/20120822100401_create_dmsf_workflows.rb +++ b/db/migrate/20120822100401_create_dmsf_workflows.rb @@ -26,11 +26,19 @@ class CreateDmsfWorkflows < ActiveRecord::Migration change_table :dmsf_file_revisions do |t| t.references :dmsf_workflow + t.integer :dmsf_workflow_assigned_by + t.datetime :dmsf_workflow_assigned_at + t.integer :dmsf_workflow_started_by + t.datetime :dmsf_workflow_started_at end end def self.down remove_column :dmsf_file_revisions, :dmsf_workflow_id + remove_column :dmsf_file_revisions, :dmsf_workflow_assigned_by + remove_column :dmsf_file_revisions, :dmsf_workflow_assigned_at + remove_column :dmsf_file_revisions, :dmsf_workflow_started_by + remove_column :dmsf_file_revisions, :dmsf_workflow_started_at drop_table :dmsf_workflows end end diff --git a/db/migrate/20120822100404_create_dmsf_workflow_step_actions.rb b/db/migrate/20120822100404_create_dmsf_workflow_step_actions.rb index e7704c5e..2ee590e3 100644 --- a/db/migrate/20120822100404_create_dmsf_workflow_step_actions.rb +++ b/db/migrate/20120822100404_create_dmsf_workflow_step_actions.rb @@ -23,6 +23,7 @@ class CreateDmsfWorkflowStepActions < ActiveRecord::Migration t.integer :action, :null => false t.text :note t.timestamp :created_at + t.integer :author_id, :null => false end add_index :dmsf_workflow_step_actions, :dmsf_workflow_step_assignment_id, diff --git a/init.rb b/init.rb index f61b03d2..23f74632 100644 --- a/init.rb +++ b/init.rb @@ -57,7 +57,7 @@ Redmine::Plugin.register :redmine_dmsf do :dmsf_upload => [:upload_files, :upload_file, :commit_files]} permission :file_approval, {:dmsf_files => [:delete_revision, :notify_activate, :notify_deactivate], :dmsf => [:notify_activate, :notify_deactivate], - :dmsf_workflows => [:new, :create, :destroy, :edit, :add_step, :remove_step, :reorder_steps, :update, :start, :assign, :assignment, :action, :new_action]} + :dmsf_workflows => [:new, :create, :destroy, :edit, :add_step, :remove_step, :reorder_steps, :update, :start, :assign, :assignment, :action, :new_action, :log]} permission :force_file_unlock, {} end