Add announcements (#12662)

* Add announcements

Fix #11006

* Add reactions to announcements

* Add admin UI for announcements

* Add unit tests

* Fix issues

- Add `with_dismissed` param to announcements API
- Fix end date not being formatted when time range is given
- Fix announcement delete causing reactions to send streaming updates
- Fix announcements container growing too wide and mascot too small
- Fix `all_day` being settable when no time range is given
- Change text "Update" to "Announcement"

* Fix scheduler unpublishing announcements before they are due

* Fix filter params not being passed to announcements filter
This commit is contained in:
Eugen Rochko
2020-01-23 22:00:13 +01:00
committed by GitHub
parent 81cc86bb1f
commit f52c988e12
65 changed files with 1779 additions and 22 deletions

View File

@ -0,0 +1,14 @@
%tr
%td
= truncate(announcement.text)
%td
= time_range(announcement) if announcement.time_range?
%td
- if announcement.scheduled_at.present?
= fa_icon('clock-o') if announcement.scheduled_at > Time.now.utc
= l(announcement.scheduled_at)
- else
= l(announcement.created_at)
%td
= table_link_to 'pencil', t('generic.edit'), edit_admin_announcement_path(announcement) if can?(:update, 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

@ -0,0 +1,22 @@
- content_for :page_title do
= t('.title')
= simple_form_for @announcement, url: admin_announcement_path(@announcement) do |f|
= render 'shared/error_messages', object: @announcement
.fields-group
= f.input :starts_at, include_blank: true, wrapper: :with_block_label
= f.input :ends_at, include_blank: true, wrapper: :with_block_label
.fields-group
= f.input :all_day, as: :boolean, wrapper: :with_label
.fields-group
= f.input :text, wrapper: :with_block_label
- if @announcement.scheduled_at.present? && !@announcement.published?
.fields-group
= f.input :scheduled_at, include_blank: true, wrapper: :with_block_label
.actions
= f.button :button, t('generic.save_changes'), type: :submit

View File

@ -0,0 +1,30 @@
- content_for :page_title do
= t('admin.announcements.title')
- content_for :heading_actions do
= link_to t('admin.announcements.new.title'), new_admin_announcement_path, class: 'button'
.filters
.filter-subset
%strong= t('admin.relays.status')
%ul
%li= filter_link_to t('generic.all'), published: nil, unpublished: nil
%li= filter_link_to safe_join([t('admin.announcements.live'), "(#{number_with_delimiter(Announcement.published.count)})"], ' '), published: '1', unpublished: nil
- if @announcements.empty?
%div.muted-hint.center-text
= t 'admin.announcements.empty'
- else
.table-wrapper
%table.table
%thead
%tr
%th= t('simple_form.labels.announcement.text')
%th= t('admin.announcements.time_range')
%th= t('admin.announcements.published')
%th
%tbody
= render partial: 'announcement', collection: @announcements
= paginate @announcements

View File

@ -0,0 +1,21 @@
- content_for :page_title do
= t('.title')
= simple_form_for @announcement, url: admin_announcements_path do |f|
= render 'shared/error_messages', object: @announcement
.fields-group
= f.input :starts_at, include_blank: true, wrapper: :with_block_label
= f.input :ends_at, include_blank: true, wrapper: :with_block_label
.fields-group
= f.input :all_day, as: :boolean, wrapper: :with_label
.fields-group
= f.input :text, wrapper: :with_block_label
.fields-group
= f.input :scheduled_at, include_blank: true, wrapper: :with_block_label
.actions
= f.button :button, t('.create'), type: :submit