#880 Approval workflows in use are read only now

This commit is contained in:
Karel Pičman 2022-10-25 14:44:46 +02:00
parent 935c9d03d0
commit 1b16b07462
23 changed files with 110 additions and 69 deletions

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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 %>
<div class="contextual">
<%= 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') %>
<p>
<%= link_to l(:label_dmsf_workflow_new), new_dmsf_workflow_path(project_id: @project&.id), class: 'icon icon-add' %>
</p>
<% else %>
<div class="contextual">
<%= link_to l(:label_dmsf_workflow_new), new_dmsf_workflow_path(project_id: @project&.id), class: 'icon icon-add' %>
</div>
<h2><%= l(:label_dmsf_workflow_plural)%></h2>
<%= form_tag(dmsf_workflows_path, method: :get) do %>
<fieldset>
<legend><%= l(:label_filter_plural) %></legend>
<label for='status'><%= l(:field_status) %>:</label>
<%= select_tag 'status', workflows_status_options_for_select(@status), class: 'small',
onchange: 'this.form.submit(); return false;' %>
</fieldset>
<% end %>&nbsp;
<% end %>
<h2><%= l(:label_dmsf_workflow_plural) %></h2>
<% end %>
<% if @workflows.any? %>
<%= form_tag(@path, method: :get) do %>
<fieldset>
<legend><%= l(:label_filter_plural) %></legend>
<label for='status'><%= l(:field_status) %>:</label>
<%
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;' %>
</fieldset>
<% end %>&nbsp;
<% if @workflows.any? %>
<table class="list">
<thead><tr>
<th><%= l(:field_name) %></th>
@ -48,8 +61,15 @@
<tr id="workflow-<%= workflow.id %>" class="dmsf-workflows <%= workflow.active? ? 'active' : 'locked' %>">
<td class="name"><%= link_to(h(workflow.name), dmsf_workflow_path(workflow)) %></td>
<td class="buttons">
<%= 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) %>
</td>
</tr>
<% end %>
@ -59,13 +79,6 @@
<p class="nodata"><%= l(:label_no_data) %></p>
<% end %>
<% if @project %>
<p>
<%= link_to l(:label_dmsf_workflow_new), new_dmsf_workflow_path(project_id: @project.id),
class: 'button button-positive icon icon-add' %>
</p>
<% else %>
<% if @workflow_pages %>
<span class="pagination"><%= pagination_links_full @workflow_pages %></span>
<% end %>
<% unless @project %>
<span class="pagination"><%= pagination_links_full @workflow_pages %></span>
<% end %>

View File

@ -23,6 +23,7 @@
<h3 class="title"><%= l(:dmsf_new_step) %></h3>
<%= 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) %>
<fieldset class="box">
<legend><%= l(:label_dmsf_workflow_add_approver) %></legend>
<p><%= label_tag 'user_search', l(:label_user_search) %><%= text_field_tag 'user_search', nil %></p>
@ -31,17 +32,15 @@
<%= render_principals_for_new_dmsf_workflow_users @dmsf_workflow %>
</div>
</fieldset>
<fieldset class="box">
<legend><%= l(:label_dmsf_workflow_step) %></legend>
<%= 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%' %>
<span id="dmsf_step_name">&nbsp;
<%= label_tag 'name', l(:field_name) %>
<%= text_field_tag 'name', nil, maxlength: 30, style: 'max-width: 40%' %>
</span>
</fieldset>
<p class="buttons">
<%= l(:label_add_width) %>
<%= f.submit l(:dmsf_and), id: 'add-step-and' %>

View File

@ -20,13 +20,11 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<% if @dmsf_workflow.project %>
<h2><%= link_to l(:label_dmsf_workflow_plural), settings_project_path(@project, tab: 'dmsf_workflow') %> &#187; <%=h @dmsf_workflow %></h2>
<% else %>
<h2><%= link_to l(:label_dmsf_workflow_plural), dmsf_workflows_path %> &#187; <%=h @dmsf_workflow %></h2>
<% end %>
<% path = @dmsf_workflow.project ? settings_project_path(@project, tab: 'dmsf_workflow') : dmsf_workflows_path %>
<h2><%= link_to l(:label_dmsf_workflow_plural), path %> &#187; <%=h @dmsf_workflow %></h2>
<%= labelled_form_for @dmsf_workflow do |f| %>
<%= hidden_field_tag :back_url, dmsf_workflow_path(@dmsf_workflow) %>
<%= error_messages_for 'workflow' %>
<div class="box tabular">
<p>
@ -38,7 +36,8 @@
<div id="tab-content-members">
<p>
<%= 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' %>
</p>
<% steps = @dmsf_workflow.dmsf_workflow_steps.collect{|s| s.step}.uniq %>
<% if steps.any? %>
@ -56,10 +55,12 @@
<td class="id"><%= i %></td>
<td class="name">
<span id="step-index-<%= index %>-name"><%= @dmsf_workflow.dmsf_workflow_steps[index].name if index %></span>
<div id="<%= "step-index-#{index}-name-form" %>" class="hol">
<div id="<%= "step-index-#{index}-name-form" %>">
<%= 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}") %>
<p>
<%= submit_tag l(:button_change), class: 'small' %>
<%= link_to_function(
@ -72,7 +73,8 @@
</td>
<td>
<span id="step-index-<%= index %>-approvers">
<% 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) %>
<b><%= step.soperator %></b>
@ -80,9 +82,10 @@
<%= link_to_user step.user %>
<% end %>
</span>
<div id="<%= "step-index-#{index}-approvers-form" %>" class="hol">
<div id="<%= "step-index-#{index}-approvers-form" %>">
<%= 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) %>
<div class="dmsf-parent-container">
<% stps.each do |step| %>
<div class="dmsf-child-container">
@ -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)) %>
</td>
<% end %>
</tr>

View File

@ -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 {

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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: