Merge pull request #9926 from adullact/feature-ouidou/dossier_message_component_instead_of_groupe_gestionnaire_commentaire_component
Tech: refactor groupe gestionnaire commentaire component into existing message component
This commit is contained in:
commit
d3ef2cae69
32 changed files with 331 additions and 340 deletions
|
@ -1,15 +1,16 @@
|
|||
class Dossiers::MessageComponent < ApplicationComponent
|
||||
def initialize(commentaire:, connected_user:, messagerie_seen_at: nil, show_reply_button: false)
|
||||
def initialize(commentaire:, connected_user:, messagerie_seen_at: nil, show_reply_button: false, groupe_gestionnaire: nil)
|
||||
@commentaire = commentaire
|
||||
@connected_user = connected_user
|
||||
@messagerie_seen_at = messagerie_seen_at
|
||||
@show_reply_button = show_reply_button
|
||||
@groupe_gestionnaire = groupe_gestionnaire
|
||||
end
|
||||
|
||||
attr_reader :commentaire, :connected_user, :messagerie_seen_at
|
||||
attr_reader :commentaire, :connected_user, :messagerie_seen_at, :groupe_gestionnaire
|
||||
|
||||
def correction_badge
|
||||
return if commentaire.dossier_correction.nil?
|
||||
return if groupe_gestionnaire || commentaire.dossier_correction.nil?
|
||||
return helpers.correction_resolved_badge if commentaire.dossier_correction.resolved?
|
||||
|
||||
helpers.pending_correction_badge(connected_user.is_a?(Instructeur) ? :for_instructeur : :for_user)
|
||||
|
@ -26,7 +27,7 @@ class Dossiers::MessageComponent < ApplicationComponent
|
|||
end
|
||||
|
||||
def delete_button_text
|
||||
if commentaire.dossier_correction&.pending?
|
||||
if groupe_gestionnaire.nil? && commentaire.dossier_correction&.pending?
|
||||
t('.delete_with_correction_button')
|
||||
else
|
||||
t('.delete_button')
|
||||
|
@ -60,13 +61,15 @@ class Dossiers::MessageComponent < ApplicationComponent
|
|||
t('.automatic_email')
|
||||
elsif commentaire.sent_by?(connected_user)
|
||||
t('.you')
|
||||
elsif groupe_gestionnaire
|
||||
commentaire.gestionnaire_id ? commentaire.gestionnaire_email : commentaire.sender_email
|
||||
else
|
||||
commentaire.redacted_email
|
||||
end
|
||||
end
|
||||
|
||||
def commentaire_from_guest?
|
||||
commentaire.dossier.invites.map(&:email).include?(commentaire.email)
|
||||
groupe_gestionnaire ? false : commentaire.dossier.invites.map(&:email).include?(commentaire.email)
|
||||
end
|
||||
|
||||
def commentaire_date
|
||||
|
@ -74,7 +77,11 @@ class Dossiers::MessageComponent < ApplicationComponent
|
|||
l(commentaire.created_at, format: is_current_year ? :message_date : :message_date_with_year)
|
||||
end
|
||||
|
||||
def delete_url
|
||||
groupe_gestionnaire ? gestionnaire_groupe_gestionnaire_commentaire_path(groupe_gestionnaire, commentaire) : instructeur_commentaire_path(commentaire.dossier.procedure, commentaire.dossier, commentaire)
|
||||
end
|
||||
|
||||
def highlight?
|
||||
commentaire.persisted? && @messagerie_seen_at&.<(commentaire.created_at)
|
||||
commentaire.persisted? && (messagerie_seen_at.nil? || messagerie_seen_at < commentaire.created_at)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -17,15 +17,15 @@
|
|||
- elsif commentaire.sent_by_system?
|
||||
= sanitize(commentaire.body, scrubber: Sanitizers::MailScrubber.new)
|
||||
- else
|
||||
= render SimpleFormatComponent.new(commentaire.body, allow_a: false, allow_autolink: commentaire.sent_by_instructeur?)
|
||||
= render SimpleFormatComponent.new(commentaire.body, allow_a: false, allow_autolink: groupe_gestionnaire.nil? && commentaire.sent_by_instructeur?)
|
||||
|
||||
|
||||
.message-extras.flex.justify-start
|
||||
- if soft_deletable?
|
||||
= button_to instructeur_commentaire_path(commentaire.dossier.procedure, commentaire.dossier, commentaire), method: :delete, class: 'fr-btn fr-btn--sm fr-btn--tertiary fr-icon-delete-line fr-btn--icon-left fr-text-default--warning', form: { data: { turbo: true, turbo_confirm: t('.confirm') } } do
|
||||
= button_to delete_url, method: :delete, class: 'fr-btn fr-btn--sm fr-btn--tertiary fr-icon-delete-line fr-btn--icon-left fr-text-default--warning', form: { data: { turbo: true, turbo_confirm: t('.confirm') } } do
|
||||
= delete_button_text
|
||||
|
||||
- if commentaire.piece_jointe.attached?
|
||||
- if groupe_gestionnaire.nil? && commentaire.piece_jointe.attached?
|
||||
.fr-ml-2w
|
||||
= render Attachment::ShowComponent.new(attachment: commentaire.piece_jointe.attachment, new_tab: true)
|
||||
|
||||
|
|
|
@ -10,11 +10,9 @@ class GroupeGestionnaire::Card::CommentairesComponent < ApplicationComponent
|
|||
if @administrateur
|
||||
@administrateur.commentaire_groupe_gestionnaires.size
|
||||
else
|
||||
commentaires = @groupe_gestionnaire.current_commentaires_groupe_and_children_commentaires_groupe
|
||||
if @groupe_gestionnaire.parent_id && !current_gestionnaire.groupe_gestionnaires.exists?(id: @groupe_gestionnaire.parent_id)
|
||||
commentaires = commentaires.or(CommentaireGroupeGestionnaire.where(groupe_gestionnaire_id: @groupe_gestionnaire.id, sender: current_gestionnaire))
|
||||
end
|
||||
commentaires.select(:sender_id, :sender_type).distinct.size
|
||||
@groupe_gestionnaire.gestionnaire_commentaires(current_gestionnaire)
|
||||
.select(:sender_id, :sender_type)
|
||||
.distinct.size
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -24,7 +24,7 @@ class GroupeGestionnaire::GroupeGestionnaireAdministrateurs::AdministrateurCompo
|
|||
end
|
||||
|
||||
def remove_button
|
||||
button_to 'Retirer',
|
||||
button_to "Retirer du groupe",
|
||||
remove_gestionnaire_groupe_gestionnaire_administrateur_path(@groupe_gestionnaire, @administrateur),
|
||||
method: :delete,
|
||||
class: 'fr-btn fr-btn--sm fr-btn--tertiary',
|
||||
|
@ -32,10 +32,10 @@ class GroupeGestionnaire::GroupeGestionnaireAdministrateurs::AdministrateurCompo
|
|||
end
|
||||
|
||||
def destroy_button
|
||||
button_to 'Supprimer',
|
||||
button_to "Révoquer l'accès administrateur",
|
||||
gestionnaire_groupe_gestionnaire_administrateur_path(@groupe_gestionnaire, @administrateur),
|
||||
method: :delete,
|
||||
class: 'fr-btn fr-btn--sm fr-btn--tertiary',
|
||||
form: { data: { turbo: true, turbo_confirm: "Supprimer « #{@administrateur.email} » en tant qu'administrateurs ?" } }
|
||||
form: { data: { turbo: true, turbo_confirm: "Supprimer « #{@administrateur.email} » en tant qu'administrateur ?" } }
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,41 +0,0 @@
|
|||
class GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent < ApplicationComponent
|
||||
include ApplicationHelper
|
||||
|
||||
def initialize(commentaire:, connected_user:, commentaire_seen_at: nil)
|
||||
@commentaire = commentaire
|
||||
@connected_user = connected_user
|
||||
@groupe_gestionnaire = commentaire.sender_type == "Administrateur" ? commentaire.groupe_gestionnaire : commentaire.groupe_gestionnaire.parent
|
||||
@commentaire_seen_at = commentaire_seen_at
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def highlight_if_unseen_class
|
||||
if highlight?
|
||||
'highlighted'
|
||||
end
|
||||
end
|
||||
|
||||
def scroll_to_target
|
||||
if highlight?
|
||||
{ scroll_to_target: 'to' }
|
||||
end
|
||||
end
|
||||
|
||||
def commentaire_issuer
|
||||
if @commentaire.sent_by?(@connected_user)
|
||||
t('.you')
|
||||
else
|
||||
@commentaire.gestionnaire_id ? @commentaire.gestionnaire_email : @commentaire.sender_email
|
||||
end
|
||||
end
|
||||
|
||||
def commentaire_date
|
||||
is_current_year = (@commentaire.created_at.year == Time.zone.today.year)
|
||||
l(@commentaire.created_at, format: is_current_year ? :message_date : :message_date_with_year)
|
||||
end
|
||||
|
||||
def highlight?
|
||||
@commentaire.persisted? && (@commentaire_seen_at.nil? || @commentaire_seen_at < @commentaire.created_at)
|
||||
end
|
||||
end
|
|
@ -1,7 +0,0 @@
|
|||
---
|
||||
en:
|
||||
reply: Reply
|
||||
delete_button: Delete this message
|
||||
confirm: Are you sure you want to delete this message ?
|
||||
you: You
|
||||
deleted_body: Message deleted
|
|
@ -1,7 +0,0 @@
|
|||
---
|
||||
fr:
|
||||
reply: Répondre
|
||||
delete_button: Supprimer le message
|
||||
confirm: Êtes-vous sûr de vouloir supprimer ce message ?
|
||||
you: Vous
|
||||
deleted_body: Message supprimé
|
|
@ -1,18 +0,0 @@
|
|||
.width-100
|
||||
%h2.fr-h6
|
||||
%span.mail
|
||||
= commentaire_issuer
|
||||
|
||||
%span.date{ class: ["fr-text--xs", "fr-text-mention--grey", "font-weight-normal", highlight_if_unseen_class], data: scroll_to_target }
|
||||
= commentaire_date
|
||||
.rich-text
|
||||
- if @commentaire.discarded?
|
||||
%p= t('.deleted_body')
|
||||
- else
|
||||
= render SimpleFormatComponent.new(@commentaire.body, allow_a: false)
|
||||
|
||||
.message-extras.flex.justify-start
|
||||
- if @commentaire.soft_deletable?(@connected_user)
|
||||
= button_to gestionnaire_groupe_gestionnaire_commentaire_path(@groupe_gestionnaire, @commentaire), method: :delete, class: 'button danger', form: { data: { turbo: true, turbo_confirm: t('.confirm') } } do
|
||||
%span.icon.delete
|
||||
= t('.delete_button')
|
|
@ -25,7 +25,7 @@ class GroupeGestionnaire::GroupeGestionnaireGestionnaires::GestionnaireComponent
|
|||
|
||||
def remove_button
|
||||
if is_there_at_least_another_active_admin? && @is_gestionnaire
|
||||
button_to 'Retirer',
|
||||
button_to 'Retirer du groupe',
|
||||
gestionnaire_groupe_gestionnaire_gestionnaire_path(@groupe_gestionnaire, @gestionnaire),
|
||||
method: :delete,
|
||||
class: 'fr-btn fr-btn--sm fr-btn--tertiary',
|
||||
|
|
|
@ -21,7 +21,11 @@ class GroupeGestionnaire::GroupeGestionnaireListCommentaires::CommentaireCompone
|
|||
def see_button
|
||||
link_to 'Voir',
|
||||
@commentaire.sender == current_gestionnaire ? parent_groupe_gestionnaire_gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire) : gestionnaire_groupe_gestionnaire_commentaire_path(@groupe_gestionnaire, @commentaire),
|
||||
class: 'fr-btn fr-btn--sm fr-btn--tertiary'
|
||||
class: 'fr-btn'
|
||||
end
|
||||
|
||||
def groupe_gestionnaire_name
|
||||
@commentaire.groupe_gestionnaire.name
|
||||
end
|
||||
|
||||
def highlight?
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
%tr{ id: dom_id(@commentaire) }
|
||||
%td
|
||||
= groupe_gestionnaire_name
|
||||
%td
|
||||
= email
|
||||
- if highlight?
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
= @parent.name
|
||||
= link_to @parent.name, gestionnaire_groupe_gestionnaire_path(@parent)
|
||||
- unless @children.empty?
|
||||
%ul
|
||||
- @children.each do |parent, children|
|
||||
|
|
|
@ -5,6 +5,10 @@ module Gestionnaires
|
|||
before_action :retrieve_last_parent_groupe_gestionnaire_commentaire, only: [:index, :parent_groupe_gestionnaire, :create_parent_groupe_gestionnaire]
|
||||
|
||||
def index
|
||||
@commentaires = @groupe_gestionnaire.gestionnaire_commentaires(current_gestionnaire)
|
||||
.select("sender_id, sender_type, sender_email, groupe_gestionnaire_id, MAX(id) as id, MAX(created_at) as created_at")
|
||||
.group(:sender_id, :sender_type, :sender_email, :groupe_gestionnaire_id)
|
||||
.order("MAX(id) DESC")
|
||||
end
|
||||
|
||||
def show
|
||||
|
|
|
@ -49,7 +49,7 @@ module Gestionnaires
|
|||
end
|
||||
|
||||
def destroy
|
||||
if !@groupe_gestionnaire.is_root? || @groupe_gestionnaire.gestionnaires.one?
|
||||
if @groupe_gestionnaire.is_root? && @groupe_gestionnaire.gestionnaires.one?
|
||||
flash[:alert] = I18n.t('groupe_gestionnaires.flash.alert.groupe_gestionnaire_gestionnaire.destroy_at_least_one')
|
||||
else
|
||||
@gestionnaire = Gestionnaire.find(params[:id])
|
||||
|
|
|
@ -46,7 +46,7 @@ module Manager
|
|||
|
||||
def remove_gestionnaire
|
||||
groupe_gestionnaire = GroupeGestionnaire.find(params[:id])
|
||||
if !groupe_gestionnaire.is_root? || groupe_gestionnaire.gestionnaires.one?
|
||||
if groupe_gestionnaire.is_root? && groupe_gestionnaire.gestionnaires.one?
|
||||
flash[:alert] = I18n.t('groupe_gestionnaires.flash.alert.groupe_gestionnaire_gestionnaire.destroy_at_least_one')
|
||||
else
|
||||
gestionnaire = Gestionnaire.find(params[:gestionnaire][:id])
|
||||
|
|
|
@ -20,6 +20,10 @@ class CommentaireGroupeGestionnaire < ApplicationRecord
|
|||
gestionnaire_id.present?
|
||||
end
|
||||
|
||||
def sent_by_system?
|
||||
false
|
||||
end
|
||||
|
||||
def sent_by?(someone)
|
||||
if gestionnaire
|
||||
someone == gestionnaire
|
||||
|
|
|
@ -35,4 +35,12 @@ class GroupeGestionnaire < ApplicationRecord
|
|||
end
|
||||
commentaires
|
||||
end
|
||||
|
||||
def gestionnaire_commentaires(gestionnaire)
|
||||
commentaires = self.current_commentaires_groupe_and_children_commentaires_groupe
|
||||
if self.parent_id && !gestionnaire.groupe_gestionnaires.exists?(id: self.parent_id)
|
||||
commentaires = commentaires.or(CommentaireGroupeGestionnaire.where(groupe_gestionnaire_id: self.id, sender: gestionnaire))
|
||||
end
|
||||
commentaires
|
||||
end
|
||||
end
|
||||
|
|
|
@ -9,5 +9,5 @@
|
|||
%ul.messages-list{ data: { controller: 'scroll-to' } }
|
||||
- current_administrateur.commentaire_groupe_gestionnaires.where(groupe_gestionnaire: @groupe_gestionnaire).each do |commentaire|
|
||||
%li.message{ class: commentaire_is_from_me_class(commentaire, current_administrateur), id: dom_id(commentaire) }
|
||||
= render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: commentaire, connected_user: current_administrateur, commentaire_seen_at: @commentaire_seen_at))
|
||||
= render partial: "shared/groupe_gestionnaires/commentaires/form", locals: { commentaire: @commentaire, form_url: admin_groupe_gestionnaire_create_commentaire_path }
|
||||
= render(Dossiers::MessageComponent.new(commentaire: commentaire, connected_user: current_administrateur, messagerie_seen_at: @commentaire_seen_at, groupe_gestionnaire: @groupe_gestionnaire))
|
||||
= render partial: "shared/dossiers/messages/form", locals: { commentaire: @commentaire, form_url: admin_groupe_gestionnaire_create_commentaire_path }
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
data: { turbo: true, turbo_force: :server } do |f|
|
||||
.fr-input-group
|
||||
= f.label :email, class: "fr-label" do
|
||||
Ajouter un groupe enfants
|
||||
Ajouter un groupe enfant
|
||||
%span.fr-hint-text
|
||||
= "Renseignez le nom du nouveau groupe enfants de « #{groupe_gestionnaire.name} »."
|
||||
= "Renseignez le nom du nouveau groupe enfant de « #{groupe_gestionnaire.name} »."
|
||||
|
||||
= f.text_field :name, required: true, class: "fr-input", autofocus: true
|
||||
|
||||
|
|
|
@ -7,16 +7,16 @@
|
|||
.container
|
||||
%h1 Gérer les groupes enfants de « #{@groupe_gestionnaire.name} »
|
||||
|
||||
.fr-mt-4w
|
||||
= link_to 'Afficher l’arborescence', tree_structure_gestionnaire_groupe_gestionnaire_path(@groupe_gestionnaire)
|
||||
|
||||
.fr-mt-4w
|
||||
= render 'add_child_form', groupe_gestionnaire: @groupe_gestionnaire
|
||||
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
%th= 'Nom'
|
||||
%th= 'Enregistré le'
|
||||
%tbody#children
|
||||
= render(GroupeGestionnaire::GroupeGestionnaireChildren::ChildComponent.with_collection(@groupe_gestionnaire.children, groupe_gestionnaire: @groupe_gestionnaire))
|
||||
|
||||
.fr-mt-4w
|
||||
= link_to 'Afficher l’arborescence', tree_structure_gestionnaire_groupe_gestionnaire_path(@groupe_gestionnaire)
|
||||
|
||||
.fr-mt-4w
|
||||
= render 'add_child_form', groupe_gestionnaire: @groupe_gestionnaire
|
||||
= render(GroupeGestionnaire::GroupeGestionnaireChildren::ChildComponent.with_collection(@groupe_gestionnaire.children.order(:name), groupe_gestionnaire: @groupe_gestionnaire))
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
- if @last_commentaire.discarded?
|
||||
= turbo_stream.update @last_commentaire do
|
||||
= render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: @last_commentaire, connected_user: current_gestionnaire, commentaire_seen_at: @commentaire_seen_at))
|
||||
= render(Dossiers::MessageComponent.new(commentaire: @last_commentaire, connected_user: current_gestionnaire, messagerie_seen_at: @commentaire_seen_at, groupe_gestionnaire: @groupe_gestionnaire))
|
||||
|
|
|
@ -6,20 +6,19 @@
|
|||
.container
|
||||
%h1 Messagerie de « #{@groupe_gestionnaire.name} »
|
||||
|
||||
%table.table
|
||||
%table.fr-table.width-100.mt-3
|
||||
%thead
|
||||
%tr
|
||||
%th= 'Groupe gestionnaire'
|
||||
%th= 'Adresse email'
|
||||
%th= 'Dernier message'
|
||||
%th
|
||||
%tbody#commentaires
|
||||
- commentaires = @groupe_gestionnaire.current_commentaires_groupe_and_children_commentaires_groupe
|
||||
- if @groupe_gestionnaire.parent_id && !current_gestionnaire.groupe_gestionnaires.where(id: @groupe_gestionnaire.parent_id).exists?
|
||||
- commentaires = commentaires.or(CommentaireGroupeGestionnaire.where(groupe_gestionnaire_id: @groupe_gestionnaire.id, sender: current_gestionnaire))
|
||||
= render(GroupeGestionnaire::GroupeGestionnaireListCommentaires::CommentaireComponent.with_collection(commentaires.select("sender_id, sender_type, sender_email, MAX(id) as id, MAX(created_at) as created_at").group(:sender_id, :sender_type, :sender_email).order("MAX(id) DESC"), groupe_gestionnaire: @groupe_gestionnaire))
|
||||
= render(GroupeGestionnaire::GroupeGestionnaireListCommentaires::CommentaireComponent.with_collection(@commentaires, groupe_gestionnaire: @groupe_gestionnaire))
|
||||
- if @groupe_gestionnaire.parent_id && !current_gestionnaire.groupe_gestionnaires.where(id: @groupe_gestionnaire.parent_id).exists? && @last_commentaire.nil?
|
||||
%tr
|
||||
%td= @groupe_gestionnaire.parent.name
|
||||
%td= "Messages avec le groupe gestionnaire parent (#{@groupe_gestionnaire.parent.name})"
|
||||
%td
|
||||
%td
|
||||
= link_to 'Voir', parent_groupe_gestionnaire_gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire), class: 'fr-btn fr-btn--sm fr-btn--tertiary'
|
||||
= link_to 'Voir', parent_groupe_gestionnaire_gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire), class: 'fr-btn'
|
||||
|
|
|
@ -11,5 +11,5 @@
|
|||
%ul.messages-list{ data: { controller: 'scroll-to' } }
|
||||
- commentaires.each do |commentaire|
|
||||
%li.message{ class: commentaire_is_from_me_class(commentaire, current_gestionnaire), id: dom_id(commentaire) }
|
||||
= render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: commentaire, connected_user: current_gestionnaire, commentaire_seen_at: @commentaire_seen_at))
|
||||
= render partial: "shared/groupe_gestionnaires/commentaires/form", locals: { commentaire: @commentaire, form_url: create_parent_groupe_gestionnaire_gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire) }
|
||||
= render(Dossiers::MessageComponent.new(commentaire: commentaire, connected_user: current_gestionnaire, messagerie_seen_at: @commentaire_seen_at, groupe_gestionnaire: @groupe_gestionnaire))
|
||||
= render partial: "shared/dossiers/messages/form", locals: { commentaire: @commentaire, form_url: create_parent_groupe_gestionnaire_gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire) }
|
||||
|
|
|
@ -10,6 +10,6 @@
|
|||
%ul.messages-list{ data: { controller: 'scroll-to' } }
|
||||
- @groupe_gestionnaire.current_commentaires_groupe_and_children_commentaires_groupe.where(sender_id: @last_commentaire.sender_id, sender_type: @last_commentaire.sender_type).each do |commentaire|
|
||||
%li.message{ class: commentaire_is_from_me_class(commentaire, current_gestionnaire), id: dom_id(commentaire) }
|
||||
= render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: commentaire, connected_user: current_gestionnaire, commentaire_seen_at: @commentaire_seen_at))
|
||||
= render(Dossiers::MessageComponent.new(commentaire: commentaire, connected_user: current_gestionnaire, messagerie_seen_at: @commentaire_seen_at, groupe_gestionnaire: @groupe_gestionnaire))
|
||||
- if @last_commentaire.sender
|
||||
= render partial: "shared/groupe_gestionnaires/commentaires/form", locals: { commentaire: @commentaire, form_url: gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire) }
|
||||
= render partial: "shared/dossiers/messages/form", locals: { commentaire: @commentaire, form_url: gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire), last_commentaire: @last_commentaire }
|
||||
|
|
|
@ -11,9 +11,17 @@
|
|||
%tr
|
||||
%th{ scope: "col" }
|
||||
Nom
|
||||
%th{ scope: "col" }
|
||||
Nombre de gestionnaires
|
||||
%th{ scope: "col" }
|
||||
Nombre d'administrateurs
|
||||
|
||||
%tbody
|
||||
- @groupe_gestionnaires.each do |groupe_gestionnaire|
|
||||
- @groupe_gestionnaires.order(:name).each do |groupe_gestionnaire|
|
||||
%tr
|
||||
%td
|
||||
= link_to groupe_gestionnaire.name, gestionnaire_groupe_gestionnaire_path(groupe_gestionnaire)
|
||||
%td
|
||||
= groupe_gestionnaire.gestionnaire_ids.size
|
||||
%td
|
||||
= groupe_gestionnaire.administrateur_ids.size
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
= t('views.gestionnaires.groupe_gestionnaires.delete')
|
||||
|
||||
.fr-container
|
||||
%h2= "Gestion du groupe gestionnaire \"#{@groupe_gestionnaire.name}\""
|
||||
%h2= "Gestion du groupe \"#{@groupe_gestionnaire.name}\""
|
||||
- if @groupe_gestionnaire.groupe_gestionnaire_id.present?
|
||||
%p
|
||||
groupe parent :
|
||||
|
|
|
@ -1,13 +1,15 @@
|
|||
= render NestedForms::FormOwnerComponent.new
|
||||
= form_for(commentaire, url: form_url, html: { multipart: true, data: { controller: 'persisted-form', persisted_form_key_value: dom_id(@dossier) } }) do |f|
|
||||
- dossier = commentaire.dossier
|
||||
= form_for(commentaire, url: form_url, html: { multipart: local_assigns.has_key?(:dossier), data: { controller: 'persisted-form', persisted_form_key_value: dom_id(local_assigns.fetch(:dossier, local_assigns.fetch(:last_commentaire, current_user))) } }) do |f|
|
||||
- placeholder = t('views.shared.dossiers.messages.form.write_message_to_administration_placeholder')
|
||||
- if instructeur_signed_in? || administrateur_signed_in? || expert_signed_in?
|
||||
- if local_assigns.has_key?(:last_commentaire)
|
||||
= f.hidden_field :last_commentaire, value: last_commentaire.id, name: :id
|
||||
- elsif local_assigns.has_key?(:dossier) && instructeur_signed_in? || administrateur_signed_in? || expert_signed_in?
|
||||
- placeholder = t('views.shared.dossiers.messages.form.write_message_placeholder')
|
||||
%p.mandatory-explanation= t('asterisk_html', scope: [:utils])
|
||||
|
||||
= render Dsfr::InputComponent.new(form: f, attribute: :body, input_type: :text_area, opts: { rows: 5, placeholder: placeholder, title: placeholder, class: 'fr-input message-textarea'})
|
||||
|
||||
- if local_assigns.has_key?(:dossier)
|
||||
.fr-mt-3w{ data: { controller: "file-input-reset" } }
|
||||
= render Attachment::EditComponent.new(attached_file: commentaire.piece_jointe)
|
||||
%button.hidden.fr-btn.fr-btn--tertiary-no-outline.fr-btn--icon-left.fr-icon-delete-line{ data: { 'file-input-reset-target': 'reset', action: 'file-input-reset#reset' } }
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
= render NestedForms::FormOwnerComponent.new
|
||||
= form_for(commentaire, url: form_url) do |f|
|
||||
- if @last_commentaire
|
||||
= f.hidden_field :last_commentaire, value: @last_commentaire.id, name: :id
|
||||
%p.mandatory-explanation= t('asterisk_html', scope: [:utils])
|
||||
|
||||
= render Dsfr::InputComponent.new(form: f, attribute: :body, input_type: :text_area, opts: { rows: 5, placeholder: t('views.gestionnaires.groupe_gestionnaires.messages.form.write_message_placeholder'), title: t('views.gestionnaires.groupe_gestionnaires.messages.form.write_message_placeholder'), class: 'fr-input message-textarea'})
|
||||
|
||||
.fr-mt-3w
|
||||
= f.submit t('views.gestionnaires.groupe_gestionnaires.messages.form.send_message'), class: 'fr-btn', data: { disable: true }
|
|
@ -358,10 +358,6 @@ en:
|
|||
gestionnaires:
|
||||
groupe_gestionnaires:
|
||||
delete: Delete
|
||||
messages:
|
||||
form:
|
||||
send_message: "Send message"
|
||||
write_message_placeholder: "Write your message here"
|
||||
instructeurs:
|
||||
dossiers:
|
||||
tab_steps:
|
||||
|
|
|
@ -360,10 +360,6 @@ fr:
|
|||
gestionnaires:
|
||||
groupe_gestionnaires:
|
||||
delete: Supprimer
|
||||
messages:
|
||||
form:
|
||||
send_message: "Envoyer le message"
|
||||
write_message_placeholder: "Écrivez votre message ici"
|
||||
instructeurs:
|
||||
dossiers:
|
||||
tab_steps:
|
||||
|
|
|
@ -4,14 +4,19 @@ RSpec.describe Dossiers::MessageComponent, type: :component do
|
|||
commentaire: commentaire,
|
||||
connected_user: connected_user,
|
||||
messagerie_seen_at: seen_at,
|
||||
show_reply_button: true
|
||||
show_reply_button: show_reply_button,
|
||||
groupe_gestionnaire: groupe_gestionnaire
|
||||
)
|
||||
end
|
||||
let(:dossier) { create(:dossier, :en_construction) }
|
||||
let(:commentaire) { create(:commentaire, dossier: dossier) }
|
||||
let(:connected_user) { dossier.user }
|
||||
let(:seen_at) { commentaire.created_at + 1.hour }
|
||||
|
||||
describe 'for dossier' do
|
||||
let(:connected_user) { dossier.user }
|
||||
let(:dossier) { create(:dossier, :en_construction) }
|
||||
let(:show_reply_button) { true }
|
||||
let(:commentaire) { create(:commentaire, dossier: dossier) }
|
||||
let(:groupe_gestionnaire) { nil }
|
||||
|
||||
subject { render_inline(component).to_html }
|
||||
|
||||
it { is_expected.to have_button("Répondre") }
|
||||
|
@ -188,3 +193,104 @@ RSpec.describe Dossiers::MessageComponent, type: :component do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'groupe_gestionnaire' do
|
||||
let(:show_reply_button) { false }
|
||||
let(:commentaire) { create(:commentaire_groupe_gestionnaire, sender: create(:administrateur)) }
|
||||
let(:groupe_gestionnaire) { commentaire.groupe_gestionnaire }
|
||||
let(:connected_user) { commentaire.sender }
|
||||
subject { render_inline(component).to_html }
|
||||
|
||||
it { is_expected.not_to have_button("Répondre") }
|
||||
|
||||
context 'escape <img> tag' do
|
||||
before { commentaire.update(body: '<img src="demarches-simplifiees.fr" />Hello') }
|
||||
it { is_expected.not_to have_selector('img[src="demarches-simplifiees.fr"]') }
|
||||
end
|
||||
|
||||
context 'with a seen_at after commentaire created_at' do
|
||||
let(:seen_at) { commentaire.created_at + 1.hour }
|
||||
|
||||
it { is_expected.not_to have_css(".highlighted") }
|
||||
end
|
||||
|
||||
context 'with a seen_at after commentaire created_at' do
|
||||
let(:seen_at) { commentaire.created_at - 1.hour }
|
||||
|
||||
it { is_expected.to have_css(".highlighted") }
|
||||
end
|
||||
|
||||
context 'with an gestionnaire message' do
|
||||
let(:gestionnaire) { create(:gestionnaire) }
|
||||
let(:commentaire) { create(:commentaire_groupe_gestionnaire, sender: create(:administrateur), gestionnaire: gestionnaire, body: 'Second message') }
|
||||
|
||||
it 'should display gestionnaire\'s email' do
|
||||
is_expected.to have_text(gestionnaire.email)
|
||||
end
|
||||
|
||||
describe 'delete message button for gestionnaire' do
|
||||
let(:connected_user) { gestionnaire }
|
||||
let(:form_url) { component.helpers.gestionnaire_groupe_gestionnaire_commentaire_path(groupe_gestionnaire, commentaire) }
|
||||
|
||||
context 'when commentaire had been written by connected gestionnaire' do
|
||||
it { is_expected.to have_selector("form[action=\"#{form_url}\"]") }
|
||||
end
|
||||
|
||||
context 'when commentaire had been written by connected gestionnaire and discarded' do
|
||||
let(:commentaire) { create(:commentaire_groupe_gestionnaire, sender: create(:administrateur), gestionnaire: gestionnaire, body: 'Second message', discarded_at: 2.days.ago) }
|
||||
|
||||
it { is_expected.not_to have_selector("form[action=\"#{form_url}\"]") }
|
||||
it { is_expected.to have_selector(".rich-text", text: component.t('.deleted_body')) }
|
||||
end
|
||||
|
||||
context 'on a procedure where commentaire had been written another gestionnaire' do
|
||||
let(:commentaire) { create(:commentaire_groupe_gestionnaire, sender: create(:administrateur), gestionnaire: create(:gestionnaire), body: 'Second message') }
|
||||
|
||||
it { is_expected.not_to have_selector("form[action=\"#{form_url}\"]") }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#commentaire_from_guest?' do
|
||||
subject { component.send(:commentaire_from_guest?) }
|
||||
|
||||
it { is_expected.to be false }
|
||||
end
|
||||
|
||||
describe '#commentaire_date' do
|
||||
let(:present_date) { Time.zone.local(2018, 9, 2, 10, 5, 0) }
|
||||
let(:creation_date) { present_date }
|
||||
let(:commentaire) do
|
||||
Timecop.freeze(creation_date) { create(:commentaire_groupe_gestionnaire, sender: create(:administrateur)) }
|
||||
end
|
||||
|
||||
subject do
|
||||
Timecop.freeze(present_date) { component.send(:commentaire_date) }
|
||||
end
|
||||
|
||||
it 'doesn’t include the creation year' do
|
||||
expect(subject).to eq 'le 2 septembre à 10 h 05'
|
||||
end
|
||||
|
||||
context 'when displaying a commentaire created on a previous year' do
|
||||
let(:creation_date) { present_date.prev_year }
|
||||
it 'includes the creation year' do
|
||||
expect(subject).to eq 'le 2 septembre 2017 à 10 h 05'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when formatting the first day of the month' do
|
||||
let(:present_date) { Time.zone.local(2018, 9, 1, 10, 5, 0) }
|
||||
it 'includes the ordinal' do
|
||||
expect(subject).to eq 'le 1er septembre à 10 h 05'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#correction_badge' do
|
||||
subject { component.send(:correction_badge) }
|
||||
|
||||
it { is_expected.to eq nil }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
RSpec.describe GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent, type: :component do
|
||||
let!(:component) do
|
||||
described_class.new(
|
||||
commentaire: commentaire,
|
||||
connected_user: connected_user
|
||||
)
|
||||
end
|
||||
let(:connected_user) { create(:administrateur) }
|
||||
let(:commentaire) { create(:commentaire_groupe_gestionnaire, sender: connected_user) }
|
||||
|
||||
subject { render_inline(component).to_html }
|
||||
|
||||
it do
|
||||
is_expected.to include("plop")
|
||||
is_expected.to include("Vous")
|
||||
end
|
||||
|
||||
describe '#commentaire_date' do
|
||||
let(:present_date) { Time.zone.local(2018, 9, 2, 10, 5, 0) }
|
||||
let(:creation_date) { present_date }
|
||||
let(:commentaire) do
|
||||
Timecop.freeze(creation_date) { create(:commentaire_groupe_gestionnaire, sender: connected_user) }
|
||||
end
|
||||
|
||||
subject do
|
||||
Timecop.freeze(present_date) { component.send(:commentaire_date) }
|
||||
end
|
||||
|
||||
it 'doesn’t include the creation year' do
|
||||
expect(subject).to eq 'le 2 septembre à 10 h 05'
|
||||
end
|
||||
|
||||
context 'when displaying a commentaire created on a previous year' do
|
||||
let(:creation_date) { present_date.prev_year }
|
||||
it 'includes the creation year' do
|
||||
expect(subject).to eq 'le 2 septembre 2017 à 10 h 05'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when formatting the first day of the month' do
|
||||
let(:present_date) { Time.zone.local(2018, 9, 1, 10, 5, 0) }
|
||||
it 'includes the ordinal' do
|
||||
expect(subject).to eq 'le 1er septembre à 10 h 05'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#commentaire_issuer' do
|
||||
let(:gestionnaire) { create(:gestionnaire) }
|
||||
let(:commentaire) { create(:commentaire_groupe_gestionnaire, sender: connected_user, gestionnaire: gestionnaire) }
|
||||
|
||||
subject { component.send(:commentaire_issuer) }
|
||||
|
||||
context 'issuer is connected_user' do
|
||||
it 'returns gestionnaire s email' do
|
||||
expect(subject).to eq gestionnaire.email
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue