feat: notify administrateur and gestionnaire by email when new commentaire + for administrateur highlight card and commentaires if any unread

This commit is contained in:
seb-by-ouidou 2023-11-06 13:55:31 +00:00 committed by seb-by-ouidou
parent 86fb28bda0
commit 46c19014f9
20 changed files with 159 additions and 34 deletions

View file

@ -25,7 +25,7 @@ class GroupeGestionnaire::GroupeGestionnaireListCommentaires::CommentaireCompone
end
def highlight?
commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @commentaire.sender)
commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @commentaire.sender_id, @commentaire.sender_type)
commentaire_seen_at.nil? || commentaire_seen_at < @commentaire.created_at
end
end

View file

@ -3,6 +3,7 @@ module Administrateurs
before_action :retrieve_groupe_gestionnaire, only: [:show, :administrateurs, :gestionnaires, :commentaires, :create_commentaire]
def show
@unread_commentaires = current_administrateur.unread_commentaires?
end
def administrateurs
@ -12,13 +13,20 @@ module Administrateurs
end
def commentaires
@commentaire_seen_at = current_administrateur.commentaire_seen_at
@commentaire = CommentaireGroupeGestionnaire.new
current_administrateur.mark_commentaire_as_seen
end
def create_commentaire
@commentaire = @groupe_gestionnaire.commentaire_groupe_gestionnaires.create(commentaire_params.merge(sender: current_administrateur))
if @commentaire.errors.empty?
commentaire_url = gestionnaire_groupe_gestionnaire_commentaire_url(@groupe_gestionnaire, @commentaire)
@groupe_gestionnaire.gestionnaires.each do |gestionnaire|
GroupeGestionnaireMailer.notify_new_commentaire_groupe_gestionnaire(@groupe_gestionnaire, @commentaire, @commentaire.sender_email, gestionnaire.email, commentaire_url).deliver_later
end
current_administrateur.mark_commentaire_as_seen
flash.notice = "Message envoyé"
redirect_to admin_groupe_gestionnaire_commentaires_path
else

View file

@ -7,16 +7,18 @@ module Gestionnaires
end
def show
@commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @last_commentaire.sender)
@commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type)
@commentaire = CommentaireGroupeGestionnaire.new
current_gestionnaire.mark_commentaire_as_seen(@groupe_gestionnaire, @last_commentaire.sender)
current_gestionnaire.mark_commentaire_as_seen(@groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type)
end
def create
@commentaire = @groupe_gestionnaire.commentaire_groupe_gestionnaires.create(commentaire_params.merge(sender: @last_commentaire.sender, gestionnaire: current_gestionnaire))
@commentaire = @groupe_gestionnaire.commentaire_groupe_gestionnaires.create(commentaire_params.merge(sender_id: @last_commentaire.sender_id, sender_type: @last_commentaire.sender_type, gestionnaire: current_gestionnaire))
if @commentaire.errors.empty?
GroupeGestionnaireMailer.notify_new_commentaire_groupe_gestionnaire(@groupe_gestionnaire, @commentaire, current_gestionnaire.email, @commentaire.sender_email, admin_groupe_gestionnaire_commentaires_path).deliver_later
flash.notice = "Message envoyé"
current_gestionnaire.mark_commentaire_as_seen(@groupe_gestionnaire, @commentaire.sender_id, @commentaire.sender_type)
redirect_to gestionnaire_groupe_gestionnaire_commentaire_path(@groupe_gestionnaire, @commentaire)
else
flash.alert = @commentaire.errors.full_messages
@ -27,6 +29,7 @@ module Gestionnaires
def destroy
if @last_commentaire.soft_deletable?(current_gestionnaire)
@last_commentaire.soft_delete!
@commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type)
flash.notice = t('.notice')
else

View file

@ -1,4 +1,5 @@
class GroupeGestionnaireMailer < ApplicationMailer
helper MailerHelper
layout 'mailers/layout'
def notify_removed_gestionnaire(groupe_gestionnaire, removed_gestionnaire_email, current_super_admin_email)
@ -37,6 +38,16 @@ class GroupeGestionnaireMailer < ApplicationMailer
mail(bcc: added_administrateur_emails, subject: subject)
end
def notify_new_commentaire_groupe_gestionnaire(groupe_gestionnaire, commentaire, sender_email, recipient_email, commentaire_url)
@groupe_gestionnaire = groupe_gestionnaire
@commentaire = commentaire
@sender_email = sender_email
@commentaire_url = commentaire_url
@subject = "Vous avez un nouveau message dans le groupe gestionnaire \"#{groupe_gestionnaire.name}\""
mail(to: recipient_email, subject: @subject)
end
def self.critical_email?(action_name)
false
end

View file

