diff --git a/app/components/dossiers/message_component.rb b/app/components/dossiers/message_component.rb
index 66881bd73..a67c72e44 100644
--- a/app/components/dossiers/message_component.rb
+++ b/app/components/dossiers/message_component.rb
@@ -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
diff --git a/app/components/dossiers/message_component/message_component.html.haml b/app/components/dossiers/message_component/message_component.html.haml
index 3fb7feffb..1f944d151 100644
--- a/app/components/dossiers/message_component/message_component.html.haml
+++ b/app/components/dossiers/message_component/message_component.html.haml
@@ -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)
diff --git a/app/components/groupe_gestionnaire/card/commentaires_component.rb b/app/components/groupe_gestionnaire/card/commentaires_component.rb
index 66b1b2a94..c3bbb7434 100644
--- a/app/components/groupe_gestionnaire/card/commentaires_component.rb
+++ b/app/components/groupe_gestionnaire/card/commentaires_component.rb
@@ -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
diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_administrateurs/administrateur_component.rb b/app/components/groupe_gestionnaire/groupe_gestionnaire_administrateurs/administrateur_component.rb
index fb152010a..456f0f910 100644
--- a/app/components/groupe_gestionnaire/groupe_gestionnaire_administrateurs/administrateur_component.rb
+++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_administrateurs/administrateur_component.rb
@@ -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
diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component.rb b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component.rb
deleted file mode 100644
index 54c0cd4dd..000000000
--- a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component.rb
+++ /dev/null
@@ -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
diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.en.yml b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.en.yml
deleted file mode 100644
index ea11da268..000000000
--- a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.en.yml
+++ /dev/null
@@ -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
diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.fr.yml b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.fr.yml
deleted file mode 100644
index 15cfb0601..000000000
--- a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.fr.yml
+++ /dev/null
@@ -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é
diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.html.haml b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.html.haml
deleted file mode 100644
index 537f2b0a1..000000000
--- a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.html.haml
+++ /dev/null
@@ -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')
diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_gestionnaires/gestionnaire_component.rb b/app/components/groupe_gestionnaire/groupe_gestionnaire_gestionnaires/gestionnaire_component.rb
index 957b9ea35..a1c5ba7b5 100644
--- a/app/components/groupe_gestionnaire/groupe_gestionnaire_gestionnaires/gestionnaire_component.rb
+++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_gestionnaires/gestionnaire_component.rb
@@ -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',
diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb b/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb
index 6d470f863..8663300c2 100644
--- a/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb
+++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb
@@ -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?
diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component/commentaire_component.html.haml b/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component/commentaire_component.html.haml
index e776d1b85..8e8a5ee4c 100644
--- a/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component/commentaire_component.html.haml
+++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component/commentaire_component.html.haml
@@ -1,4 +1,6 @@
%tr{ id: dom_id(@commentaire) }
+ %td
+ = groupe_gestionnaire_name
%td
= email
- if highlight?
diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component/tree_structure_component.html.haml b/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component/tree_structure_component.html.haml
index 34f787bb9..6ced2aea0 100644
--- a/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component/tree_structure_component.html.haml
+++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component/tree_structure_component.html.haml
@@ -1,4 +1,4 @@
-= @parent.name
+= link_to @parent.name, gestionnaire_groupe_gestionnaire_path(@parent)
- unless @children.empty?
%ul
- @children.each do |parent, children|
diff --git a/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb b/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb
index 9dbb99855..219cb6f08 100644
--- a/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb
+++ b/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb
@@ -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
diff --git a/app/controllers/gestionnaires/groupe_gestionnaire_gestionnaires_controller.rb b/app/controllers/gestionnaires/groupe_gestionnaire_gestionnaires_controller.rb
index dc129140e..bf7ba9fb9 100644
--- a/app/controllers/gestionnaires/groupe_gestionnaire_gestionnaires_controller.rb
+++ b/app/controllers/gestionnaires/groupe_gestionnaire_gestionnaires_controller.rb
@@ -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])
diff --git a/app/controllers/manager/groupe_gestionnaires_controller.rb b/app/controllers/manager/groupe_gestionnaires_controller.rb
index 1bc4922aa..66bdc82db 100644
--- a/app/controllers/manager/groupe_gestionnaires_controller.rb
+++ b/app/controllers/manager/groupe_gestionnaires_controller.rb
@@ -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])
diff --git a/app/models/commentaire_groupe_gestionnaire.rb b/app/models/commentaire_groupe_gestionnaire.rb
index f7182bf53..f6602bef9 100644
--- a/app/models/commentaire_groupe_gestionnaire.rb
+++ b/app/models/commentaire_groupe_gestionnaire.rb
@@ -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
diff --git a/app/models/groupe_gestionnaire.rb b/app/models/groupe_gestionnaire.rb
index 0e9f280c0..f9f521da0 100644
--- a/app/models/groupe_gestionnaire.rb
+++ b/app/models/groupe_gestionnaire.rb
@@ -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
diff --git a/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml b/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml
index 2ec38ef65..a43440979 100644
--- a/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml
+++ b/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml
@@ -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 }
diff --git a/app/views/gestionnaires/groupe_gestionnaire_children/_add_child_form.html.haml b/app/views/gestionnaires/groupe_gestionnaire_children/_add_child_form.html.haml
index 335d221a4..efd79fb3e 100644
--- a/app/views/gestionnaires/groupe_gestionnaire_children/_add_child_form.html.haml
+++ b/app/views/gestionnaires/groupe_gestionnaire_children/_add_child_form.html.haml
@@ -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
diff --git a/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml b/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml
index fc2428b28..332c1f96e 100644
--- a/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml
+++ b/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml
@@ -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))
diff --git a/app/views/gestionnaires/groupe_gestionnaire_commentaires/destroy.turbo_stream.haml b/app/views/gestionnaires/groupe_gestionnaire_commentaires/destroy.turbo_stream.haml
index 96c22e9e3..74a655186 100644
--- a/app/views/gestionnaires/groupe_gestionnaire_commentaires/destroy.turbo_stream.haml
+++ b/app/views/gestionnaires/groupe_gestionnaire_commentaires/destroy.turbo_stream.haml
@@ -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))
diff --git a/app/views/gestionnaires/groupe_gestionnaire_commentaires/index.html.haml b/app/views/gestionnaires/groupe_gestionnaire_commentaires/index.html.haml
index be880cea7..25eb42ebe 100644
--- a/app/views/gestionnaires/groupe_gestionnaire_commentaires/index.html.haml
+++ b/app/views/gestionnaires/groupe_gestionnaire_commentaires/index.html.haml
@@ -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'
diff --git a/app/views/gestionnaires/groupe_gestionnaire_commentaires/parent_groupe_gestionnaire.haml b/app/views/gestionnaires/groupe_gestionnaire_commentaires/parent_groupe_gestionnaire.haml
index 6c0b8cd2b..d27c11bc7 100644
--- a/app/views/gestionnaires/groupe_gestionnaire_commentaires/parent_groupe_gestionnaire.haml
+++ b/app/views/gestionnaires/groupe_gestionnaire_commentaires/parent_groupe_gestionnaire.haml
@@ -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) }
diff --git a/app/views/gestionnaires/groupe_gestionnaire_commentaires/show.html.haml b/app/views/gestionnaires/groupe_gestionnaire_commentaires/show.html.haml
index 35eef1207..c78aa3aaf 100644
--- a/app/views/gestionnaires/groupe_gestionnaire_commentaires/show.html.haml
+++ b/app/views/gestionnaires/groupe_gestionnaire_commentaires/show.html.haml
@@ -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 }
diff --git a/app/views/gestionnaires/groupe_gestionnaires/index.html.haml b/app/views/gestionnaires/groupe_gestionnaires/index.html.haml
index 90a8cfdbb..e84f2e1d4 100644
--- a/app/views/gestionnaires/groupe_gestionnaires/index.html.haml
+++ b/app/views/gestionnaires/groupe_gestionnaires/index.html.haml
@@ -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
diff --git a/app/views/gestionnaires/groupe_gestionnaires/show.html.haml b/app/views/gestionnaires/groupe_gestionnaires/show.html.haml
index 1fa8d87b9..065646d1f 100644
--- a/app/views/gestionnaires/groupe_gestionnaires/show.html.haml
+++ b/app/views/gestionnaires/groupe_gestionnaires/show.html.haml
@@ -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 :
diff --git a/app/views/shared/dossiers/messages/_form.html.haml b/app/views/shared/dossiers/messages/_form.html.haml
index b831092ef..f36c6c434 100644
--- a/app/views/shared/dossiers/messages/_form.html.haml
+++ b/app/views/shared/dossiers/messages/_form.html.haml
@@ -1,17 +1,19 @@
= 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'})
- .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' } }
- = t('views.shared.messages.remove_file')
+ - 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' } }
+ = t('views.shared.messages.remove_file')
.fr-mt-3w
= f.submit t('views.shared.dossiers.messages.form.send_message'), class: 'fr-btn', data: { disable: true }
diff --git a/app/views/shared/groupe_gestionnaires/commentaires/_form.html.haml b/app/views/shared/groupe_gestionnaires/commentaires/_form.html.haml
deleted file mode 100644
index f90764094..000000000
--- a/app/views/shared/groupe_gestionnaires/commentaires/_form.html.haml
+++ /dev/null
@@ -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 }
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 9f06600b3..e4ba5db91 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -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:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index c32ff20a9..1a671e312 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -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:
diff --git a/spec/components/dossiers/message_component_spec.rb b/spec/components/dossiers/message_component_spec.rb
index cb280fcfd..01e5dfe3d 100644
--- a/spec/components/dossiers/message_component_spec.rb
+++ b/spec/components/dossiers/message_component_spec.rb
@@ -4,187 +4,293 @@ 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 }
- subject { render_inline(component).to_html }
+ 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 }
- it { is_expected.to have_button("Répondre") }
+ subject { render_inline(component).to_html }
- context 'escape tag' do
- before { commentaire.update(body: 'Hello') }
- it { is_expected.not_to have_selector('img[src="demarches-simplifiees.fr"]') }
- end
+ it { is_expected.to have_button("Répondre") }
- 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 instructeur message' do
- let(:instructeur) { create(:instructeur) }
- let(:procedure) { create(:procedure) }
- let(:commentaire) { create(:commentaire, instructeur: instructeur, body: 'Second message') }
- let(:dossier) { create(:dossier, :en_construction, commentaires: [commentaire], procedure: procedure) }
-
- context 'on a procedure with anonymous instructeurs' do
- before { Flipper.enable(:hide_instructeur_email, procedure) }
-
- context 'redacts the instructeur email' do
- it { is_expected.to have_text(commentaire.body) }
- it { is_expected.to have_text("Instructeur n° #{instructeur.id}") }
- it { is_expected.not_to have_text(instructeur.email) }
- end
+ context 'escape tag' do
+ before { commentaire.update(body: 'Hello') }
+ it { is_expected.not_to have_selector('img[src="demarches-simplifiees.fr"]') }
end
- context 'on a procedure where instructeurs names are not redacted' do
- before { Flipper.disable(:hide_instructeur_email, procedure) }
+ context 'with a seen_at after commentaire created_at' do
+ let(:seen_at) { commentaire.created_at + 1.hour }
- context 'redacts the instructeur email but keeps the name' do
- it { is_expected.to have_text(commentaire.body) }
- it { is_expected.to have_text(instructeur.email.split('@').first) }
- it { is_expected.not_to have_text(instructeur.email) }
- end
+ it { is_expected.not_to have_css(".highlighted") }
end
- describe 'delete message button for instructeur' do
+ 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 instructeur message' do
let(:instructeur) { create(:instructeur) }
let(:procedure) { create(:procedure) }
+ let(:commentaire) { create(:commentaire, instructeur: instructeur, body: 'Second message') }
let(:dossier) { create(:dossier, :en_construction, commentaires: [commentaire], procedure: procedure) }
- let(:connected_user) { instructeur }
- let(:form_url) { component.helpers.instructeur_commentaire_path(commentaire.dossier.procedure, commentaire.dossier, commentaire) }
- context 'on a procedure where commentaire had been written by connected instructeur' do
- let(:commentaire) { create(:commentaire, instructeur: instructeur, body: 'Second message') }
+ context 'on a procedure with anonymous instructeurs' do
+ before { Flipper.enable(:hide_instructeur_email, procedure) }
- it do
- is_expected.to have_selector("form[action=\"#{form_url}\"]")
- is_expected.to have_button(component.t('.delete_button'))
+ context 'redacts the instructeur email' do
+ it { is_expected.to have_text(commentaire.body) }
+ it { is_expected.to have_text("Instructeur n° #{instructeur.id}") }
+ it { is_expected.not_to have_text(instructeur.email) }
end
end
- context 'on a procedure where commentaire had been written by connected instructeur and discarded' do
- let(:commentaire) { create(:commentaire, instructeur: instructeur, body: 'Second message', discarded_at: 2.days.ago) }
+ context 'on a procedure where instructeurs names are not redacted' do
+ before { Flipper.disable(:hide_instructeur_email, procedure) }
- it { is_expected.not_to have_selector("form[action=\"#{form_url}\"]") }
- it { is_expected.to have_selector(".rich-text", text: component.t('.deleted_body')) }
+ context 'redacts the instructeur email but keeps the name' do
+ it { is_expected.to have_text(commentaire.body) }
+ it { is_expected.to have_text(instructeur.email.split('@').first) }
+ it { is_expected.not_to have_text(instructeur.email) }
+ end
end
- context 'on a procedure where commentaire had been written by connected an user' do
- let(:commentaire) { create(:commentaire, email: create(:user).email, body: 'Second message') }
+ describe 'delete message button for instructeur' do
+ let(:instructeur) { create(:instructeur) }
+ let(:procedure) { create(:procedure) }
+ let(:dossier) { create(:dossier, :en_construction, commentaires: [commentaire], procedure: procedure) }
+ let(:connected_user) { instructeur }
+ let(:form_url) { component.helpers.instructeur_commentaire_path(commentaire.dossier.procedure, commentaire.dossier, commentaire) }
- it { is_expected.not_to have_selector("form[action=\"#{form_url}\"]") }
+ context 'on a procedure where commentaire had been written by connected instructeur' do
+ let(:commentaire) { create(:commentaire, instructeur: instructeur, body: 'Second message') }
+
+ it do
+ is_expected.to have_selector("form[action=\"#{form_url}\"]")
+ is_expected.to have_button(component.t('.delete_button'))
+ end
+ end
+
+ context 'on a procedure where commentaire had been written by connected instructeur and discarded' do
+ let(:commentaire) { create(:commentaire, instructeur: instructeur, 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 by connected an user' do
+ let(:commentaire) { create(:commentaire, email: create(:user).email, body: 'Second message') }
+
+ it { is_expected.not_to have_selector("form[action=\"#{form_url}\"]") }
+ end
+
+ context 'on a procedure where commentaire had been written by connected an expert' do
+ let(:commentaire) { create(:commentaire, expert: create(:expert), body: 'Second message') }
+
+ it { is_expected.not_to have_selector("form[action=\"#{form_url}\"]") }
+ end
+
+ context 'on a procedure where commentaire had been written another instructeur' do
+ let(:commentaire) { create(:commentaire, instructeur: create(:instructeur), body: 'Second message') }
+
+ it { is_expected.not_to have_selector("form[action=\"#{form_url}\"]") }
+ end
+
+ context 'when commentaire is a correction' do
+ let(:commentaire) { create(:commentaire, instructeur:, body: 'Please fix this') }
+ before { create(:dossier_correction, commentaire:, dossier:) }
+
+ it { is_expected.to have_button(component.t('.delete_with_correction_button')) }
+ end
end
- context 'on a procedure where commentaire had been written by connected an expert' do
- let(:commentaire) { create(:commentaire, expert: create(:expert), body: 'Second message') }
-
- it { is_expected.not_to have_selector("form[action=\"#{form_url}\"]") }
- end
-
- context 'on a procedure where commentaire had been written another instructeur' do
- let(:commentaire) { create(:commentaire, instructeur: create(:instructeur), body: 'Second message') }
-
- it { is_expected.not_to have_selector("form[action=\"#{form_url}\"]") }
- end
-
- context 'when commentaire is a correction' do
- let(:commentaire) { create(:commentaire, instructeur:, body: 'Please fix this') }
- before { create(:dossier_correction, commentaire:, dossier:) }
-
- it { is_expected.to have_button(component.t('.delete_with_correction_button')) }
+ describe 'autolink simple urls' do
+ let(:commentaire) { create(:commentaire, instructeur: instructeur, body: "rdv sur https://demarches.gouv.fr") }
+ it { is_expected.to have_link("https://demarches.gouv.fr", href: "https://demarches.gouv.fr") }
end
end
- describe 'autolink simple urls' do
- let(:commentaire) { create(:commentaire, instructeur: instructeur, body: "rdv sur https://demarches.gouv.fr") }
- it { is_expected.to have_link("https://demarches.gouv.fr", href: "https://demarches.gouv.fr") }
+ describe '#commentaire_from_guest?' do
+ let!(:guest) { create(:invite, dossier: dossier) }
+
+ subject { component.send(:commentaire_from_guest?) }
+
+ context 'when the commentaire sender is not a guest' do
+ let(:commentaire) { create(:commentaire, dossier: dossier, email: "michel@pref.fr") }
+ it { is_expected.to be false }
+ end
+
+ context 'when the commentaire sender is a guest on this dossier' do
+ let(:commentaire) { create(:commentaire, dossier: dossier, email: guest.email) }
+ it { is_expected.to be true }
+ end
+ 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, email: "michel@pref.fr") }
+ 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
+ let(:resolved_at) { nil }
+
+ before do
+ create(:dossier_correction, commentaire:, dossier:, resolved_at:)
+ end
+
+ it 'returns a badge à corriger' do
+ expect(subject).to have_text('à corriger')
+ end
+
+ context 'connected as instructeur' do
+ let(:connected_user) { create(:instructeur) }
+
+ it 'returns a badge en attente' do
+ expect(subject).to have_text('en attente')
+ end
+ end
+
+ context 'when the correction is resolved' do
+ let(:resolved_at) { 1.minute.ago }
+
+ it 'returns a badge corrigé' do
+ expect(subject).to have_text("corrigé")
+ end
+ end
end
end
- describe '#commentaire_from_guest?' do
- let!(:guest) { create(:invite, dossier: dossier) }
+ 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 }
- subject { component.send(:commentaire_from_guest?) }
+ it { is_expected.not_to have_button("Répondre") }
+
+ context 'escape tag' do
+ before { commentaire.update(body: '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?) }
- context 'when the commentaire sender is not a guest' do
- let(:commentaire) { create(:commentaire, dossier: dossier, email: "michel@pref.fr") }
it { is_expected.to be false }
end
- context 'when the commentaire sender is a guest on this dossier' do
- let(:commentaire) { create(:commentaire, dossier: dossier, email: guest.email) }
- it { is_expected.to be true }
- end
- 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
- 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, email: "michel@pref.fr") }
- end
+ subject do
+ Timecop.freeze(present_date) { component.send(:commentaire_date) }
+ 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
- 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 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'
+ 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
- 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) }
- describe '#correction_badge' do
- let(:resolved_at) { nil }
-
- before do
- create(:dossier_correction, commentaire:, dossier:, resolved_at:)
- end
-
- it 'returns a badge à corriger' do
- expect(subject).to have_text('à corriger')
- end
-
- context 'connected as instructeur' do
- let(:connected_user) { create(:instructeur) }
-
- it 'returns a badge en attente' do
- expect(subject).to have_text('en attente')
- end
- end
-
- context 'when the correction is resolved' do
- let(:resolved_at) { 1.minute.ago }
-
- it 'returns a badge corrigé' do
- expect(subject).to have_text("corrigé")
- end
+ it { is_expected.to eq nil }
end
end
end
diff --git a/spec/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component_spec.rb b/spec/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component_spec.rb
deleted file mode 100644
index 57f163cb9..000000000
--- a/spec/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component_spec.rb
+++ /dev/null
@@ -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