Add Preview Pending action to Admin System Emails

Some system emails need to be manually reviewed before being sent. This
new action allows admins to see a preview of all Pending to be sent
Proposal Notification Digest messages.
This commit is contained in:
Bertocq
2018-04-18 16:12:38 +02:00
committed by decabeza
parent 5c726e0949
commit eb0919d978
8 changed files with 123 additions and 10 deletions

View File

@@ -1,9 +1,11 @@
class Admin::SystemEmailsController < Admin::BaseController class Admin::SystemEmailsController < Admin::BaseController
before_action :load_system_email, only: [:view] before_action :load_system_email, only: [:view, :preview_pending]
def index def index
@system_emails = %w(proposal_notification_digest) @system_emails = {
proposal_notification_digest: %w(view preview_pending)
}
end end
def view def view
@@ -14,9 +16,22 @@ class Admin::SystemEmailsController < Admin::BaseController
end end
end end
def preview_pending
case @system_email
when "proposal_notification_digest"
@previews = ProposalNotification.where(id: unsent_proposal_notifications_ids)
.page(params[:page])
end
end
private private
def load_system_email def load_system_email
@system_email = params[:system_email_id] @system_email = params[:system_email_id]
end end
def unsent_proposal_notifications_ids
Notification.where(notifiable_type: "ProposalNotification", emailed_at: nil)
.group(:notifiable_id).count.keys
end
end end

View File

@@ -9,17 +9,24 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<% @system_emails.each do |system_email| %> <% @system_emails.each do |system_email_title, system_email_actions| %>
<tr id="<%= system_email %>" class="system_email"> <tr id="<%= system_email_title %>" class="system_email">
<td> <td>
<%= t("admin.system_emails.#{system_email}.title") %> <%= t("admin.system_emails.#{system_email_title}.title") %>
</td> </td>
<td> <td>
<%= t("admin.system_emails.#{system_email}.description") %> <%= t("admin.system_emails.#{system_email_title}.description") %>
</td> </td>
<td class="text-right"> <td class="text-right">
<%= link_to t("admin.shared.view"), admin_system_email_view_path(system_email), <% if system_email_actions.include?('view') %>
class: "button hollow" %> <%= link_to t("admin.shared.view"), admin_system_email_view_path(system_email_title),
class: "button hollow" %>
<% end %>
<% if system_email_actions.include?('preview_pending') %>
<%= link_to t("admin.system_emails.preview_pending.action"),
admin_system_email_preview_pending_path(system_email_title),
class: "button" %>
<% end %>
</td> </td>
</tr> </tr>
<% end %> <% end %>

View File

@@ -0,0 +1,16 @@
<%= back_link_to admin_system_emails_path %>
<% system_email_name = t("admin.system_emails.#{@system_email}.title") %>
<h2><%= t("admin.system_emails.preview_pending.preview_of", name: system_email_name) %></h2>
<div class="small-12 column">
<h4><%= t("admin.system_emails.preview_pending.pending_to_be_sent") %></h4>
<p><%= t("admin.system_emails.#{@system_email}.preview_detail") %></p>
<% @previews.each do |preview| %>
<%= render partial: "admin/system_emails/preview_pending/#{@system_email}",
locals: { preview: preview } %>
<% end %>
</div>
<%= paginate @previews %>

View File

@@ -0,0 +1,33 @@
<% if preview.proposal.present? %>
<div class="callout highlight">
<div class="row">
<div class="small-12 medium-6 column">
<strong><%= t("admin.shared.proposal") %></strong><br>
<%= link_to preview.proposal.title, proposal_url(preview.proposal) %>
</div>
<div class="small-12 medium-6 column">
<strong><%= t("admin.shared.title") %></strong><br>
<%= link_to preview.title, proposal_url(preview.proposal, anchor: "tab-notifications") %>
</div>
</div>
<div class="row">
<div class="small-12 medium-6 column">
<strong><%= t("admin.shared.author") %></strong><br>
<%= preview.proposal.author&.username || '-' %>
</div>
<div class="small-12 medium-6 column">
<strong><%= t("admin.shared.created_at") %></strong><br>
<%= l(preview.created_at, format: :datetime) %>
</div>
</div>
</div>
<div class="row">
<div class="column">
<strong><%= t("admin.shared.content") %></strong>
<p class="help-text" id="phase-description-help-text">
<%= preview.body %>
</p>
</div>
</div>
<% end %>

View File

