Extract description object to remove the helper salad

Lots of repetition with the helpers and params
This commit is contained in:
Jorge Manrubia
2025-11-06 10:56:07 +01:00
parent 6aefab2396
commit c926d7ad6c
5 changed files with 127 additions and 95 deletions
+13 -93
View File
@@ -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
+4
View File
@@ -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)
+108
View File
@@ -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
+1 -1
View File
@@ -32,7 +32,7 @@
<div class="flex flex-column min-width txt-small align-start txt-align-start" style="color: color-mix(in srgb, var(--card-color) 40%, var(--color-ink));">
<strong class="event__title txt-break overflow-line-clamp txt-tight-lines">
<%= event_action_sentence_tag(event) %>
<%= event.description_for(Current.user).to_html %>
</strong>
<%= yield %>
+1 -1
View File
@@ -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 %>