Merge pull request #7026 from tchak/fix-deleted-dossier-no-link

Améliorer la vue des dossiers (supprimés) pour les instructeurs
This commit is contained in:
Paul Chavard 2022-03-14 15:57:30 +01:00 committed by GitHub
commit 14342e72f5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 90 additions and 62 deletions

View file

@ -96,24 +96,24 @@ module Instructeurs
def follow
current_instructeur.follow(dossier)
flash.notice = 'Dossier suivi'
redirect_back(fallback_location: instructeur_procedures_url)
redirect_back(fallback_location: instructeur_procedure_path(procedure))
end
def unfollow
current_instructeur.unfollow(dossier)
flash.notice = "Vous ne suivez plus le dossier nº #{dossier.id}"
redirect_back(fallback_location: instructeur_procedures_url)
redirect_back(fallback_location: instructeur_procedure_path(procedure))
end
def archive
dossier.archiver!(current_instructeur)
redirect_back(fallback_location: instructeur_procedures_url)
redirect_back(fallback_location: instructeur_procedure_path(procedure))
end
def unarchive
dossier.desarchiver!(current_instructeur)
redirect_back(fallback_location: instructeur_procedures_url)
redirect_back(fallback_location: instructeur_procedure_path(procedure))
end
def passer_en_instruction
@ -226,14 +226,25 @@ module Instructeurs
zipline(files, "dossier-#{dossier.id}.zip")
end
def delete_dossier
def destroy
if dossier.termine?
dossier.hide_and_keep_track!(current_instructeur, :instructeur_request)
flash.notice = t('instructeurs.dossiers.deleted_by_instructeur')
redirect_to instructeur_procedure_path(procedure)
else
flash.alert = t('instructeurs.dossiers.impossible_deletion')
redirect_back(fallback_location: instructeur_procedures_url)
end
redirect_back(fallback_location: instructeur_procedure_path(procedure))
end
def restore
dossier = current_instructeur.dossiers.find(params[:dossier_id])
dossier.restore(current_instructeur)
flash.notice = t('instructeurs.dossiers.restore')
if dossier.termine?
redirect_to instructeur_procedure_path(procedure, statut: :traites)
else
redirect_back(fallback_location: instructeur_procedure_path(procedure))
end
end

View file

@ -39,7 +39,7 @@ module Instructeurs
'dossiers' => @dossiers_count_per_procedure.sum { |_, v| v },
'expirant' => @dossiers_expirant_count_per_procedure.sum { |_, v| v },
'archivés' => @dossiers_archived_count_per_procedure.sum { |_, v| v },
'supprimes_recemment' => @dossiers_supprimes_recemment_count_per_procedure.sum { |_, v| v }
'supprimés récemment' => @dossiers_supprimes_recemment_count_per_procedure.sum { |_, v| v }
}
@procedure_ids_en_cours_with_notifications = current_instructeur.procedure_ids_with_notifications(:en_cours)
@ -137,15 +137,18 @@ module Instructeurs
.order(:dossier_id)
.page params[:page]
@a_suivre_count, @suivis_count, @traites_count, @tous_count, @archives_count = current_instructeur
@a_suivre_count, @suivis_count, @traites_count, @tous_count, @archives_count, @supprimes_recemment_count, @expirant_count = current_instructeur
.dossiers_count_summary(groupe_instructeur_ids)
.fetch_values('a_suivre', 'suivis', 'traites', 'tous', 'archives')
.fetch_values('a_suivre', 'suivis', 'traites', 'tous', 'archives', 'supprimes_recemment', 'expirant')
@can_download_dossiers = (@tous_count + @archives_count) > 0
notifications = current_instructeur.notifications_for_groupe_instructeurs(groupe_instructeur_ids)
@has_en_cours_notifications = notifications[:en_cours].present?
@has_termine_notifications = notifications[:termines].present?
@statut = 'supprime'
assign_exports
end
def update_displayed_fields
@ -278,6 +281,8 @@ module Instructeurs
redirect_to instructeur_procedure_path(@procedure)
end
private
def create_bulk_message_mail(dossier_count, dossier_state)
BulkMessage.create(
dossier_count: dossier_count,
@ -290,15 +295,6 @@ module Instructeurs
)
end
def restore
dossier = current_instructeur.dossiers.find(params[:dossier_id])
dossier.restore(current_instructeur)
flash.notice = t('instructeurs.dossiers.restore')
redirect_to instructeur_procedure_path(procedure)
end
private
def assign_to_params
params.require(:assign_to)
.permit(:instant_email_dossier_notifications_enabled, :instant_email_message_notifications_enabled, :daily_email_notifications_enabled, :weekly_email_notifications_enabled)

View file

