From 9ddd55d5cd013b77db5fe3b4955f9f58623fbe9b Mon Sep 17 00:00:00 2001 From: seb-by-ouidou Date: Sun, 10 Dec 2023 17:25:58 +0000 Subject: [PATCH] feat: remove commentaire_component and replace it by message_component + replace commentaires/_form by messages/_form + few fixes --- app/components/dossiers/message_component.rb | 19 +- .../message_component.html.haml | 6 +- .../card/commentaires_component.rb | 8 +- .../administrateur_component.rb | 6 +- .../commentaire_component.rb | 41 -- .../commentaire_component.en.yml | 7 - .../commentaire_component.fr.yml | 7 - .../commentaire_component.html.haml | 18 - .../gestionnaire_component.rb | 2 +- .../commentaire_component.rb | 6 +- .../commentaire_component.html.haml | 2 + .../tree_structure_component.html.haml | 2 +- ...pe_gestionnaire_commentaires_controller.rb | 4 + ...e_gestionnaire_gestionnaires_controller.rb | 2 +- .../groupe_gestionnaires_controller.rb | 2 +- app/models/commentaire_groupe_gestionnaire.rb | 4 + app/models/groupe_gestionnaire.rb | 8 + .../commentaires.html.haml | 4 +- .../_add_child_form.html.haml | 4 +- .../index.html.haml | 14 +- .../destroy.turbo_stream.haml | 2 +- .../index.html.haml | 11 +- .../parent_groupe_gestionnaire.haml | 4 +- .../show.html.haml | 4 +- .../groupe_gestionnaires/index.html.haml | 10 +- .../groupe_gestionnaires/show.html.haml | 2 +- .../shared/dossiers/messages/_form.html.haml | 16 +- .../commentaires/_form.html.haml | 10 - config/locales/en.yml | 4 - config/locales/fr.yml | 4 - .../dossiers/message_component_spec.rb | 378 +++++++++++------- .../commentaire_component_spec.rb | 60 --- 32 files changed, 331 insertions(+), 340 deletions(-) delete mode 100644 app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component.rb delete mode 100644 app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.en.yml delete mode 100644 app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.fr.yml delete mode 100644 app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.html.haml delete mode 100644 app/views/shared/groupe_gestionnaires/commentaires/_form.html.haml delete mode 100644 spec/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component_spec.rb 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