about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--app/controllers/admin/announcements_controller.rb22
-rw-r--r--app/models/announcement.rb8
-rw-r--r--app/views/admin/announcements/_announcement.html.haml9
-rw-r--r--app/views/admin/announcements/edit.html.haml2
-rw-r--r--app/workers/publish_scheduled_announcement_worker.rb2
-rw-r--r--config/locales/en.yml5
-rw-r--r--config/routes.rb8
7 files changed, 49 insertions, 7 deletions
diff --git a/app/controllers/admin/announcements_controller.rb b/app/controllers/admin/announcements_controller.rb
index 212a9f693..494fd13d0 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 670b24f01..d99502f44 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 75768c7ba..f8a6c66de 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 c5c605e93..5f56db5e7 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 4fc6bef2f..efca39d3d 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 0ba573020..4687b471a 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 da7bf6f88..c22efc1e1 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]