diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index d9ad27613..94e6990d2 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -55,100 +55,20 @@ module EventsHelper tag.div class: "events__time-block", style: "grid-area: #{row}/#{col}", & end - def event_action_sentence_tag(event) - creator = event_creator_name_tag(event) - card = event.action.comment_created? ? event.eventable.card : event.eventable - card_title = event_card_title(card) - event_action_sentence(creator, card_title, event).html_safe - end - - def event_action_sentence_text(event) - creator = event_creator_name_text(event) - card = event.action.comment_created? ? event.eventable.card : event.eventable - card_title = card.title - event_action_sentence(creator, card_title, event) - end - - def event_creator_name_tag(event) - tag.span data: { creator_id: event.creator.id } do - safe_join([ - tag.span("You", data: { only_visible_to_you: true }), - tag.span(h(event.creator.name), data: { only_visible_to_others: true }) - ]) - end - end - - def event_creator_name_text(event) - event.creator == Current.user ? "You" : h(event.creator.name) - end - - def event_action_sentence(event_creator, event_card_title, event) - if event.action.comment_created? - comment_event_action_sentence(event_creator, event_card_title, event) + def event_action_icon(event) + case event.action + when "card_assigned" + "assigned" + when "card_unassigned" + "minus" + when "comment_created" + "comment" + when "card_title_changed" + "rename" + when "card_board_changed" + "move" else - card_event_action_sentence(event_creator, event_card_title, event) + "person" end end - - def comment_event_action_sentence(event_creator, event_card_title, event) - "#{event_creator} commented on #{event_card_title}" - end - - def card_event_action_sentence(event_creator, event_card_title, event) - case event.action - when "card_assigned" - if event.assignees.include?(Current.user) - "#{event_creator} will handle #{event_card_title}" - else - "#{event_creator} assigned #{h event.assignees.pluck(:name).to_sentence} to #{event_card_title}" - end - when "card_unassigned" - "#{event_creator} unassigned #{h(event.assignees.include?(Current.user) ? "yourself" : event.assignees.pluck(:name).to_sentence)} from #{event_card_title}" - when "card_published" - "#{event_creator} added #{event_card_title}" - when "card_closed" - "#{event_creator} moved #{event_card_title} to “Done”" - when "card_reopened" - "#{event_creator} reopened #{event_card_title}" - when "card_postponed" - "#{event_creator} moved #{event_card_title} to “Not Now”" - when "card_auto_postponed" - "#{event_card_title} was closed as “Not Now” due to inactivity" - when "card_resumed" - "#{event_creator} resumed #{event_card_title}" - when "card_title_changed" - "#{event_creator} renamed #{event_card_title} (was: “#{h event.particulars.dig('particulars', 'old_title')}”)" - when "card_board_changed", "card_collection_changed" - "#{event_creator} moved #{event_card_title} to “#{h (event.particulars.dig('particulars', 'new_board') || event.particulars.dig('particulars', 'new_collection'))}”" - when "card_triaged" - "#{event_creator} moved #{event_card_title} to “#{h event.particulars.dig('particulars', 'column')}”" - when "card_sent_back_to_triage" - "#{event_creator} moved #{event_card_title} back to “Maybe?”" - end - end - - def event_card_title(card) - tag.span card.title, class: "txt-underline" - end - - def event_due_date(event) - event.particulars.dig("particulars", "due_date").to_date.strftime("%B %-d") - end - - def event_action_icon(event) - case event.action - when "card_assigned" - "assigned" - when "card_unassigned" - "minus" - when "comment_created" - "comment" - when "card_title_changed" - "rename" - when "card_board_changed" - "move" - else - "person" - end - end end diff --git a/app/models/event.rb b/app/models/event.rb index ad77d3492..74a3bb20f 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -22,6 +22,10 @@ class Event < ApplicationRecord eventable end + def description_for(user) + Event::Description.new(self, user) + end + private def dispatch_webhooks Event::WebhookDispatchJob.perform_later(self) diff --git a/app/models/event/description.rb b/app/models/event/description.rb new file mode 100644 index 000000000..f743ce0e2 --- /dev/null +++ b/app/models/event/description.rb @@ -0,0 +1,108 @@ +class Event::Description + include ActionView::Helpers::TagHelper + include ERB::Util + + attr_reader :event, :user + + def initialize(event, user) + @event = event + @user = user + end + + def to_html + sentence(creator_tag, card_title_tag).html_safe + end + + def to_plain_text + sentence(creator_text, card.title) + end + + private + def card + @card ||= event.action.comment_created? ? event.eventable.card : event.eventable + end + + def creator_tag + tag.span data: { creator_id: event.creator.id } do + tag.span("You", data: { only_visible_to_you: true }) + + tag.span(h(event.creator.name), data: { only_visible_to_others: true }) + end + end + + def creator_text + event.creator == user ? "You" : h(event.creator.name) + end + + def card_title_tag + tag.span card.title, class: "txt-underline" + end + + def sentence(creator, card_title) + if event.action.comment_created? + comment_sentence(creator, card_title) + else + action_sentence(creator, card_title) + end + end + + def comment_sentence(creator, card_title) + "#{creator} commented on #{card_title}" + end + + def action_sentence(creator, card_title) + case event.action + when "card_assigned" + assigned_sentence(creator, card_title) + when "card_unassigned" + unassigned_sentence(creator, card_title) + when "card_published" + "#{creator} added #{card_title}" + when "card_closed" + %(#{creator} moved #{card_title} to "Done") + when "card_reopened" + "#{creator} reopened #{card_title}" + when "card_postponed" + %(#{creator} moved #{card_title} to "Not Now") + when "card_auto_postponed" + %(#{card_title} was closed as "Not Now" due to inactivity) + when "card_resumed" + "#{creator} resumed #{card_title}" + when "card_title_changed" + renamed_sentence(creator, card_title) + when "card_board_changed", "card_collection_changed" + moved_sentence(creator, card_title) + when "card_triaged" + triaged_sentence(creator, card_title) + when "card_sent_back_to_triage" + %(#{creator} moved #{card_title} back to "Maybe?") + end + end + + def assigned_sentence(creator, card_title) + if event.assignees.include?(user) + "#{creator} will handle #{card_title}" + else + "#{creator} assigned #{h event.assignees.pluck(:name).to_sentence} to #{card_title}" + end + end + + def unassigned_sentence(creator, card_title) + assignees_text = event.assignees.include?(user) ? "yourself" : event.assignees.pluck(:name).to_sentence + "#{creator} unassigned #{h(assignees_text)} from #{card_title}" + end + + def renamed_sentence(creator, card_title) + old_title = event.particulars.dig("particulars", "old_title") + %(#{creator} renamed #{card_title} (was: "#{h old_title}")) + end + + def moved_sentence(creator, card_title) + new_location = event.particulars.dig("particulars", "new_board") || event.particulars.dig("particulars", "new_collection") + %(#{creator} moved #{card_title} to "#{h new_location}") + end + + def triaged_sentence(creator, card_title) + column = event.particulars.dig("particulars", "column") + %(#{creator} moved #{card_title} to "#{h column}") + end +end diff --git a/app/views/events/event/_layout.html.erb b/app/views/events/event/_layout.html.erb index 1cd1e6831..0cd0fee07 100644 --- a/app/views/events/event/_layout.html.erb +++ b/app/views/events/event/_layout.html.erb @@ -32,7 +32,7 @@
- <%= event_action_sentence_tag(event) %> + <%= event.description_for(Current.user).to_html %> <%= yield %> diff --git a/app/views/webhooks/event.html.erb b/app/views/webhooks/event.html.erb index a9835c21e..f2920e8d0 100644 --- a/app/views/webhooks/event.html.erb +++ b/app/views/webhooks/event.html.erb @@ -1,4 +1,4 @@ -<%= event_action_sentence_text(@event) %> +<%= @event.description_for(Current.user).to_plain_text %> <% if @event.eventable %> <%= link_to "↗︎", polymorphic_url(@event.eventable) %> <% end %>