From 1b16b0746234c853a7d0fe5b9acb8127fcc9d4d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Pi=C4=8Dman?= Date: Tue, 25 Oct 2022 14:44:46 +0200 Subject: [PATCH] #880 Approval workflows in use are read only now --- app/controllers/dmsf_workflows_controller.rb | 24 +++++-- app/helpers/dmsf_workflows_helper.rb | 20 ------ app/models/dmsf_folder.rb | 2 +- app/views/dmsf_workflows/_main.html.erb | 67 +++++++++++-------- .../dmsf_workflows/_new_step_modal.html.erb | 5 +- app/views/dmsf_workflows/_steps.html.erb | 26 ++++--- assets/stylesheets/redmine_dmsf.css | 19 +++++- config/locales/cs.yml | 1 + config/locales/de.yml | 1 + config/locales/en.yml | 1 + config/locales/es.yml | 1 + config/locales/fa.yml | 1 + config/locales/fr.yml | 1 + config/locales/hu.yml | 1 + config/locales/it.yml | 1 + config/locales/ja.yml | 1 + config/locales/ko.yml | 1 + config/locales/nl.yml | 1 + config/locales/pl.yml | 1 + config/locales/pt-BR.yml | 1 + config/locales/sl.yml | 1 + config/locales/zh-TW.yml | 1 + config/locales/zh.yml | 1 + 23 files changed, 110 insertions(+), 69 deletions(-) diff --git a/app/controllers/dmsf_workflows_controller.rb b/app/controllers/dmsf_workflows_controller.rb index 571067e6..29334714 100644 --- a/app/controllers/dmsf_workflows_controller.rb +++ b/app/controllers/dmsf_workflows_controller.rb @@ -29,6 +29,7 @@ class DmsfWorkflowsController < ApplicationController before_action :authorize_custom before_action :permissions, only: [:new_action, :assignment, :start] before_action :approver_candidates, only: [:remove_step, :show, :reorder_steps, :add_step] + before_action :prevent_from_editing, only: [:destroy, :remove_step, :update, :add_step, :update_step, :reorder_steps] layout :workflows_layout @@ -50,7 +51,8 @@ class DmsfWorkflowsController < ApplicationController def index @status = params[:status] || 1 - @workflow_pages, @workflows = paginate DmsfWorkflow.status(@status).global.sorted, per_page: 25 + @workflow_pages, @workflows = paginate(DmsfWorkflow.status(@status).global.sorted, per_page: 25) + @path = dmsf_workflows_path end def action @@ -350,7 +352,6 @@ class DmsfWorkflowsController < ApplicationController def new_step @steps = @dmsf_workflow.dmsf_workflow_steps.select('step, MAX(name) AS name').group(:step) - respond_to do |format| format.html format.js @@ -360,7 +361,7 @@ class DmsfWorkflowsController < ApplicationController def add_step if request.post? if params[:step] == '0' - step = @dmsf_workflow.dmsf_workflow_steps.collect{|s| s.step}.uniq.count + 1 + step = @dmsf_workflow.dmsf_workflow_steps.collect{ |s| s.step }.uniq.count + 1 else step = params[:step].to_i end @@ -409,7 +410,9 @@ class DmsfWorkflowsController < ApplicationController def reorder_steps if request.put? - unless @dmsf_workflow.reorder_steps(params[:step].to_i, params[:dmsf_workflow][:position].to_i) + if @assigned + error_dmsf_workflow_assigned + elsif !@dmsf_workflow.reorder_steps(params[:step].to_i, params[:dmsf_workflow][:position].to_i) flash[:error] = l(:notice_cannot_renumber_steps) end end @@ -532,4 +535,17 @@ private @approving_candidates = @project ? @project.users.to_a : User.active.to_a end + def prevent_from_editing + # A workflow in use can be neither edited nor deleted + @assigned = DmsfFileRevision.where(dmsf_workflow_id: @dmsf_workflow.id).exists? + if(@assigned && (!request.put?)) + flash[:error] = l(:error_dmsf_workflow_assigned) + if @project + redirect_back_or_default settings_project_path(@project, tab: 'dmsf_workflow') + else + redirect_back_or_default dmsf_workflows_path + end + end + end + end diff --git a/app/helpers/dmsf_workflows_helper.rb b/app/helpers/dmsf_workflows_helper.rb index 228a3b10..4bfb1e21 100644 --- a/app/helpers/dmsf_workflows_helper.rb +++ b/app/helpers/dmsf_workflows_helper.rb @@ -100,24 +100,4 @@ module DmsfWorkflowsHelper s.html_safe end - def change_status_link(workflow) - url = { controller: 'dmsf_workflows', action: 'update', id: workflow.id } - if workflow.locked? - link_to l(:button_unlock), url.merge(dmsf_workflow: { status: DmsfWorkflow::STATUS_ACTIVE }), method: :put, - class: 'icon icon-unlock' - else - link_to l(:button_lock), url.merge(dmsf_workflow: { status: DmsfWorkflow::STATUS_LOCKED }), method: :put, - class: 'icon icon-lock' - end - end - - def workflows_status_options_for_select(selected) - worflows_count_by_status = DmsfWorkflow.global.group('status').count.to_hash - options_for_select([[l(:label_all), ''], - ["#{l(:status_active)} (#{worflows_count_by_status[DmsfWorkflow::STATUS_ACTIVE].to_i})", - DmsfWorkflow::STATUS_ACTIVE.to_s], - ["#{l(:status_locked)} (#{worflows_count_by_status[DmsfWorkflow::STATUS_LOCKED].to_i})", - DmsfWorkflow::STATUS_LOCKED.to_s]], selected.to_s) - end - end \ No newline at end of file diff --git a/app/models/dmsf_folder.rb b/app/models/dmsf_folder.rb index 815d270d..f0a6bf6a 100644 --- a/app/models/dmsf_folder.rb +++ b/app/models/dmsf_folder.rb @@ -22,7 +22,7 @@ class DmsfFolder < ActiveRecord::Base include RedmineDmsf::Lockable - + belongs_to :project belongs_to :dmsf_folder belongs_to :deleted_by_user, class_name: 'User', foreign_key: 'deleted_by_user_id' diff --git a/app/views/dmsf_workflows/_main.html.erb b/app/views/dmsf_workflows/_main.html.erb index 6fb129c2..7936da87 100644 --- a/app/views/dmsf_workflows/_main.html.erb +++ b/app/views/dmsf_workflows/_main.html.erb @@ -20,24 +20,37 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. %> -<% @workflows = DmsfWorkflow.active.sorted.where(project_id: @project.id) if @project && @workflows.nil? %> - -<% unless @project %> -
- <%= link_to l(:label_dmsf_workflow_new), new_dmsf_workflow_path, class: 'icon icon-add' %> +<% if @project %> + <% @status = params[:status] || 1 %> + <% @workflows = DmsfWorkflow.status(@status).where(project_id: @project.id).sorted %> + <% @path = settings_project_path(@project, tab: 'dmsf_workflow') %> +

