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
 | 
			
		||||
      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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue