From 663ea84b08162578cd06b54bfb998072b2bef8b9 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 27 Jan 2020 11:05:33 +0100 Subject: [PATCH] Add publish/unpublish controls to announcements in admin UI (#12967) --- .../admin/announcements_controller.rb | 22 ++++++++++++++++--- app/models/announcement.rb | 8 +++++++ .../announcements/_announcement.html.haml | 9 +++++++- app/views/admin/announcements/edit.html.haml | 2 +- .../publish_scheduled_announcement_worker.rb | 2 +- config/locales/en.yml | 5 +++++ config/routes.rb | 8 ++++++- 7 files changed, 49 insertions(+), 7 deletions(-) diff --git a/app/controllers/admin/announcements_controller.rb b/app/controllers/admin/announcements_controller.rb index 212a9f6933..494fd13d0f 100644 --- a/app/controllers/admin/announcements_controller.rb +++ b/app/controllers/admin/announcements_controller.rb @@ -22,7 +22,7 @@ class Admin::AnnouncementsController < Admin::BaseController if @announcement.save PublishScheduledAnnouncementWorker.perform_async(@announcement.id) if @announcement.published? log_action :create, @announcement - redirect_to admin_announcements_path + redirect_to admin_announcements_path, notice: @announcement.published? ? I18n.t('admin.announcements.published_msg') : I18n.t('admin.announcements.scheduled_msg') else render :new end @@ -38,18 +38,34 @@ class Admin::AnnouncementsController < Admin::BaseController if @announcement.update(resource_params) PublishScheduledAnnouncementWorker.perform_async(@announcement.id) if @announcement.published? log_action :update, @announcement - redirect_to admin_announcements_path + redirect_to admin_announcements_path, notice: I18n.t('admin.announcements.updated_msg') else render :edit end end + def publish + authorize :announcement, :update? + @announcement.publish! + PublishScheduledAnnouncementWorker.perform_async(@announcement.id) + log_action :update, @announcement + redirect_to admin_announcements_path, notice: I18n.t('admin.announcements.published_msg') + end + + def unpublish + authorize :announcement, :update? + @announcement.unpublish! + UnpublishAnnouncementWorker.perform_async(@announcement.id) + log_action :update, @announcement + redirect_to admin_announcements_path, notice: I18n.t('admin.announcements.unpublished_msg') + end + def destroy authorize :announcement, :destroy? @announcement.destroy! UnpublishAnnouncementWorker.perform_async(@announcement.id) if @announcement.published? log_action :destroy, @announcement - redirect_to admin_announcements_path + redirect_to admin_announcements_path, notice: I18n.t('admin.announcements.destroyed_msg') end private diff --git a/app/models/announcement.rb b/app/models/announcement.rb index 670b24f01d..d99502f44f 100644 --- a/app/models/announcement.rb +++ b/app/models/announcement.rb @@ -32,6 +32,14 @@ class Announcement < ApplicationRecord before_validation :set_all_day before_validation :set_published, on: :create + def publish! + update!(published: true, published_at: Time.now.utc, scheduled_at: nil) + end + + def unpublish! + update!(published: false, scheduled_at: nil) + end + def time_range? starts_at.present? && ends_at.present? end diff --git a/app/views/admin/announcements/_announcement.html.haml b/app/views/admin/announcements/_announcement.html.haml index 75768c7ba2..f8a6c66dec 100644 --- a/app/views/admin/announcements/_announcement.html.haml +++ b/app/views/admin/announcements/_announcement.html.haml @@ -10,5 +10,12 @@ - else = l(announcement.created_at) %td - = table_link_to 'pencil', t('generic.edit'), edit_admin_announcement_path(announcement) if can?(:update, announcement) + - if can?(:update, announcement) + - if announcement.published? + = table_link_to 'pause', t('admin.announcements.unpublish'), unpublish_admin_announcement_path(announcement), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } + - else + = table_link_to 'play', t('admin.announcements.publish'), publish_admin_announcement_path(announcement), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } + + = table_link_to 'pencil', t('generic.edit'), edit_admin_announcement_path(announcement) + = table_link_to 'trash', t('generic.delete'), admin_announcement_path(announcement), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, announcement) diff --git a/app/views/admin/announcements/edit.html.haml b/app/views/admin/announcements/edit.html.haml index c5c605e939..5f56db5e7f 100644 --- a/app/views/admin/announcements/edit.html.haml +++ b/app/views/admin/announcements/edit.html.haml @@ -14,7 +14,7 @@ .fields-group = f.input :text, wrapper: :with_block_label - - if @announcement.scheduled_at.present? && !@announcement.published? + - unless @announcement.published? .fields-group = f.input :scheduled_at, include_blank: true, wrapper: :with_block_label diff --git a/app/workers/publish_scheduled_announcement_worker.rb b/app/workers/publish_scheduled_announcement_worker.rb index 4fc6bef2fd..efca39d3d7 100644 --- a/app/workers/publish_scheduled_announcement_worker.rb +++ b/app/workers/publish_scheduled_announcement_worker.rb @@ -7,7 +7,7 @@ class PublishScheduledAnnouncementWorker def perform(announcement_id) announcement = Announcement.find(announcement_id) - announcement.update(published: true, published_at: Time.now.utc, scheduled_at: nil) unless announcement.published? + announcement.publish! unless announcement.published? payload = InlineRenderer.render(announcement, nil, :announcement) payload = Oj.dump(event: :announcement, payload: payload) diff --git a/config/locales/en.yml b/config/locales/en.yml index 0ba5730201..4687b471a6 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -232,6 +232,7 @@ en: deleted_status: "(deleted status)" title: Audit log announcements: + destroyed_msg: Announcement successfully deleted! edit: title: Edit announcement empty: No announcements found. @@ -240,8 +241,12 @@ en: create: Create announcement title: New announcement published: Published + published_msg: Announcement successfully published! + scheduled_msg: Announcement scheduled for publication! time_range: Time range title: Announcements + unpublished_msg: Announcement successfully unpublished! + updated_msg: Announcement successfully updated! custom_emojis: assign_category: Assign category by_domain: Domain diff --git a/config/routes.rb b/config/routes.rb index da7bf6f889..c22efc1e18 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -177,7 +177,13 @@ Rails.application.routes.draw do resources :email_domain_blocks, only: [:index, :new, :create, :destroy] resources :action_logs, only: [:index] resources :warning_presets, except: [:new] - resources :announcements, except: [:show] + + resources :announcements, except: [:show] do + member do + post :publish + post :unpublish + end + end resource :settings, only: [:edit, :update]