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] | ||||
| 
 | ||||
|  |  | |||
		Reference in a new issue