@@ -651,9 +651,14 @@ en:
sent_guide: "This is how the users see the notification:" sent_guide: "This is how the users see the notification:"
send_alert: Are you sure you want to send this notification to %{n} users? send_alert: Are you sure you want to send this notification to %{n} users?
system_emails: system_emails:
preview_pending:
action: Preview Pending
preview_of: Preview of %{name}
pending_to_be_sent: This is the content pending to be sent
proposal_notification_digest: proposal_notification_digest:
title: Proposal Notification Digest title: Proposal Notification Digest
description: Gathers all proposal notifications for an user in a single message, to avoid too much emails. description: Gathers all proposal notifications for an user in a single message, to avoid too much emails.
preview_detail: Users will only recieve notifications from the proposals they are following
emails_download: emails_download:
index: index:
title: Emails download title: Emails download
@@ -1051,7 +1056,10 @@ en:
show_image: Show image show_image: Show image
moderated_content: "Check the content moderated by the moderators, and confirm if the moderation has been done correctly." moderated_content: "Check the content moderated by the moderators, and confirm if the moderation has been done correctly."
view: View view: View
preview: Preview proposal: Proposal
author: Author
content: Content
created_at: Created at
spending_proposals: spending_proposals:
index: index:
geozone_filter_all: All zones geozone_filter_all: All zones

View File

@@ -652,9 +652,14 @@ es:
sent_guide: "Así es como los usuarios ven la notificación:" sent_guide: "Así es como los usuarios ven la notificación:"
send_alert: ¿Estás seguro/a de que quieres enviar esta notificación a %{n} usuarios? send_alert: ¿Estás seguro/a de que quieres enviar esta notificación a %{n} usuarios?
system_emails: system_emails:
preview_pending:
action: Previsualizar Pendientes
preview_of: Vista previa de %{name}
pending_to_be_sent: Este es todo el contenido pendiente de enviar
proposal_notification_digest: proposal_notification_digest:
title: Resumen de Notificationes de Propuestas title: Resumen de Notificationes de Propuestas
description: Reune todas las notificaciones de propuestas en un único mensaje, para evitar demasiados emails. description: Reune todas las notificaciones de propuestas en un único mensaje, para evitar demasiados emails.
preview_detail: Los usuarios sólo recibirán las notificaciones de aquellas propuestas que siguen.
emails_download: emails_download:
index: index:
title: Descarga de emails title: Descarga de emails
@@ -1052,7 +1057,10 @@ es:
show_image: Mostrar imagen show_image: Mostrar imagen
moderated_content: "Revisa el contenido moderado por los moderadores, y confirma si la moderación se ha realizado correctamente." moderated_content: "Revisa el contenido moderado por los moderadores, y confirma si la moderación se ha realizado correctamente."
view: Ver view: Ver
preview: Previsualizar proposal: Propuesta
author: Autor
content: Contenido
created_at: Fecha de creación
spending_proposals: spending_proposals:
index: index:
geozone_filter_all: Todos los ámbitos de actuación geozone_filter_all: Todos los ámbitos de actuación

View File

@@ -167,6 +167,7 @@ namespace :admin do
resources :system_emails, only: [:index] do resources :system_emails, only: [:index] do
get :view get :view
get :preview_pending
end end
resources :emails_download, only: :index do resources :emails_download, only: :index do

View File

@@ -40,4 +40,29 @@ feature "System Emails" do
end end
end end
context "Preview Pending" do
scenario "#proposal_notification_digest" do
proposal_a = create(:proposal, title: 'Proposal A')
proposal_b = create(:proposal, title: 'Proposal B')
proposal_notification_a = create(:proposal_notification, proposal: proposal_a,
title: 'Proposal A Title',
body: 'Proposal A Notification Body')
proposal_notification_b = create(:proposal_notification, proposal: proposal_b,
title: 'Proposal B Title',
body: 'Proposal B Notification Body')
create(:notification, notifiable: proposal_notification_a, emailed_at: nil)
create(:notification, notifiable: proposal_notification_b, emailed_at: nil)
visit admin_system_email_preview_pending_path('proposal_notification_digest')
expect(page).to have_content('This is the content pending to be sent')
expect(page).to have_link('Proposal A', href: proposal_url(proposal_a))
expect(page).to have_link('Proposal B', href: proposal_url(proposal_b))
expect(page).to have_link('Proposal A Title', href: proposal_url(proposal_a,
anchor: 'tab-notifications'))
expect(page).to have_link('Proposal B Title', href: proposal_url(proposal_b,
anchor: 'tab-notifications'))
end
end
end end