From 64d8c521df3a6c162c76026629f444b22bf6b77c Mon Sep 17 00:00:00 2001 From: Karel Picman Date: Fri, 24 May 2013 14:25:36 +0200 Subject: [PATCH] Assigning of approval workflows to revisions --- app/controllers/dmsf_controller.rb | 18 +++- app/controllers/dmsf_workflows_controller.rb | 68 ++++++++++---- app/helpers/dmsf_workflows_helper.rb | 21 ++++- app/models/dmsf_file_revision.rb | 27 +++--- app/models/dmsf_workflow.rb | 52 ++++++++--- app/models/dmsf_workflow_step.rb | 14 +-- app/models/dmsf_workflow_step_action.rb | 1 + app/views/dmsf/show.html.erb | 87 ++++++++++-------- .../dmsf_files/_file_new_revision.html.erb | 2 +- app/views/dmsf_files/show.html.erb | 71 ++++++-------- app/views/dmsf_mailer/files_updated.html.erb | 2 +- app/views/dmsf_mailer/files_updated.text.erb | 2 +- .../dmsf_mailer/files_updated.text.html.rhtml | 2 +- .../files_updated.text.plain.rhtml | 2 +- app/views/dmsf_upload/_upload_file.html.erb | 15 +-- .../dmsf_upload/_upload_file_locked.html.erb | 8 +- app/views/dmsf_workflows/_action.html.erb | 26 ++---- app/views/dmsf_workflows/_assign.html.erb | 21 +++++ app/views/dmsf_workflows/_steps.html.erb | 4 +- app/views/dmsf_workflows/action.html.erb | 1 - app/views/dmsf_workflows/assign.js.erb | 3 + .../autocomplete_for_user.html.erb | 1 + .../autocomplete_for_user.js.erb | 1 - assets/images/approve.png | Bin 535 -> 0 bytes assets/images/approved.png | Bin 262 -> 752 bytes assets/images/askforapproval.png | Bin 641 -> 0 bytes assets/images/draft.png | Bin 461 -> 459 bytes assets/images/none.png | Bin 0 -> 776 bytes assets/images/rejected.png | Bin 0 -> 631 bytes assets/images/waiting_for_approval.png | Bin 0 -> 630 bytes assets/images/waitingforapproval.png | Bin 412 -> 0 bytes assets/images/workflowdisabled.png | Bin 1392 -> 0 bytes assets/stylesheets/dmsf.css | 28 +++++- config/locales/en.yml | 9 +- config/routes.rb | 5 +- init.rb | 10 +- 36 files changed, 309 insertions(+), 192 deletions(-) create mode 100644 app/views/dmsf_workflows/_assign.html.erb delete mode 100644 app/views/dmsf_workflows/action.html.erb create mode 100644 app/views/dmsf_workflows/assign.js.erb create mode 100644 app/views/dmsf_workflows/autocomplete_for_user.html.erb delete mode 100644 app/views/dmsf_workflows/autocomplete_for_user.js.erb delete mode 100644 assets/images/approve.png delete mode 100644 assets/images/askforapproval.png create mode 100644 assets/images/none.png create mode 100644 assets/images/rejected.png create mode 100644 assets/images/waiting_for_approval.png delete mode 100644 assets/images/waitingforapproval.png delete mode 100644 assets/images/workflowdisabled.png diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index 579ca759..211f4d4b 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -255,8 +255,22 @@ class DmsfController < ApplicationController redirect_to params[:current] ? params[:current] : {:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder.folder} end - - + + def assign + end + + def assignment + 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_create) + end + end + redirect_to params[:current] ? params[:current] : + {:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder.folder} + end private diff --git a/app/controllers/dmsf_workflows_controller.rb b/app/controllers/dmsf_workflows_controller.rb index 33bb5806..9416ea3b 100644 --- a/app/controllers/dmsf_workflows_controller.rb +++ b/app/controllers/dmsf_workflows_controller.rb @@ -20,9 +20,9 @@ class DmsfWorkflowsController < ApplicationController unloadable layout :workflows_layout - before_filter :find_workflow, :except => [:create, :new, :index] - before_filter :find_project - before_filter :authorize_global, :except => [:action, :new_action] + before_filter :find_workflow, :except => [:create, :new, :index, :assign, :assignment] + before_filter :find_project, :except => [:start] + before_filter :authorize_global #, :except => [:action, :new_action] def index if @project @@ -35,18 +35,40 @@ class DmsfWorkflowsController < ApplicationController def action end - def new_action - action = DmsfWorkflowStepAction.new( - :dmsf_workflow_step_assignment_id => params[:dmsf_workflow_step_assignment_id], - :action => params[:step_action], - :note => params[:note]) - if request.post? && action.save - @workflow.try_finish params[:dmsf_file_revision_id] - flash[:notice] = l(:notice_successful_create) - end - # TODO: Refresh the page! + def new_action + if params[:commit] == l(:submit_commit) + action = DmsfWorkflowStepAction.new( + :dmsf_workflow_step_assignment_id => params[:dmsf_workflow_step_assignment_id], + :action => params[:step_action], + :note => params[:note]) + if request.post? + if action.save + @workflow.try_finish params[:dmsf_file_revision_id], action, params[:user_id] + flash[:notice] = l(:notice_successful_update) + else + flash[:error] = l(:error_empty_note) + end + end + end redirect_to :back end + + def assign + end + + def assignment + if params[:commit] == l(:button_assign) + 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) + end + end + end + redirect_to :back + end def log end @@ -87,7 +109,8 @@ class DmsfWorkflowsController < ApplicationController def destroy begin - @workflow.destroy + @workflow.destroy + flash[:notice] = l(:notice_successful_delete) rescue flash[:error] = l(:error_unable_delete_dmsf_workflow) end @@ -98,10 +121,8 @@ class DmsfWorkflowsController < ApplicationController end end - def autocomplete_for_user - respond_to do |format| - format.js - end + def autocomplete_for_user + render :layout => false end def add_step @@ -158,6 +179,17 @@ class DmsfWorkflowsController < ApplicationController end end + def start + revision = DmsfFileRevision.find_by_id(params[:dmsf_file_revision_id]) + if revision + revision.set_workflow(@workflow.id, params[:action]) + if request.post? && revision.save + flash[:notice] = l(:notice_successful_update) + end + end + redirect_to :back + end + private def find_workflow diff --git a/app/helpers/dmsf_workflows_helper.rb b/app/helpers/dmsf_workflows_helper.rb index 65a9371d..690e109d 100644 --- a/app/helpers/dmsf_workflows_helper.rb +++ b/app/helpers/dmsf_workflows_helper.rb @@ -18,19 +18,24 @@ module DmsfWorkflowsHelper - def render_principals_for_new_dmsf_workflow_users(workflow) - scope = User.active.sorted.like(params[:q]) + def render_principals_for_new_dmsf_workflow_users(workflow, dmsf_workflow_step_assignment_id, dmsf_file_revision_id) + scope = workflow.delegates(params[:q], dmsf_workflow_step_assignment_id, dmsf_file_revision_id, nil) principal_count = scope.count - principal_pages = Redmine::Pagination::Paginator.new principal_count, 100, params['page'] + principal_pages = Redmine::Pagination::Paginator.new principal_count, 10, params['page'] principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).all - s = content_tag('div', principals_check_box_tags('user_ids[]', principals), :id => 'principals') + if dmsf_workflow_step_assignment_id + s = content_tag('div', principals_radio_button_tags('step_action', principals), :id => 'users_for_delegate') + else + s = content_tag('div', principals_check_box_tags('user_ids[]', principals), :id => 'users') + end links = pagination_links_full(principal_pages, principal_count, :per_page_links => false) {|text, parameters, options| link_to text, autocomplete_for_user_dmsf_workflow_path(workflow, parameters.merge(:q => params[:q], :format => 'js')), :remote => true } s + content_tag('p', links, :class => 'pagination') + s.html_safe end def dmsf_workflow_steps_options_for_select(steps) @@ -50,4 +55,12 @@ module DmsfWorkflowsHelper end options_for_select(options, :selected => dmsf_workflow_id) end + + def principals_radio_button_tags(name, principals) + s = '' + principals.each do |principal| + s << "\n" + end + s.html_safe + end end diff --git a/app/models/dmsf_file_revision.rb b/app/models/dmsf_file_revision.rb index a28c96be..0ce4c46f 100644 --- a/app/models/dmsf_file_revision.rb +++ b/app/models/dmsf_file_revision.rb @@ -156,19 +156,22 @@ class DmsfFileRevision < ActiveRecord::Base return new_revision end - def workflow_str - str = '' - if dmsf_workflow_id + def workflow_str(name) + if name && dmsf_workflow_id wf = DmsfWorkflow.find_by_id(dmsf_workflow_id) str = "#{wf.name} - " if wf + else + str = '' end case workflow - when 1 + when DmsfWorkflow::STATE_WAITING_FOR_APPROVAL str + l(:title_waiting_for_approval) - when 2 + when DmsfWorkflow::STATE_APPROVED str + l(:title_approved) - when 3 + when DmsfWorkflow::STATE_DRAFT str + l(:title_draft) + when DmsfWorkflow::STATE_REJECTED + str + l(:title_rejected) else str end @@ -178,21 +181,21 @@ class DmsfFileRevision < ActiveRecord::Base if User.current.allowed_to?(:file_approval, self.file.project) unless dmsf_workflow_id.blank? self.dmsf_workflow_id = dmsf_workflow_id - if commit == l(:label_dmsf_wokflow_action_start) - self.workflow = 1 # Waiting for approval + if commit == 'start' + self.workflow = DmsfWorkflow::STATE_WAITING_FOR_APPROVAL # Waiting for approval else - self.workflow = 3 # Draft - end + self.workflow = DmsfWorkflow::STATE_DRAFT # Draft + end end end end def assign_workflow(dmsf_workflow_id) if User.current.allowed_to?(:file_approval, self.file.project) - if self.workflow == 1 # Waiting for approval + #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 + #end end end diff --git a/app/models/dmsf_workflow.rb b/app/models/dmsf_workflow.rb index 74708290..7b995ee3 100644 --- a/app/models/dmsf_workflow.rb +++ b/app/models/dmsf_workflow.rb @@ -42,7 +42,7 @@ class DmsfWorkflow < ActiveRecord::Base def to_s name - end + end def approvals(step) wa = Array.new @@ -109,9 +109,24 @@ class DmsfWorkflow < ActiveRecord::Base end end end - - def delegates - User.all + + def delegates(q, dmsf_workflow_step_assignment_id, dmsf_file_revision_id, project_id) + if project_id + sql = ['id IN (SELECT user_id FROM members WHERE project_id = ?', project_id] + elsif dmsf_workflow_step_assignment_id && dmsf_file_revision_id + sql = [ + 'id NOT IN (SELECT a.user_id FROM dmsf_workflow_step_assignments a WHERE id = ?) AND id IN (SELECT m.user_id FROM members m JOIN dmsf_file_revisions r ON m.project_id = r.project_id WHERE r.id = ?)', + dmsf_workflow_step_assignment_id, + dmsf_file_revision_id] + else + sql = '1=1' + end + + unless q.nil? || q.empty? + User.active.sorted.where(sql).like(q) + else + User.active.sorted.where(sql) + end end def get_free_assignment(user, dmsf_file_revision_id) @@ -130,17 +145,28 @@ class DmsfWorkflow < ActiveRecord::Base end end - def try_finish(dmsf_file_revision_id) + def try_finish(dmsf_file_revision_id, action, user_id) res = nil - steps = DmsfWorkflowStep.where(:dmsf_workflow_id => self.id).all - steps.each do |step| - res = step.result dmsf_file_revision_id - unless step.finished? dmsf_file_revision_id - return - end + case action.action + when DmsfWorkflowStepAction::ACTION_APPROVE + steps = DmsfWorkflowStep.where(:dmsf_workflow_id => self.id).all + steps.each do |step| + res = step.result dmsf_file_revision_id + unless step.finished? dmsf_file_revision_id + return + end + end + when DmsfWorkflowStepAction::ACTION_REJECT + res = DmsfWorkflow::STATE_REJECTED + when DmsfWorkflowStepAction::ACTION_DELEGATE + assignment = DmsfWorkflowStepAssignment.find_by_id(action.dmsf_workflow_step_assignment_id) + assignment.update_attribute(:user_id, user_id) if assignment + end + + if res + revision = DmsfFileRevision.find_by_id dmsf_file_revision_id + revision.update_attribute(:workflow, res) if revision end - revision = DmsfFileRevision.find_by_id dmsf_file_revision_id - revision.update_attribute(:workflow, res) if revision && res end end \ No newline at end of file diff --git a/app/models/dmsf_workflow_step.rb b/app/models/dmsf_workflow_step.rb index de8baa72..52458ed6 100644 --- a/app/models/dmsf_workflow_step.rb +++ b/app/models/dmsf_workflow_step.rb @@ -77,14 +77,16 @@ class DmsfWorkflowStep < ActiveRecord::Base :dmsf_workflow_step_id => self.id, :dmsf_file_revision_id => dmsf_file_revision_id, :user_id => user.id).first - actions = DmsfWorkflowStepAction.where( - :dmsf_workflow_step_assignment_id => assignment.id).all - actions.each do |action| - if action && action.is_finished? - return + 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 - return assignment.id end end \ No newline at end of file diff --git a/app/models/dmsf_workflow_step_action.rb b/app/models/dmsf_workflow_step_action.rb index 9748aa3b..568e4252 100644 --- a/app/models/dmsf_workflow_step_action.rb +++ b/app/models/dmsf_workflow_step_action.rb @@ -22,6 +22,7 @@ class DmsfWorkflowStepAction < ActiveRecord::Base validates :dmsf_workflow_step_assignment_id, :presence => true validates :action, :presence => true + validates :note, :presence => true, :unless => lambda { self.action == DmsfWorkflowStepAction::ACTION_APPROVE } ACTION_APPROVE = 1 ACTION_REJECT = 2 diff --git a/app/views/dmsf/show.html.erb b/app/views/dmsf/show.html.erb index 9702a086..aec9a1c3 100644 --- a/app/views/dmsf/show.html.erb +++ b/app/views/dmsf/show.html.erb @@ -65,7 +65,7 @@ <%= l(:link_title) %> <%= l(:link_size) %> <%= l(:link_modified) %> - <%= l(:link_ver) %> + <%= l(:link_ver) %> <%= l(:link_author) %> @@ -93,11 +93,11 @@ <%= 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) %> -
+
<% if subfolder.notification %> <%= link_to_function(image_tag("notify.png", :plugin => :redmine_dmsf), "manipulation_link('#{url_for(:action => 'notify_deactivate', :id => @project, :folder_id => subfolder)}')", @@ -106,7 +106,7 @@ <%= link_to_function(image_tag("notifynot.png", :plugin => :redmine_dmsf), "manipulation_link('#{url_for(:action => 'notify_activate', :id => @project, :folder_id => subfolder)}')", :title => l(:title_notifications_not_active_activate)) %> - <% end %> + <% end %>
<% end %>
@@ -147,7 +147,7 @@ <%= subfolder.deep_size %> <% end %> - <% @files.each do |file| %> + <% @files.each do |file| %> <%= check_box_tag("files[]", file.id, false, :title => l(:title_check_for_zip_download_or_email)) %> @@ -172,38 +172,12 @@ <% end %> - <%= file.last_revision.version %> - <% 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 %> - <%= link_to( - image_tag('waitingforapproval.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_file_revision_id => file.last_revision.id), - :title => l(:title_waiting_for_approval), - :remote => true) %> - <% else %> - <%= image_tag('waitingforapproval.png', :title => l(:title_waiting_for_approval), :plugin => :redmine_dmsf) %> - <% end %> - <% end %> - <% when DmsfWorkflow::STATE_APPROVED %> - <%= image_tag('approved.png', :title => l(:title_approved), :plugin => :redmine_dmsf) %> - <% when DmsfWorkflow::STATE_DRAFT %> - <%= image_tag('draft.png', :title => l(:title_draft), :plugin => :redmine_dmsf) %> - <% when DmsfWorkflow::STATE_REJECTED %> - <%= image_tag('delete.png', :title => l(:title_rejected), :plugin => :redmine_dmsf) %> - <% end %> - + <%= "#{file.last_revision.version} #{file.last_revision.workflow_str(false)}" %> + <%= h(file.last_revision.user) %> <% if User.current.allowed_to?(:file_approval, @project) %> -
+
<% if file.notification %> <%= link_to_function(image_tag("notify.png", :plugin => :redmine_dmsf), "manipulation_link('#{url_for(:controller => "dmsf_files", :action => 'notify_deactivate', :id => file)}')", @@ -213,9 +187,48 @@ "manipulation_link('#{url_for(:controller => "dmsf_files", :action => 'notify_activate', :id => file)}')", :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) %> + <% if wf %> + <% dmsf_workflow_step_assignment_id = wf.get_free_assignment(User.current, file.last_revision.id) %> + <% if dmsf_workflow_step_assignment_id %> + <%= 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_file_revision_id => file.last_revision.id), + :title => l(:title_waiting_for_approval), + :remote => true) %> + <% else %> + <%= image_tag('waiting_for_approval.png', :title => "#{l(:label_dmsf_wokflow_action_approve)} #{l(:label_dmsf_wokflow_action_reject)} #{l(:label_dmsf_wokflow_action_delegate)}", :plugin => :redmine_dmsf) %> + <% end %> + <% 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), + "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)) %> + <% 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, + :dmsf_file_revision_id => file.last_revision.id), + :title => l(:label_dmsf_wokflow_action_assign), + :remote => true) %> + <% end %> +
<% end %> -
+
<%= link_to(image_tag("filedetails.png", :plugin => :redmine_dmsf, :class =>"detail_icon"), {:controller => "dmsf_files", :action => :show, :id => file }, @@ -242,7 +255,7 @@ <%= link_to_function(image_tag("delete.png", :plugin => :redmine_dmsf), "confirmation_link('#{url_for(:controller => "dmsf_files", :action => 'delete', :id => file)}')", :title => l(:title_delete)) %> - <% end %> + <% end %>

diff --git a/app/views/dmsf_files/_file_new_revision.html.erb b/app/views/dmsf_files/_file_new_revision.html.erb index 87a97d33..2a58bf45 100644 --- a/app/views/dmsf_files/_file_new_revision.html.erb +++ b/app/views/dmsf_files/_file_new_revision.html.erb @@ -44,7 +44,7 @@ <%= @file.last_revision.major_version + 1 %>.0 <%= l(:option_version_major) %>

- <%= label_tag("workflow", l(:label_workflow) + ":") %> + <%= label_tag('workflow', l(:label_workflow) + ':') %> <%= select_tag( 'dmsf_workflow_id', dmsf_workflows_for_select(@project, @file.last_revision.dmsf_workflow_id))%> diff --git a/app/views/dmsf_files/show.html.erb b/app/views/dmsf_files/show.html.erb index edd3573f..f1458a6a 100644 --- a/app/views/dmsf_files/show.html.erb +++ b/app/views/dmsf_files/show.html.erb @@ -57,7 +57,8 @@

<%= l(:heading_revisions) %>

<% @file.revisions.visible[@revision_pages.current.offset,@revision_pages.items_per_page].each do |revision| %> -
+
+
<%= link_to(image_tag("download.png", :plugin => "redmine_dmsf"), {:action => "show", :id => @file, :download => revision}, @@ -69,22 +70,20 @@ :title => l(:title_delete_revision)) %> <% end %>
-

- <%=label_tag("", (revision.source_revision.nil? ? l(:label_created) : l(:label_changed)) + ":")%> + + <%= label_tag('', l(:info_revision, :rev => revision.id)) %> + <%= (revision.source_revision.nil? ? l(:label_created) : l(:label_changed)).downcase %> <%= l(:info_changed_by_user, :changed => format_time(revision.updated_at), :user => h(revision.user)) %> -

+ +
-
-

- <%= label_tag("", l(:label_title) + ":") %> - <%= h(revision.title) %> -

+
+ <%= label_tag("", l(:label_title) + ":") %> + <%= h(revision.title) %>
-
-

- <%= label_tag("", l(:label_file) + ":") %> - <%= (h(revision.folder.dmsf_path_str) + "/") unless revision.folder.nil? %><%= h(revision.name) %> -

+
+ <%= label_tag("", l(:label_file) + ":") %> + <%= (h(revision.folder.dmsf_path_str) + "/") unless revision.folder.nil? %><%= h(revision.name) %>

@@ -94,42 +93,30 @@ <%= textilizable(revision.description) %>

-
-

- <%= label_tag("", l(:label_version) + ":") %> - <%= revision.major_version %>.<%= revision.minor_version %> -

-

- <%= label_tag("", l(:label_workflow) + ":") %> - <%= #case revision.workflow - # when 1 then l(:option_workflow_waiting_for_approval) - # when 2 then l(:option_workflow_approved) - # else l(:option_workflow_none) - # end - revision.workflow_str - %> -

+
+ <%= label_tag("", l(:label_version) + ":") %> + <%= revision.major_version %>.<%= revision.minor_version %> +
+ <%= label_tag('', l(:label_workflow) + ':') %> + <%= revision.workflow_str true %>
-
-

- <%= label_tag("", l(:label_mime) + ":") %> - <%= h(revision.mime_type) %>  -

-

- <%= label_tag("", l(:label_size) + ":") %> - <%= number_to_human_size(revision.size) %> -

-
-
+
+ <%= label_tag("", l(:label_mime) + ":") %> + <%= h(revision.mime_type) %>  +
+ <%= label_tag("", l(:label_size) + ":") %> + <%= number_to_human_size(revision.size) %> +
<%= render "dmsf/custom_fields", :object => revision %>
-

+

<%= label_tag("", l(:label_comment) + ":") %> <%= h(revision.comment) %> -

+
<%= render(:partial => "revision_access", :locals => {:revision => revision}) if User.current.allowed_to?(:file_approval, @file.project) %>
+
<% end %>

<%= pagination_links_full @revision_pages, @file.revisions.visible.count %>

diff --git a/app/views/dmsf_mailer/files_updated.html.erb b/app/views/dmsf_mailer/files_updated.html.erb index 545256e2..5c6c2bc0 100644 --- a/app/views/dmsf_mailer/files_updated.html.erb +++ b/app/views/dmsf_mailer/files_updated.html.erb @@ -13,7 +13,7 @@ :download => ""}) %> (<%= file.name %>), <%= number_to_human_size(file.last_revision.size) %>, version: <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %>, - <%= "#{file.last_revision.workflow_str}," unless file.last_revision.workflow_str.blank? %> + <%= "#{file.last_revision.workflow_str(true)}," unless file.last_revision.workflow_str(true).blank? %> <%= link_to("Details", {:only_path => false, :controller => "dmsf_files", :action => "show", :id => file}) %> <% unless file.last_revision.comment.blank? %> diff --git a/app/views/dmsf_mailer/files_updated.text.erb b/app/views/dmsf_mailer/files_updated.text.erb index b78bd7c2..fcd0ea79 100644 --- a/app/views/dmsf_mailer/files_updated.text.erb +++ b/app/views/dmsf_mailer/files_updated.text.erb @@ -1,6 +1,6 @@ User <%= @user %> actualized DMSF files in project <%= @project.name %>: <% @files.each do |file| %> - <%= file.dmsf_path_str %> (<%= file.name %>), <%= number_to_human_size(file.last_revision.size) %>, version: <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %><%= ", #{file.last_revision.workflow_str}" unless file.last_revision.workflow_str.blank? %> + <%= file.dmsf_path_str %> (<%= file.name %>), <%= number_to_human_size(file.last_revision.size) %>, version: <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %><%= ", #{file.last_revision.workflow_str(true)}" unless file.last_revision.workflow_str(true).blank? %> <%= url_for({:only_path => false, :controller => "dmsf_files", :action => "show", :id => file}) %> <% unless file.last_revision.comment.blank? %> comment: <%= file.last_revision.comment %><% end %> <% end %> \ No newline at end of file diff --git a/app/views/dmsf_mailer/files_updated.text.html.rhtml b/app/views/dmsf_mailer/files_updated.text.html.rhtml index 545256e2..5c6c2bc0 100644 --- a/app/views/dmsf_mailer/files_updated.text.html.rhtml +++ b/app/views/dmsf_mailer/files_updated.text.html.rhtml @@ -13,7 +13,7 @@ :download => ""}) %> (<%= file.name %>), <%= number_to_human_size(file.last_revision.size) %>, version: <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %>, - <%= "#{file.last_revision.workflow_str}," unless file.last_revision.workflow_str.blank? %> + <%= "#{file.last_revision.workflow_str(true)}," unless file.last_revision.workflow_str(true).blank? %> <%= link_to("Details", {:only_path => false, :controller => "dmsf_files", :action => "show", :id => file}) %> <% unless file.last_revision.comment.blank? %> diff --git a/app/views/dmsf_mailer/files_updated.text.plain.rhtml b/app/views/dmsf_mailer/files_updated.text.plain.rhtml index b78bd7c2..fcd0ea79 100644 --- a/app/views/dmsf_mailer/files_updated.text.plain.rhtml +++ b/app/views/dmsf_mailer/files_updated.text.plain.rhtml @@ -1,6 +1,6 @@ User <%= @user %> actualized DMSF files in project <%= @project.name %>: <% @files.each do |file| %> - <%= file.dmsf_path_str %> (<%= file.name %>), <%= number_to_human_size(file.last_revision.size) %>, version: <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %><%= ", #{file.last_revision.workflow_str}" unless file.last_revision.workflow_str.blank? %> + <%= file.dmsf_path_str %> (<%= file.name %>), <%= number_to_human_size(file.last_revision.size) %>, version: <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %><%= ", #{file.last_revision.workflow_str(true)}" unless file.last_revision.workflow_str(true).blank? %> <%= url_for({:only_path => false, :controller => "dmsf_files", :action => "show", :id => file}) %> <% unless file.last_revision.comment.blank? %> comment: <%= file.last_revision.comment %><% end %> <% end %> \ No newline at end of file diff --git a/app/views/dmsf_upload/_upload_file.html.erb b/app/views/dmsf_upload/_upload_file.html.erb index 4f52aef8..8e56cf62 100644 --- a/app/views/dmsf_upload/_upload_file.html.erb +++ b/app/views/dmsf_upload/_upload_file.html.erb @@ -1,17 +1,4 @@ -<% -#disabled_workflow = [] -#selected_workflow = nil -#unless User.current.allowed_to?(:file_approval, @project) - #disabled_workflow << 2 - #current_workflow = upload.workflow - #if current_workflow == 1 || current_workflow == 2 - #disabled_workflow << nil - #selected_workflow = 1 - #end -#else - #selected_workflow = upload.workflow -#end -%> +
<%= hidden_field_tag("commited_files[#{i}][disk_filename]", upload.disk_filename) %>
diff --git a/app/views/dmsf_upload/_upload_file_locked.html.erb b/app/views/dmsf_upload/_upload_file_locked.html.erb index dec8da17..f994bbb6 100644 --- a/app/views/dmsf_upload/_upload_file_locked.html.erb +++ b/app/views/dmsf_upload/_upload_file_locked.html.erb @@ -30,13 +30,7 @@

