Add publish/unpublish controls to announcements in admin UI (#12967)

This commit is contained in:
Eugen Rochko 2020-01-27 11:05:33 +01:00 committed by GitHub
parent 4363d06986
commit 663ea84b08
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 49 additions and 7 deletions

View file

@ -22,7 +22,7 @@ class Admin::AnnouncementsController < Admin::BaseController
if @announcement.save if @announcement.save
PublishScheduledAnnouncementWorker.perform_async(@announcement.id) if @announcement.published? PublishScheduledAnnouncementWorker.perform_async(@announcement.id) if @announcement.published?
log_action :create, @announcement 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 else
render :new render :new
end end
@ -38,18 +38,34 @@ class Admin::AnnouncementsController < Admin::BaseController
if @announcement.update(resource_params) if @announcement.update(resource_params)
PublishScheduledAnnouncementWorker.perform_async(@announcement.id) if @announcement.published? PublishScheduledAnnouncementWorker.perform_async(@announcement.id) if @announcement.published?
log_action :update, @announcement log_action :update, @announcement
redirect_to admin_announcements_path redirect_to admin_announcements_path, notice: I18n.t('admin.announcements.updated_msg')
else else
render :edit render :edit
end end
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 def destroy
authorize :announcement, :destroy? authorize :announcement, :destroy?
@announcement.destroy! @announcement.destroy!
UnpublishAnnouncementWorker.perform_async(@announcement.id) if @announcement.published? UnpublishAnnouncementWorker.perform_async(@announcement.id) if @announcement.published?
log_action :destroy, @announcement log_action :destroy, @announcement
redirect_to admin_announcements_path redirect_to admin_announcements_path, notice: I18n.t('admin.announcements.destroyed_msg')
end end
private private

View file

@ -32,6 +32,14 @@ class Announcement < ApplicationRecord
before_validation :set_all_day before_validation :set_all_day
before_validation :set_published, on: :create 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? def time_range?
starts_at.present? && ends_at.present? starts_at.present? && ends_at.present?
end end

View file

@ -10,5 +10,12 @@
- else - else
= l(announcement.created_at) = l(announcement.created_at)
%td %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) = 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)

View file

@ -14,7 +14,7 @@
.fields-group .fields-group
= f.input :text, wrapper: :with_block_label = f.input :text, wrapper: :with_block_label
- if @announcement.scheduled_at.present? && !@announcement.published? - unless @announcement.published?
.fields-group .fields-group
= f.input :scheduled_at, include_blank: true, wrapper: :with_block_label = f.input :scheduled_at, include_blank: true, wrapper: :with_block_label

View file

@ -7,7 +7,7 @@ class PublishScheduledAnnouncementWorker
def perform(announcement_id) def perform(announcement_id)
announcement = Announcement.find(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 = InlineRenderer.render(announcement, nil, :announcement)
payload = Oj.dump(event: :announcement, payload: payload) payload = Oj.dump(event: :announcement, payload: payload)

View file

@ -232,6 +232,7 @@ en:
deleted_status: "(deleted status)" deleted_status: "(deleted status)"
title: Audit log title: Audit log
announcements: announcements:
destroyed_msg: Announcement successfully deleted!
edit: edit:
title: Edit announcement title: Edit announcement
empty: No announcements found. empty: No announcements found.
@ -240,8 +241,12 @@ en:
create: Create announcement create: Create announcement
title: New announcement title: New announcement
published: Published published: Published
published_msg: Announcement successfully published!
scheduled_msg: Announcement scheduled for publication!
time_range: Time range time_range: Time range
title: Announcements title: Announcements
unpublished_msg: Announcement successfully unpublished!
updated_msg: Announcement successfully updated!
custom_emojis: custom_emojis:
assign_category: Assign category assign_category: Assign category
by_domain: Domain by_domain: Domain

View file

@ -177,7 +177,13 @@ Rails.application.routes.draw do
resources :email_domain_blocks, only: [:index, :new, :create, :destroy] resources :email_domain_blocks, only: [:index, :new, :create, :destroy]
resources :action_logs, only: [:index] resources :action_logs, only: [:index]
resources :warning_presets, except: [:new] 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] resource :settings, only: [:edit, :update]