+ <%= link_to l(:label_dmsf_workflow_new), new_dmsf_workflow_path(project_id: @project&.id), class: 'icon icon-add' %> +

+<% else %> +
+ <%= link_to l(:label_dmsf_workflow_new), new_dmsf_workflow_path(project_id: @project&.id), class: 'icon icon-add' %>
-

<%= l(:label_dmsf_workflow_plural)%>

- <%= form_tag(dmsf_workflows_path, method: :get) do %> -
- <%= l(:label_filter_plural) %> - - <%= select_tag 'status', workflows_status_options_for_select(@status), class: 'small', - onchange: 'this.form.submit(); return false;' %> -
- <% end %>  -<% end %> +

<%= l(:label_dmsf_workflow_plural) %>

+<% end %> -<% if @workflows.any? %> +<%= form_tag(@path, method: :get) do %> +
+ <%= l(:label_filter_plural) %> + + <% + worflows_count_by_status = DmsfWorkflow.where(project_id: @project&.id).group(:status).count.to_hash + options = options_for_select([[l(:label_all), ''], + ["#{l(:status_active)} (#{worflows_count_by_status[DmsfWorkflow::STATUS_ACTIVE].to_i})", + DmsfWorkflow::STATUS_ACTIVE.to_s], + ["#{l(:status_locked)} (#{worflows_count_by_status[DmsfWorkflow::STATUS_LOCKED].to_i})", + DmsfWorkflow::STATUS_LOCKED.to_s]], @status.to_s) + %> + <%= select_tag 'status', options, class: 'small', onchange: 'this.form.submit(); return false;' %> +
+<% end %>  + +<% if @workflows.any? %> @@ -48,8 +61,15 @@ <% end %> @@ -59,13 +79,6 @@

<%= l(:label_no_data) %>

<% end %> -<% if @project %> -

- <%= link_to l(:label_dmsf_workflow_new), new_dmsf_workflow_path(project_id: @project.id), - class: 'button button-positive icon icon-add' %> -