<%= label_tag("", l(:label_workflow) + ":") %> - <%= #case upload.workflow - # when 1 then l(:option_workflow_waiting_for_approval) - # when 2 then l(:option_workflow_approved) - # else l(:option_workflow_none) - # end - upload.workflow_str - %> + <%= upload.workflow_str true %>

diff --git a/app/views/dmsf_workflows/_action.html.erb b/app/views/dmsf_workflows/_action.html.erb index 4c35e181..251982fd 100644 --- a/app/views/dmsf_workflows/_action.html.erb +++ b/app/views/dmsf_workflows/_action.html.erb @@ -1,13 +1,9 @@

<%= l(:label_dmsf_workflow) %>

-<%= form_tag({:controller => 'dmsf_workflows', - :action => 'new_action', - :object_type => DmsfWorkflow, - :object_id => @workflow.id, - :project_id => @project.id}, - :remote => true, +<%= form_tag({:controller => 'dmsf_workflows', :action => 'new_action'}, :method => :post, - :id => 'new-action-form') do %> + :id => 'new-action-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] %>


@@ -18,18 +14,14 @@

-
- <%= text_field_tag 'user_search', nil %> + <%= label_tag 'delegate', l(:label_dmsf_wokflow_action_delegate) %>
+ <%= text_field_tag 'user_search', nil %> + <%= javascript_tag "observeSearchfield('user_search', 'users_for_delegate', '#{ escape_javascript autocomplete_for_user_dmsf_workflow_path(@workflow, :dmsf_workflow_step_assignment_id => params[:dmsf_workflow_step_assignment_id], :dmsf_file_revision_id => params[:dmsf_file_revision_id]) }')" %> + <%= content_tag('div', principals_radio_button_tags('step_action', @workflow.delegates(nil, params[:dmsf_workflow_step_assignment_id], params[:dmsf_file_revision_id], nil)), :id => 'users_for_delegate') %>

- <%= javascript_tag "observeSearchfield('user_search', 'users_for_delegate', '#{ escape_javascript autocomplete_for_user_dmsf_workflow_path(@workflow) }')" %> - -
- <%= principals_check_box_tags 'watcher[user_ids][]', @workflow.delegates %> -
-

- <%= submit_tag l(:submit_commit), :name => nil, :onclick => 'hideModal(this);' %> - <%= submit_tag l(:button_cancel), :name => nil, :onclick => 'hideModal(this);' %> + <%= submit_tag l(:submit_commit), :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 new file mode 100644 index 00000000..f2be82d6 --- /dev/null +++ b/app/views/dmsf_workflows/_assign.html.erb @@ -0,0 +1,21 @@ +

<%= 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] %> + +

