From 2f6fc5cc9dbc128c55e02bdbff55f1579811b5e4 Mon Sep 17 00:00:00 2001 From: Karel Picman Date: Tue, 17 Jan 2017 09:41:43 +0100 Subject: [PATCH] Edit approval workflow steps #635 --- app/controllers/dmsf_workflows_controller.rb | 52 ++++++++++++++ app/models/dmsf_workflow_step.rb | 10 ++- app/views/dmsf_workflows/_main.html.erb | 2 +- app/views/dmsf_workflows/_steps.html.erb | 72 ++++++++++++++++--- assets/stylesheets/redmine_dmsf.css | 14 +++- config/routes.rb | 2 + init.rb | 3 +- .../dmsf_workflow_controller_test.rb | 28 +++++++- 8 files changed, 168 insertions(+), 15 deletions(-) diff --git a/app/controllers/dmsf_workflows_controller.rb b/app/controllers/dmsf_workflows_controller.rb index f3325664..b942029a 100644 --- a/app/controllers/dmsf_workflows_controller.rb +++ b/app/controllers/dmsf_workflows_controller.rb @@ -384,6 +384,58 @@ class DmsfWorkflowsController < ApplicationController redirect_to :back end + def update_step + # Name + if params[:dmsf_workflow].present? + index = params[:step].to_i + name = params[:dmsf_workflow][:name] + if name.present? + step = @dmsf_workflow.dmsf_workflow_steps[index] + step.name = name + unless step.save + flash[:error] = step.errors.full_messages.to_sentence + else + @dmsf_workflow.dmsf_workflow_steps.each do |s| + if s.step == step.step + s.name = step.name + s.save + end + end + end + end + else + # Operators + params[:operator_step].each do |id, operator| + step = DmsfWorkflowStep.find_by_id id + if step + step.operator = operator.to_i + unless step.save + flash[:error] = step.errors.full_messages.to_sentence + end + end + end + end + redirect_to :back + end + + def delete_step + step = DmsfWorkflowStep.find_by_id params[:step] + if step + # Safe the name + if step.name.present? + @dmsf_workflow.dmsf_workflow_steps.each do |s| + if s.step == step.step + s.name = step.name + s.save + end + end + end + # Destroy + step.destroy + end + redirect_to :back + end + private def find_project diff --git a/app/models/dmsf_workflow_step.rb b/app/models/dmsf_workflow_step.rb index 5070b028..05049691 100644 --- a/app/models/dmsf_workflow_step.rb +++ b/app/models/dmsf_workflow_step.rb @@ -2,7 +2,7 @@ # # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011-16 Karel Pičman +# Copyright (C) 2011-17 Karel Pičman # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -28,10 +28,14 @@ class DmsfWorkflowStep < ActiveRecord::Base validates_uniqueness_of :user_id, :scope => [:dmsf_workflow_id, :step] validates_length_of :name, :maximum => 30 - OPERATOR_OR = 0 - OPERATOR_AND = 1 + OPERATOR_OR = 0.freeze + OPERATOR_AND = 1.freeze def soperator + DmsfWorkflowStep.soperator(self.operator) + end + + def self.soperator(operator) operator == 1 ? l(:dmsf_and) : l(:dmsf_or) end diff --git a/app/views/dmsf_workflows/_main.html.erb b/app/views/dmsf_workflows/_main.html.erb index 2c3632b2..9753c5a4 100644 --- a/app/views/dmsf_workflows/_main.html.erb +++ b/app/views/dmsf_workflows/_main.html.erb @@ -3,7 +3,7 @@ # # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011-16 Karel Pičman +# Copyright (C) 2011-17 Karel Pičman # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/app/views/dmsf_workflows/_steps.html.erb b/app/views/dmsf_workflows/_steps.html.erb index c4b38c46..5b653fb9 100644 --- a/app/views/dmsf_workflows/_steps.html.erb +++ b/app/views/dmsf_workflows/_steps.html.erb @@ -3,7 +3,7 @@ # # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011-16 Karel Pičman +# Copyright (C) 2011-17 Karel Pičman # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -54,18 +54,74 @@ <%= i %> <% index = @dmsf_workflow.dmsf_workflow_steps.order(:id).index{ |s| s.step == i } %> - <%= @dmsf_workflow.dmsf_workflow_steps[index].name if index %> - - <% stps = @dmsf_workflow.dmsf_workflow_steps.collect{|s| (s.step == i) ? s : nil}.compact %> - <% stps.each_with_index do |step, j| %> - <% if (j != 0) || (stps.count > 1) %> - <%= step.soperator %> + + <%= @dmsf_workflow.dmsf_workflow_steps[index].name if index %> + <%= form_for(@dmsf_workflow, + :url => update_step_dmsf_workflow_path(:step => index), + :method => :put, + :html => {:id => "step-index-#{index}-name-form", :class => 'hol'}) do |f| %> +

+ <%= f.text_field(:name, :value => @dmsf_workflow.dmsf_workflow_steps[index].name) %> +

+