-<% else %> - <% if @workflow_pages %> - <%= pagination_links_full @workflow_pages %> - <% end %> +<% unless @project %> + <%= pagination_links_full @workflow_pages %> <% end %> diff --git a/app/views/dmsf_workflows/_new_step_modal.html.erb b/app/views/dmsf_workflows/_new_step_modal.html.erb index f4f2bf9c..cf6bc46e 100644 --- a/app/views/dmsf_workflows/_new_step_modal.html.erb +++ b/app/views/dmsf_workflows/_new_step_modal.html.erb @@ -23,6 +23,7 @@

<%= l(:dmsf_new_step) %>

<%= labelled_form_for(@dmsf_workflow, { url: edit_dmsf_workflow_path(@dmsf_workflow), method: :post }) do |f| %> + <%= hidden_field_tag :back_url, dmsf_workflow_path(@dmsf_workflow) %>
<%= l(:label_dmsf_workflow_add_approver) %>

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

@@ -31,17 +32,15 @@ <%= render_principals_for_new_dmsf_workflow_users @dmsf_workflow %>
-
<%= l(:label_dmsf_workflow_step) %> <%= select_tag 'step', dmsf_workflow_steps_options_for_select(@steps), - id: 'selected_step', onchange: "$('#dmsf_step_name').toggle(this.value == 0);", style: 'max-width: 40%' %> + id: 'selected_step', onchange: "$('#dmsf_step_name').toggle(this.value == 0);", style: 'max-width: 40%' %>   <%= label_tag 'name', l(:field_name) %> <%= text_field_tag 'name', nil, maxlength: 30, style: 'max-width: 40%' %>
-

<%= l(:label_add_width) %> <%= f.submit l(:dmsf_and), id: 'add-step-and' %> diff --git a/app/views/dmsf_workflows/_steps.html.erb b/app/views/dmsf_workflows/_steps.html.erb index 1b91e163..c79f3633 100644 --- a/app/views/dmsf_workflows/_steps.html.erb +++ b/app/views/dmsf_workflows/_steps.html.erb @@ -20,13 +20,11 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. %> -<% if @dmsf_workflow.project %> -

<%= link_to l(:label_dmsf_workflow_plural), settings_project_path(@project, tab: 'dmsf_workflow') %> » <%=h @dmsf_workflow %>

-<% else %> -

<%= link_to l(:label_dmsf_workflow_plural), dmsf_workflows_path %> » <%=h @dmsf_workflow %>

-<% end %> +<% path = @dmsf_workflow.project ? settings_project_path(@project, tab: 'dmsf_workflow') : dmsf_workflows_path %> +

<%= link_to l(:label_dmsf_workflow_plural), path %> » <%=h @dmsf_workflow %>

<%= labelled_form_for @dmsf_workflow do |f| %> + <%= hidden_field_tag :back_url, dmsf_workflow_path(@dmsf_workflow) %> <%= error_messages_for 'workflow' %>

@@ -38,7 +36,8 @@

- <%= link_to l(:dmsf_new_step_or_approver), new_step_dmsf_workflow_path(@dmsf_workflow), remote: true, class: 'icon icon-add' %> + <%= link_to l(:dmsf_new_step_or_approver), new_step_dmsf_workflow_path(@dmsf_workflow), remote: true, + class: 'icon icon-add' %>