@ -140,6 +140,7 @@ class Instructeur < ApplicationRecord
def notifications_for_groupe_instructeurs(groupe_instructeurs)
Dossier
.visible_by_administration
.not_archived
.where(groupe_instructeur: groupe_instructeurs)
.merge(followed_dossiers)
@ -180,8 +181,8 @@ class Instructeur < ApplicationRecord
nb_notification = notifications[:en_cours].count + notifications[:termines].count
h = {
nb_en_construction: groupe.dossiers.en_construction.count,
nb_en_instruction: groupe.dossiers.en_instruction.count,
nb_en_construction: groupe.dossiers.visible_by_administration.en_construction.count,
nb_en_instruction: groupe.dossiers.visible_by_administration.en_instruction.count,
nb_accepted: Traitement.where(dossier: groupe.dossiers.accepte, processed_at: Time.zone.yesterday.beginning_of_day..Time.zone.yesterday.end_of_day).count,
nb_notification: nb_notification
}

View file

@ -28,7 +28,8 @@
state: dossier.state,
archived: dossier.archived,
dossier_is_followed: current_instructeur&.follow?(dossier),
close_to_expiration: dossier.close_to_expiration? }
close_to_expiration: dossier.close_to_expiration?,
hidden_by_administration: dossier.hidden_by_administration? }
.state-button

View file

@ -114,8 +114,7 @@
Lusager a supprimé son compte. Vous pouvez archiver puis supprimer le dossier.
%li
= link_to supprimer_dossier_instructeur_dossier_path(dossier.procedure, dossier), method: :patch, data: { confirm: "Voulez vous vraiment supprimer le dossier #{dossier.id} ? Cette action est irréversible. \nNous vous suggérons de télécharger le dossier au format PDF au préalable." } do
= link_to instructeur_dossier_path(dossier.procedure, dossier), method: :delete do
%span.icon.delete
.dropdown-description
%h4 Supprimer le dossier
Lusager sera notifié que son dossier est supprimé.

View file

@ -1,4 +1,7 @@
- if close_to_expiration || Dossier::TERMINE.include?(state)
- if hidden_by_administration
= link_to restore_instructeur_dossier_path(procedure_id, dossier_id), method: :patch, class: "button" do
= t('views.instructeurs.dossiers.restore')
- elsif close_to_expiration || Dossier::TERMINE.include?(state)
.dropdown.user-dossier-actions
%button.button.dropdown-button{ 'aria-expanded' => 'false', 'aria-controls' => 'actions-menu' }
Actions
@ -23,7 +26,7 @@
Archiver le dossier
%li.danger
= link_to supprimer_dossier_instructeur_dossier_path(procedure_id, dossier_id), method: :patch, data: { confirm: "Voulez vous vraiment supprimer le dossier #{dossier_id} ? Cette action est irréversible. \nNous vous suggérons de télécharger le dossier au format PDF au préalable." } do
= link_to instructeur_dossier_path(procedure_id, dossier_id), method: :delete do
%span.icon.delete
.dropdown-description
= t('views.instructeurs.dossiers.delete_dossier')

View file

@ -7,13 +7,21 @@
.procedure-logo{ style: "background-image: url(#{@procedure.logo_url})",
role: 'img', 'aria-label': "logo de la démarche #{@procedure.libelle}" }
= render partial: 'header', locals: { procedure: @procedure,
= render partial: 'header', locals: { procedure: @procedure, statut: @statut }
.procedure-actions
- if @can_download_dossiers
= render partial: "download_dossiers", locals: { procedure: @procedure, exports: @exports }
.container.flex= render partial: "tabs", locals: { procedure: @procedure,
statut: @statut,
a_suivre_count: @a_suivre_count,
suivis_count: @suivis_count,
traites_count: @traites_count,
tous_count: @tous_count,
supprimes_recemment_count: @supprimes_recemment_count,
archives_count: @archives_count,
expirant_count: @expirant_count,
has_en_cours_notifications: @has_en_cours_notifications,
has_termine_notifications: @has_termine_notifications }

View file

@ -12,6 +12,7 @@
.procedure-actions
- if @can_download_dossiers
= render partial: "download_dossiers", locals: { procedure: @procedure, exports: @exports }
.container.flex= render partial: "tabs", locals: { procedure: @procedure,
statut: @statut,
a_suivre_count: @a_suivre_count,
@ -116,36 +117,46 @@
- path = instructeur_dossier_path(@procedure, p.dossier_id)
%tr{ class: [p.hidden_by_user_at.present? && "file-hidden-by-user"] }
%td.folder-col
%a.cell-link{ href: path }
%span.icon.folder
- if @not_archived_notifications_dossier_ids.include?(p.dossier_id)
%span.notifications{ 'aria-label': 'notifications' }
- if p.hidden_by_administration_at.present?
%span.cell-link
%span.icon.folder
- else
%a.cell-link{ href: path }
%span.icon.folder
- if @not_archived_notifications_dossier_ids.include?(p.dossier_id)
%span.notifications{ 'aria-label': 'notifications' }
%td.number-col
%a.cell-link{ href: path }= p.dossier_id
- if p.hidden_by_administration_at.present?
%span.cell-link= p.dossier_id
- else
%a.cell-link{ href: path }= p.dossier_id
- p.columns.each do |column|
%td
%a.cell-link{ href: path }
= column
= "- #{t('views.instructeurs.dossiers.deleted_by_user')}" if p.hidden_by_user_at.present?
- if p.hidden_by_administration_at.present?
%span.cell-link
= column
= "- #{t('views.instructeurs.dossiers.deleted_by_user')}" if p.hidden_by_user_at.present?
- else
%a.cell-link{ href: path }
= column
= "- #{t('views.instructeurs.dossiers.deleted_by_user')}" if p.hidden_by_user_at.present?
%td.status-col
%a.cell-link{ href: path }= status_badge(p.state)
- if p.hidden_by_administration_at.present?
%span.cell-link= status_badge(p.state)
- else
%a.cell-link{ href: path }= status_badge(p.state)
- if @statut == 'supprimes_recemment'
%td.action-col.follow-col
= link_to restore_instructeur_dossier_path(@procedure, p.dossier_id), method: :patch, class: "button primary" do
= t('views.instructeurs.dossiers.restore')
- else
%td.action-col.follow-col= render partial: 'dossier_actions',
locals: { procedure_id: @procedure.id,
dossier_id: p.dossier_id,
state: p.state,
archived: p.archived,
dossier_is_followed: @followed_dossiers_id.include?(p.dossier_id),
close_to_expiration: @statut == 'expirant' }
%td.action-col.follow-col= render partial: 'dossier_actions',
locals: { procedure_id: @procedure.id,
dossier_id: p.dossier_id,
state: p.state,
archived: p.archived,
dossier_is_followed: @followed_dossiers_id.include?(p.dossier_id),
close_to_expiration: @statut == 'expirant',
hidden_by_administration: @statut == 'supprimes_recemment' }
= pagination
- else

View file

@ -93,7 +93,8 @@
state: p.state,
archived: p.archived,
dossier_is_followed: @followed_dossiers_id.include?(p.dossier_id),
close_to_expiration: nil }
close_to_expiration: nil,
hidden_by_administration: nil }
- else
%td