+ <%= 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_cancel), :name => 'commit', :onclick => 'hideModal(this);' %> +

+<% end %> diff --git a/app/views/dmsf_workflows/_steps.html.erb b/app/views/dmsf_workflows/_steps.html.erb index 70afad2a..2d57c895 100644 --- a/app/views/dmsf_workflows/_steps.html.erb +++ b/app/views/dmsf_workflows/_steps.html.erb @@ -61,10 +61,10 @@
<%=l(:label_user_new)%>

<%= label_tag 'user_search', l(:label_user_search) %><%= text_field_tag 'user_search', nil %>

- <%= javascript_tag "observeSearchfield('user_search', null, '#{ escape_javascript autocomplete_for_user_dmsf_workflow_path(@workflow) }')" %> + <%= javascript_tag "observeSearchfield('user_search', 'users', '#{ escape_javascript autocomplete_for_user_dmsf_workflow_path(@workflow, :dmsf_workflow_step_assignment_id => nil, :dmsf_file_revision_id => nil, :project_id => @project ? @project.id : nil) }')" %>
- <%= render_principals_for_new_dmsf_workflow_users(@workflow) %> + <%= render_principals_for_new_dmsf_workflow_users(@workflow, nil, nil) %>

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

WorkflowController#action

diff --git a/app/views/dmsf_workflows/assign.js.erb b/app/views/dmsf_workflows/assign.js.erb new file mode 100644 index 00000000..ded50f0c --- /dev/null +++ b/app/views/dmsf_workflows/assign.js.erb @@ -0,0 +1,3 @@ +$('#ajax-modal').html('<%= escape_javascript(render :partial => 'assign', :locals => {:workflow => @workflow}) %>'); +showModal('ajax-modal', '400px'); +$('#ajax-modal').addClass('assignment'); \ No newline at end of file diff --git a/app/views/dmsf_workflows/autocomplete_for_user.html.erb b/app/views/dmsf_workflows/autocomplete_for_user.html.erb new file mode 100644 index 00000000..8510d370 --- /dev/null +++ b/app/views/dmsf_workflows/autocomplete_for_user.html.erb @@ -0,0 +1 @@ +<%= render_principals_for_new_dmsf_workflow_users(@workflow, params[:dmsf_workflow_step_assignment_id], params[:dmsf_file_revision_id]) %> diff --git a/app/views/dmsf_workflows/autocomplete_for_user.js.erb b/app/views/dmsf_workflows/autocomplete_for_user.js.erb deleted file mode 100644 index e74e6b4c..00000000 --- a/app/views/dmsf_workflows/autocomplete_for_user.js.erb +++ /dev/null @@ -1 +0,0 @@ -$('#users').html('<%= escape_javascript(render_principals_for_new_dmsf_workflow_users(@workflow)) %>'); diff --git a/assets/images/approve.png b/assets/images/approve.png deleted file mode 100644 index fc25958ac6f97b4bf2cf483d593cddb8e83be9fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 535 zcmV+y0_gpTP)}Iq3IoUi+*)0klzL{a?_kGKB0bT!tv)HK^)#MmPVg&ue zFqQai%CiAVudboJ7(|=)Q;78=qJ4;n4_CnY76rTN!nWjYb$pZO{KO%5p!|MVUK-e@ zXiyVaW?r(=L^#-1gAJ5ZXtgH>6?$UeeQ!syEn(SO{dvUH2e;!Vn_OOzG{Fbi|2 zp>B6TdmE5}1$1SsDF>xIB;^}YzUau>{Ao<_hV1>V?tplDo?3Zc$|D`}bxNs0Df=B+ z`*KnSUXr=H!5zrQ&Y&eii1<0gyR(SdesVL%n(`?}E`ILCT$w=`TF;5l#yWojYUC*5 z^;K%ckCFt{T$J4NUbL@u`M8viQ2cZdGe7OfSK#{ diff --git a/assets/images/approved.png b/assets/images/approved.png index da85f26df2d93b6407d52b869fb13c52b3797136..37c88de94f23085c3a83af6676a4ba8d307eba68 100644 GIT binary patch literal 752 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*l1 z3^om!?NO@$00MAHL_t(I%axMfOH*+e#-H>3o*y31)RVskF6$^OF-w;>1?slMgw4#n ztH79Dc~$lo*#3ffhMdCJiCbEX=_ zW~zoEO@#e$4Kn$3drA(tJFG?Gqzvf%JQ#t2DdBUTL)8YhnrI*_8-HgP8d?>!XCaf1J<-3kWP=prQ@x9-Pr* zkO@OPuCl8LCpF}Xd5|~*9?d-gOW4-QCRHQog2yZuO*@X(_2i@-nnpJ~zdX*!P^< zft_WTGfLo(tY9jr`Y1!)drJryz`#pbORQpZH-sCf+h8xOa#2D@TTiuMha@2J5;($R z=+iJLq0O%vC$*n0(Fi$|(9YUTR>buf;(83WLK})@1r^4V*uXlDh(+-F#;~CI+%GRo z^!=6(4B@%IHlS>7Z(3|7E8>V_Z8wODoC<`of&4Th{NVtGJ`Stn4R5ae5ikJIpXmdk zdQFLJM=aF^RUnkXYBGpSJ_{m|(EI)&wv!2m@4=VAz5)Ocf0`JGIbzCuXx?Hq)gVjA zM4n)TcX130+M?U*81G9d^Cuo3?{U7U(+Ai4_3ouky>7%h{jYguzvh|2%G&}JZVHsw iD51?G^b3IGX%~^VGY4O(NwdaaZ48Qo<`@IKIWA*;*1{Rj3DHVA#j+%xz6HSiMZf> z1K)W7>!(%u=C<+CmFTBS>#thw!hOfq=kfOWxXt2MhPQK?!|SVE_~W$ZpEBvIJNW6S zroPyXt-zlt`1}3c=keaAvwz3lP$=kWOE z@Au^H_xbz%;OX*kn8NF=Uhu<%{PWZN^U?b4vR;e2^7s1e^ZM!W_~PvL=kNFB?DTAv z!0xtj^wFO1%6Ra{a`47(^7i`g_4@Ag`t9@j>+|{I>ho`x!SK0x{Px@U=bZTEmG|S1 ze4xj@(d6;=`tkMp@b&uX@b;|3+>NZx^u>(*_ucsDqWI^X%-idGpvPZ~yI_pFT8Ow| zjk{=)zNWv~@o z^}>bpzkc+(cJa1u@Ums_tzCoUq^JM@00DGTPE!Ct=GbNc004POL_t&-83nmu$=hrWg!qSQ&m+}RaI40Rr&zHdyT$T@!O^v-3f_mbYSj4 zr8mqSe;bS@EOQTx7Oa!S?P(ZIu(;Xpj3#hA^LawA0D;i~Twc)6S&sm?ma1yttE#HX b_E1&-{~a7)@`du200000NkvXXu0mjf&HJJF diff --git a/assets/images/draft.png b/assets/images/draft.png index 6902ab0cc75af10f160eb1b5f143c77b7f6dc3f8..0257b1d8c11a997228863a7ce7430a21365c5b98 100644 GIT binary patch literal 459 zcmV;+0W|)JP)Px#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*l13^pv) zghBNH00B=)L_t(2&u!2>NJ3#0#_|9AUMhr7!-uII7JCU8V+TInW?uWL-L;K!1;0Dc?71jrOAjzvlNwGi|JXF zX^%EajgltKfDF4d7elzQt(trY>w}R6YF*q9l$aMQEhZ?T#QVU0aC~)|4<>o%xhSIo zLb}jJ{wNP{pvtEWRiVu=S-#fxGBOl%=H?Uj+*S-g#&p#|i!mN)#`iKHLdGTo2yQ8# z4xBmCe(H=+`G#+`AT``2rCxk~xOqh7AazPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2i*k^ z2puUwI-kD)00B)&L_t(2&vlSbCeG^&Ux!%-(Xnern{Y$XAYxD5tvASz>`=aPP7H}U6 zM7x^M8>$U|ZLq?p3BlH}4M6JD0pRdl@#NA4K(A{iSQ((0p}*4rpu1f$+@b@})~wT_ z>&0l=(_8+h;CbwwDaWI%V&+OYU)U~JuG(|?Z~Q=FE#<`G1Ik$w>X)7lgM)L2!LUJn zl^~J6!M=ZW#GhKn03Sdk+{pM)D*&&#PuBNcl9{_KF!FDOrX`(+=XY;WUU;S@KTJzb zm+jlMr*tV|6r{Ac(J{&{|QmLNSH00000NkvXXu0mjf DQQ6Jc diff --git a/assets/images/none.png b/assets/images/none.png new file mode 100644 index 0000000000000000000000000000000000000000..3051be29c0d726f5f2e505cd50fdac0e48b71743 GIT binary patch literal 776 zcmV+j1NZ!iP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*l1 z4J-%9*C<&400M|fL_t(I%axKrNK%F&Ur=-Yg z{*FI>-_H-e-!BK3m`EhTBjPNjl&6&L6G9%)ONiZwxbFA+d6&xts;WY-qmaAJ^TV6!G7K_DBP?99Y#dc6&Aw zi73Aqrvw54x6|oN8iw(vwY4?4x3?G8G%Xp6#Wnx{C;-TzP$+J-T3`3|^*zaCGV=8F zwA*U6K65&q;laVdjcT>}p{=crsjB*-P$+yy#Kid%j^lta2Gwfyo2F^^$HvBTq9}$D zaeZWD%$#@M*UVp&P2)80m- zaeZxV?dU=P06;pOUL6`5;!CAcR1gHT*=*Eqw~yxY`SEhOoRB1Gxv9?2&(AL{E-s$! z?(Uv#Z*QM1EG%UIb0z`0 literal 0 HcmV?d00001 diff --git a/assets/images/rejected.png b/assets/images/rejected.png new file mode 100644 index 0000000000000000000000000000000000000000..d75d8ec7c62a2d1063e9c7b2396d0107e7921c3f GIT binary patch literal 631 zcmV--0*L*IP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*l1 z4Fn`N?e~EI00H+&L_t(I%axKbNLyhPg}?vhPe{olzDE*G=#nWQ)DRtF!Gfvi_`OVY&@+{Hl}5$z&0p|}Xr1XOg;CImtAlDxk|XtAZO$$`7w?{M$o z2nNsrgf&=qLD&s77rYw;HV&a`2LejPV#*E#)Hf(;{TgWScFN@nGcyCGiI|4+-_*MAsU6_V~E(> zA_k!lv|11j!_g64%gVW6A3%Hpm6)FgT}Nmd_r)S#p`gQuAe4M-YtU%G@Gx9n(%syw zIbd8s<5!5n>qXS-sAiLAtE>y50(?Y3_k3$v!hmfC=GRg8X+}(j?!RRQo+bF|8 zoS#E3R}r>7{+EKmD@c_)or2ohf?yE*ez>{9tDy^^wSdpuR!G-LnU{Q*F(sw)uw RMx6iv002ovPDHLkV1igQ5$ON` literal 0 HcmV?d00001 diff --git a/assets/images/waiting_for_approval.png b/assets/images/waiting_for_approval.png new file mode 100644 index 0000000000000000000000000000000000000000..97cdace94954b0956029d15bd123998c7f9a160d GIT binary patch literal 630 zcmV-+0*U>JP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*l1 z4JtCoK1=)n00H(%L_t(I%axL`OCwPbhrhSab&b&&gcMQG1+ywHlI?Pcg0Z{8;>vWX zqrnZPm;42>u$Sv>1A<(mVi7QnTd1XpSR`nQh@x3d^or#q-YFNSdykple7~6yd?nIp z9U(T5Qb$!QNSW#RLU9lw4w#+Q85)AyTe!T`m97PZurUmsNCbR7Fbwed7P})@TeHx# z4NTMP+!5UoC`z7K3{(}`Z3u_q>I$UX{J+5ZdXjK>k@0c3zlV_#xVwXDwSuDL1OTa& zg%B1(IBab>9mPSUEVH~EL`ryh@%$Hy;JR_L*+Yd?Do-eM!pzJze*X#SbpB01$~@6% zkU#)hEf^k#av7eUHpylW0eTR^W^N98d%-lJRI;({Ae#1*!NDZaC_FwwDD-D_6%-}+ zeu#a2UXts=(h^KfB~g?E=I22O&@_+|90wHT2boOc4U$+a$iu@o48!x-Zo}lH*KuqN zo}VEQfb(;>xyg~q>~zjpQY!sodRnL1v@i^Kef4NYM?K$uKQtQPI1aX*_Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+*LgRNQs009h1L_t(2Q+<%VP6AO7h4&eF1mi>T0G2k? zhMHJdT3C=66ASH3h#^*5sf7uIzX&V8>jI+usHnufb2xKlaSLFQbCbFAow;|$iKntL z>Xe#M*q|%cwjCZ9XE#;+1_qlVbKlTrH8liA1miD3|6Slu1l~x{8Vc&Kg4&CLOKI#K z-@@5FytYY?pg$IL2shsZPYbxxGbs6ghW+!0f5S83HoIDQAgJ~Y6fP3Zdl5tUCH+o= zUEP7fBjIw_pg=fBIPV4ah2+T{mP6|t(a_g&9b@Oxhz=dDH3(Ol&X$(m(Z>%oXRTn@ zx+++3yTfS+elt(51oe`|gQLr$cKoCgYrzG)MW{~gtOMt%mtj<^-8i`b0000NSs56Z83KGlT!G@XwYBy2^$iUTjg5^>O-;?s%`Gi0t*xyc9UYyWon2jBJv}|W zy}kYY{Szikm^^v%%$YN1&6>4n(V}I`mMveteATK|>(;GXzkdCO4I4IY+_-u3=B-<| zZriqP`}XZSckbM^YuE1GyZ7zew}1csLx&C>K79Ddkt4^CA3t&8#L1H$h*;e*F0H z>({T}zkmPv^XKp1zd+B9g3%B_4uMCv*lz&y2}4PcU-18t4H$yIv#SEbhO@vUvY3HE zs04%=@1@CC00kvWTq8Ealo z5uDn0T&&4JfFb#4pGMgmQSB}+CM6dElNbO0`|^COylDC6wt4Xl)*tL2^g}Au*G~WZ zvf{@330xaKaaFc0c0Ky6HK4(1o~c$?xpVN;$BFufwM4o9FVQlZo-*lT$hLGQn@=9k zr|om!z;1J(`K{9&)jzXeTYV_gW4I$0d)(&--xl4=MxR|cn(~&cKe0_uKvL&GQ&i@Q zyQl0pCa^sgZkW9*DW0x=F6*2UngHG+IqU!c diff --git a/assets/stylesheets/dmsf.css b/assets/stylesheets/dmsf.css index 47b98577..18fbde1f 100644 --- a/assets/stylesheets/dmsf.css +++ b/assets/stylesheets/dmsf.css @@ -19,8 +19,8 @@ table.entries td.modified { } table.entries td.actions { - min-width: 108px; - width: 108px; + min-width: 116px; + width: 116px; } table.entries td.title { @@ -237,4 +237,26 @@ table.access-table tbody td, table.access-table tbody tr:hover td { /* Approval workflow */ #admin-menu a.approvalworkflows { background-image: url(../images/ticket_go.png); } #users_for_delegate {height: 200px; overflow:auto;} -#users_for_delegate label {display: block;} \ No newline at end of file +#users_for_delegate label {display: block;} + +.revision_box{ + padding: 0px 0px 0px 0px; + margin-bottom: 10px; + background-color:#f6f6f6; + color:#505050; + line-height:1.5em; + /*border: 1px solid #e4e4e4;*/ +} + +div.revision_box .ui-widget-header { + font-weight: normal; +} + +td.workflow { + font-size: 0.8em; + white-space: nowrap; +} + +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 bf4019e4..2b4d38fb 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: "Ver." + :link_ver: "Version" :link_author: "Author" :title_check_for_zip_download_or_email: "Check for Zip download or email" :title_delete: "Delete" @@ -222,7 +222,12 @@ en: 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... title_draft: Draft title_rejected: Rejected - label_dmsf_wokflow_action_start: Start workflow \ No newline at end of file + 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" \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 4ecc978c..83b8e729 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -106,11 +106,14 @@ RedmineApp::Application.routes.draw do member do get 'autocomplete_for_user' get 'action' + get 'assign' post 'new_action' + post 'start' + post 'assignment' end end match 'dmsf_workflows/:id/edit', :controller => 'dmsf_workflows', :action => 'add_step', :id => /\d+/, :via => :post match 'dmsf_workflows/:id/edit', :controller => 'dmsf_workflows', :action => 'remove_step', :id => /\d+/, :via => :delete - match 'dmsf_workflows/:id/edit', :controller => 'dmsf_workflows', :action => 'reorder_steps', :id => /\d+/, :via => :put + match 'dmsf_workflows/:id/edit', :controller => 'dmsf_workflows', :action => 'reorder_steps', :id => /\d+/, :via => :put end diff --git a/init.rb b/init.rb index f864c5d9..f61b03d2 100644 --- a/init.rb +++ b/init.rb @@ -51,14 +51,14 @@ Redmine::Plugin.register :redmine_dmsf do permission :view_dmsf_folders, {:dmsf => [:show], :dmsf_folders_copy => [:new, :copy_to, :move_to]} permission :user_preferences, {:dmsf_state => [:user_pref_save]} permission :view_dmsf_files, {:dmsf => [:entries_operation, :entries_email], - :dmsf_files => [:show], :dmsf_files_copy => [:new, :create, :move]} + :dmsf_files => [:show], :dmsf_files_copy => [:new, :create, :move]} permission :folder_manipulation, {:dmsf => [:new, :create, :delete, :edit, :save, :edit_root, :save_root, :lock, :unlock]} permission :file_manipulation, {:dmsf_files => [:create_revision, :delete, :lock, :unlock], - :dmsf_upload => [:upload_files, :upload_file, :commit_files]} + :dmsf_upload => [:upload_files, :upload_file, :commit_files]} permission :file_approval, {:dmsf_files => [:delete_revision, :notify_activate, :notify_deactivate], - :dmsf => [:notify_activate, :notify_deactivate]} - permission :force_file_unlock, {} - permission :approval_workflows, {:dmsf_workflows => [:new, :create, :destroy, :edit, :add_step, :remove_step, :reorder_steps, :update]} + :dmsf => [:notify_activate, :notify_deactivate], + :dmsf_workflows => [:new, :create, :destroy, :edit, :add_step, :remove_step, :reorder_steps, :update, :start, :assign, :assignment, :action, :new_action]} + permission :force_file_unlock, {} end # Administration menu extension