+ <%= submit_tag l(:button_change), :class => 'small' %> + <%= link_to_function( + l(:button_cancel), + "$('#step-index-#{index}-name').show(); $('#step-index-#{index}-approvers').show(); $('#step-index-#{index}-name-form').hide(); $('#step-index-#{index}-approvers-form').hide();") + %> +

+ <% end %> + + + + <% stps = @dmsf_workflow.dmsf_workflow_steps.collect{|s| (s.step == i) ? s : nil}.compact %> + <% stps.each_with_index do |step, j| %> + <% if (j != 0) || (stps.count > 1) %> + <%= step.soperator %> + <% end %> + <%= link_to_user step.user %> <% end %> - <%= link_to_user step.user %> + + <%= form_for(@dmsf_workflow, + :url => update_step_dmsf_workflow_path(:step => index), + :method => :put, + :html => {:id => "step-index-#{index}-approvers-form", :class => 'hol'}) do |f| %> +
+ <% stps.each_with_index do |step, j| %> +
+ +
+ +
+  <%= delete_link delete_step_dmsf_workflow_path(:step => step.id) %> +
+
+ <%= link_to_user step.user %> +
+ <% end %> +
+

+ <%= submit_tag l(:button_change), :class => 'small' %> + <%= link_to_function( + l(:button_cancel), + "$('#step-index-#{index}-name').show(); $('#step-index-#{index}-approvers').show(); $('#step-index-#{index}-name-form').hide(); $('#step-index-#{index}-approvers-form').hide();") + %> +

<% end %> <%= reorder_handle(@dmsf_workflow, :url => url_for(:action => 'edit', :id => @dmsf_workflow, :step => i) ) %> + <%= link_to_function l(:button_edit), + "$('#step-index-#{index}-name').hide(); $('#step-index-#{index}-approvers').hide(); $('#step-index-#{index}-name-form').show(); $('#step-index-#{index}-approvers-form').show();", + :class => 'icon icon-edit' %> <%= delete_link edit_dmsf_workflow_path(@dmsf_workflow, :step => i) %> diff --git a/assets/stylesheets/redmine_dmsf.css b/assets/stylesheets/redmine_dmsf.css index ff1b515d..2eedab55 100644 --- a/assets/stylesheets/redmine_dmsf.css +++ b/assets/stylesheets/redmine_dmsf.css @@ -99,7 +99,7 @@ } .dmsf_workflow { - font-size: 0.8em; + /*font-size: 0.8em;*/ white-space: nowrap; } @@ -249,3 +249,15 @@ .dmsf_select_version { max-width: 50px; } + +.dmsf_parent_container { + overflow: hidden; + /*padding: 20px 0px 0px 0px;*/ +} + +.dmsf_child_container { + float: left; + text-align: left; + /*padding: 0px 10px 0px 0px; + width: 200px;*/ +} diff --git a/config/routes.rb b/config/routes.rb index f8e3d1f2..872d0822 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -133,6 +133,8 @@ RedmineApp::Application.routes.draw do get 'start' post 'assignment' get 'new_step' + put 'update_step' + delete 'delete_step' end end diff --git a/init.rb b/init.rb index eb36c91c..ac24fd45 100644 --- a/init.rb +++ b/init.rb @@ -92,7 +92,8 @@ Redmine::Plugin.register :redmine_dmsf do permission :file_approval, {:dmsf_workflows => [:action, :new_action, :autocomplete_for_user, :start, :assign, :assignment]} permission :manage_workflows, - {:dmsf_workflows => [:index, :new, :create, :destroy, :show, :new_step, :add_step, :remove_step, :reorder_steps, :update]} + {:dmsf_workflows => [:index, :new, :create, :destroy, :show, :new_step, :add_step, :remove_step, :reorder_steps, + :update, :update_step, :delete_step]} end # Administration menu extension diff --git a/test/functional/dmsf_workflow_controller_test.rb b/test/functional/dmsf_workflow_controller_test.rb index 10148872..7e833abd 100644 --- a/test/functional/dmsf_workflow_controller_test.rb +++ b/test/functional/dmsf_workflow_controller_test.rb @@ -2,7 +2,7 @@ # # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011-16 Karel Pičman +# Copyright (C) 2011-17 Karel Pičman # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -371,4 +371,30 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase assert_response :redirect end + def test_update_step_name + put :update_step, :id => @wf1, :step => @wfs2.step.to_s, :dmsf_workflow => {:name => 'new_name'} + assert_response :redirect + @wfs2.reload + assert_equal @wfs2.name, 'new_name' + @wfs3.reload + assert_equal @wfs3.name, 'new_name' + end + + def test_update_step_operators + put :update_step, :id => @wf1, :step => '1', :operator_step => {@wfs1.id.to_s => DmsfWorkflowStep::OPERATOR_OR.to_s} + assert_response :redirect + @wfs1.reload + assert_equal @wfs1.operator, DmsfWorkflowStep::OPERATOR_OR + end + + def test_delete_step + name = @wfs2.name + assert_difference 'DmsfWorkflowStep.count', -1 do + delete :delete_step, :id => @wf1, :step => @wfs2.id + end + @wfs3.reload + assert_equal @wfs3.name, name + assert_response :redirect + end + end