View file

@ -359,7 +359,7 @@ Rails.application.routes.draw do
get 'email_usagers'
post 'create_multiple_commentaire'
resources :dossiers, only: [:show], param: :dossier_id do
resources :dossiers, only: [:show, :destroy], param: :dossier_id do
member do
resources :commentaires, only: [:destroy]
post 'repousser-expiration' => 'dossiers#extend_conservation'
@ -375,7 +375,7 @@ Rails.application.routes.draw do
patch 'unfollow'
patch 'archive'
patch 'unarchive'
patch 'supprimer-dossier' => 'dossiers#delete_dossier'
patch 'restore'
patch 'annotations' => 'dossiers#update_annotations'
post 'commentaire' => 'dossiers#create_commentaire'
post 'passer-en-instruction' => 'dossiers#passer_en_instruction'
@ -386,7 +386,6 @@ Rails.application.routes.draw do
post 'avis' => 'dossiers#create_avis'
get 'print' => 'dossiers#print'
get 'telecharger_pjs' => 'dossiers#telecharger_pjs'
patch 'restore'
end
end

View file

@ -56,7 +56,7 @@ describe Instructeurs::DossiersController, type: :controller do
it { expect(instructeur.followed_dossiers).to match([dossier]) }
it { expect(flash.notice).to eq('Dossier suivi') }
it { expect(response).to redirect_to(instructeur_procedures_url) }
it { expect(response).to redirect_to(instructeur_procedure_path(dossier.procedure)) }
end
describe '#unfollow' do
@ -68,7 +68,7 @@ describe Instructeurs::DossiersController, type: :controller do
it { expect(instructeur.followed_dossiers).to match([]) }
it { expect(flash.notice).to eq("Vous ne suivez plus le dossier nº #{dossier.id}") }
it { expect(response).to redirect_to(instructeur_procedures_url) }
it { expect(response).to redirect_to(instructeur_procedure_path(dossier.procedure)) }
end
describe '#archive' do
@ -80,7 +80,7 @@ describe Instructeurs::DossiersController, type: :controller do
end
it { expect(dossier.archived).to be true }
it { expect(response).to redirect_to(instructeur_procedures_url) }
it { expect(response).to redirect_to(instructeur_procedure_path(dossier.procedure)) }
end
describe '#unarchive' do
@ -91,7 +91,7 @@ describe Instructeurs::DossiersController, type: :controller do
end
it { expect(dossier.archived).to be false }
it { expect(response).to redirect_to(instructeur_procedures_url) }
it { expect(response).to redirect_to(instructeur_procedure_path(dossier.procedure)) }
end
describe '#passer_en_instruction' do
@ -740,9 +740,9 @@ describe Instructeurs::DossiersController, type: :controller do
end
end
describe "#delete_dossier" do
describe "#destroy" do
subject do
patch :delete_dossier, params: {
delete :destroy, params: {
procedure_id: procedure.id,
dossier_id: dossier.id
}

View file

@ -70,9 +70,7 @@ describe 'Instructing a dossier:', js: true do
click_on procedure.libelle
click_on 'traité'
click_on 'Actions'
accept_confirm do
click_on 'Supprimer le dossier'
end
click_on 'Supprimer le dossier'
click_on 'traité'
expect(page).not_to have_button('Actions')
end