<% steps = @dmsf_workflow.dmsf_workflow_steps.collect{|s| s.step}.uniq %> <% if steps.any? %> @@ -56,10 +55,12 @@
<% end %> diff --git a/assets/stylesheets/redmine_dmsf.css b/assets/stylesheets/redmine_dmsf.css index 1c9e26eb..a1bd0f4a 100644 --- a/assets/stylesheets/redmine_dmsf.css +++ b/assets/stylesheets/redmine_dmsf.css @@ -54,9 +54,22 @@ } /* Approval workflow */ -#dmsf_users_for_delegate { height: 200px; overflow:auto; } -#dmsf_users_for_delegate label { display: block; } -.dmsf-workflows.locked a { color: #aaa; } +#dmsf_users_for_delegate { + height: 200px; + overflow:auto; +} + +#dmsf_users_for_delegate label { + display: block; +} + +.dmsf-workflows.locked a { + color: #aaa; +} + +div[id^="step-index-"] { + display: none; +} /* DMSF revision box */ #new_revision_form_content { diff --git a/config/locales/cs.yml b/config/locales/cs.yml index f220088e..0e7ea35d 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -462,6 +462,7 @@ cs: label_dmsf_global_menu_disabled: Globální DMS menu zakázáno note_dmsf_global_menu_disabled: Pokud je zašrtnuto, tak položka DMS není v hlavním menu. + error_dmsf_workflow_assigned: Použitý schvalovací proces nemůže být ani upraven ani smazán. easy_pages: modules: diff --git a/config/locales/de.yml b/config/locales/de.yml index 38c08328..88c2cde6 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -458,6 +458,7 @@ de: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Der verwendete Genehmigungs-Workflow kann weder bearbeitet noch gelöscht werden. easy_pages: modules: diff --git a/config/locales/en.yml b/config/locales/en.yml index ee8ab184..adb46450 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -462,6 +462,7 @@ en: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/es.yml b/config/locales/es.yml index 99a130b8..aa2a7cb3 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -462,6 +462,7 @@ es: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 08eee264..94bbe9b5 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -441,6 +441,7 @@ fa: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 9408e1ba..2e7248e7 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -462,6 +462,7 @@ fr: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index a5a3b9e9..80b8641c 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -461,6 +461,7 @@ hu: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/it.yml b/config/locales/it.yml index 8e6b36fe..0ebef318 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -462,6 +462,7 @@ it: # Italian strings thx 2 Matteo Arceci! label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index a24094e8..6efcc6f9 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -463,6 +463,7 @@ ja: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index aa42153a..6f133063 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -462,6 +462,7 @@ ko: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index e2b7fa74..2ed1c5ed 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -462,6 +462,7 @@ nl: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index c74ce554..d8248979 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -462,6 +462,7 @@ pl: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index cdc2476c..80666111 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -462,6 +462,7 @@ pt-BR: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/sl.yml b/config/locales/sl.yml index e1ee796c..e8144205 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -462,6 +462,7 @@ sl: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 9f7d89e8..0d977ccd 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -461,6 +461,7 @@ zh-TW: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules: diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 4ac65a5b..6341a4f1 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -462,6 +462,7 @@ zh: label_dmsf_global_menu_disabled: Global DMS menu disabled note_dmsf_global_menu_disabled: If yes, DMS menu item is not present in the top menu. + error_dmsf_workflow_assigned: Approval workflow in use can be neither edited nor deleted. easy_pages: modules:
<%= l(:field_name) %>
<%= link_to(h(workflow.name), dmsf_workflow_path(workflow)) %> - <%= change_status_link(workflow) unless @project %> - <%= delete_link dmsf_workflow_path(workflow) %> + <% url = { controller: 'dmsf_workflows', action: 'update', id: workflow.id } %> + <% if workflow.locked? %> + <%= link_to l(:button_unlock), url.merge(dmsf_workflow: { status: DmsfWorkflow::STATUS_ACTIVE }), + method: :put, class: 'icon icon-unlock' %> + <% else %> + <%= link_to l(:button_lock), url.merge(dmsf_workflow: { status: DmsfWorkflow::STATUS_LOCKED }), + method: :put, class: 'icon icon-lock' %> + <% end %> + <%= delete_link dmsf_workflow_path(workflow, back_url: @path) %>
<%= i %> <%= @dmsf_workflow.dmsf_workflow_steps[index].name if index %> -
" class="hol"> +
"> <%= form_for(@dmsf_workflow, url: update_step_dmsf_workflow_path(step: index), method: :put, html: { id: "step-index-name-#{index}-form" }) do |f| %> - <%= f.text_field(:step_name, value: @dmsf_workflow.dmsf_workflow_steps[index].name, id: "dmsf_workflow_step_name_#{index}") %> + <%= hidden_field_tag :back_url, dmsf_workflow_path(@dmsf_workflow) %> + <%= f.text_field(:step_name, value: @dmsf_workflow.dmsf_workflow_steps[index].name, + id: "dmsf_workflow_step_name_#{index}") %>

<%= submit_tag l(:button_change), class: 'small' %> <%= link_to_function( @@ -72,7 +73,8 @@

- <% stps = @dmsf_workflow.dmsf_workflow_steps.collect{ |s| (s.step == i) ? s : nil }.compact %> + <% stps = @dmsf_workflow.dmsf_workflow_steps.order(operator: :desc). + collect{ |s| (s.step == i) ? s : nil }.compact %> <% stps.each_with_index do |step, j| %> <% if (j > 0) || (step.operator != DmsfWorkflowStep::OPERATOR_AND) %> <%= step.soperator %> @@ -80,9 +82,10 @@ <%= link_to_user step.user %> <% end %> -
" class="hol"> +
"> <%= form_for(@dmsf_workflow, url: update_step_dmsf_workflow_path(step: index), method: :put, html: { id: "step-index-operator-#{index}-form"}) do |_| %> + <%= hidden_field_tag :back_url, dmsf_workflow_path(@dmsf_workflow) %>
<% stps.each do |step| %>
@@ -121,7 +124,8 @@ <%= 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 %> + <%= delete_link edit_dmsf_workflow_path(@dmsf_workflow, step: i, + back_url: dmsf_workflow_path(@dmsf_workflow)) %>