@ -145,4 +145,12 @@ class Administrateur < ApplicationRecord
# required to display feature flags field in manager
def features
end
def unread_commentaires?
commentaire_seen_at.nil? || commentaire_seen_at < commentaire_groupe_gestionnaires.last.created_at
end
def mark_commentaire_as_seen
update(commentaire_seen_at: Time.zone.now)
end
end

View file

@ -44,17 +44,17 @@ class Gestionnaire < ApplicationRecord
.exists?
end
def commentaire_seen_at(groupe_gestionnaire, sender)
def commentaire_seen_at(groupe_gestionnaire, sender_id, sender_type)
FollowCommentaireGroupeGestionnaire
.where(gestionnaire: self, groupe_gestionnaire:, sender:)
.where(gestionnaire: self, groupe_gestionnaire:, sender_id:, sender_type:)
.order(id: :desc)
.last
&.commentaire_seen_at
end
def mark_commentaire_as_seen(groupe_gestionnaire, sender)
def mark_commentaire_as_seen(groupe_gestionnaire, sender_id, sender_type)
FollowCommentaireGroupeGestionnaire
.where(gestionnaire: self, groupe_gestionnaire: groupe_gestionnaire, sender: sender, unfollowed_at: nil)
.where(gestionnaire: self, groupe_gestionnaire:, sender_id:, sender_type:, unfollowed_at: nil)
.first_or_initialize.update(commentaire_seen_at: Time.zone.now)
end
end

View file

@ -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, is_gestionnaire: false))
= render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: commentaire, connected_user: current_administrateur, is_gestionnaire: false, commentaire_seen_at: @commentaire_seen_at))
= render partial: "shared/groupe_gestionnaires/commentaires/form", locals: { commentaire: @commentaire, form_url: admin_groupe_gestionnaire_create_commentaire_path }

View file

@ -4,7 +4,7 @@
.fr-container
%h2= "Gestion du groupe gestionnaire \"#{@groupe_gestionnaire.name}\""
.fr-grid-row.fr-grid-row--gutters.fr-mb-5w
.fr-grid-row.fr-grid-row--gutters.fr-mb-5w.fr-groupe_gestionnaire_cards
= render GroupeGestionnaire::Card::GestionnairesComponent.new(groupe_gestionnaire: @groupe_gestionnaire, path: admin_groupe_gestionnaire_gestionnaires_path, is_gestionnaire: false)
= render GroupeGestionnaire::Card::AdministrateursComponent.new(groupe_gestionnaire: @groupe_gestionnaire, path: admin_groupe_gestionnaire_administrateurs_path, is_gestionnaire: false)
= render GroupeGestionnaire::Card::CommentairesComponent.new(groupe_gestionnaire: @groupe_gestionnaire, administrateur: current_administrateur, path: admin_groupe_gestionnaire_commentaires_path)
= render GroupeGestionnaire::Card::CommentairesComponent.new(groupe_gestionnaire: @groupe_gestionnaire, administrateur: current_administrateur, path: admin_groupe_gestionnaire_commentaires_path, unread_commentaires: @unread_commentaires)

View file

@ -1,8 +0,0 @@
.fr-container
%nav#header-navigation.fr-nav{ role: 'navigation', 'aria-label': 'Menu principal administrateur' }
%ul.fr-nav__list
%li.fr-nav__item= link_to 'Mes démarches', admin_procedures_path, class:'fr-nav__link', 'aria-current': current_page?(controller: 'procedures', action: :index) ? 'true' : nil
- if Rails.application.config.ds_zonage_enabled
%li.fr-nav__item= link_to 'Toutes les démarches', all_admin_procedures_path(zone_ids: current_administrateur.zones), class:'fr-nav__link', 'aria-current': current_page?(all_admin_procedures_path) ? 'page' : nil
- if current_administrateur.groupe_gestionnaire_id
%li.fr-nav__item= link_to 'Mon groupe gestionnaire', admin_groupe_gestionnaire_path, class:'fr-nav__link', 'aria-current': current_page?(admin_groupe_gestionnaire_path) ? 'page' : nil

View file

@ -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))
= render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: @last_commentaire, connected_user: current_gestionnaire, commentaire_seen_at: @commentaire_seen_at))

View file

@ -0,0 +1,12 @@
- content_for(:title, "#{@subject}")
%p= t(:hello, scope: [:views, :shared, :greetings])
%p
= t('.body', groupe_gestionnaire_name: @groupe_gestionnaire.name, sender_email: @sender_email)
%p= round_button("consulter le message", @commentaire_url, :primary)
= render partial: "layouts/mailers/signature"
- content_for :footer do
= render 'layouts/mailers/commentaire_groupe_gestionnaire_footer'

View file

@ -0,0 +1,2 @@
%strong
= t('.do_not_reply_html', application_name: APPLICATION_NAME, sender_email: @sender_email)