Add publish/unpublish controls to announcements in admin UI (#12967)
This commit is contained in:
parent
4363d06986
commit
663ea84b08
7 changed files with 49 additions and 7 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue