Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor tags and SDG "tags" rendering #4345

Merged
merged 7 commits into from
Feb 4, 2021
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.sdg-goal-filter-links {
.sdg-goal-tag-cloud {

.sdg-goal-tag-list {
@extend %sdg-goal-list;
Expand Down
47 changes: 14 additions & 33 deletions app/components/concerns/sdg/tag_list.rb
Original file line number Diff line number Diff line change
@@ -1,50 +1,31 @@
module SDG::TagList
extend ActiveSupport::Concern
attr_reader :record_or_name, :limit
delegate :link_list, to: :helpers
attr_reader :record, :limit

def initialize(record_or_name, limit: nil)
@record_or_name = record_or_name
def initialize(record, limit: nil)
@record = record
@limit = limit
end

def render?
process.enabled?
SDG::ProcessEnabled.new(record).enabled?
end

def see_more_link(collection)
count = count_out_of_limit(collection)
def tag_records
tags = record.send(association_name)

if count > 0
[
"#{count}+",
polymorphic_path(record),
class: "more-#{i18n_namespace}", title: t("sdg.#{i18n_namespace}.filter.more", count: count)
]
if tags.respond_to?(:limit)
tags.order(:code).limit(limit)
else
tags.sort[0..(limit.to_i - 1)]
end
end

def filter_text(goal_or_target)
t("sdg.#{i18n_namespace}.filter.link",
resources: model.model_name.human(count: :other),
code: goal_or_target.code)
def see_more_link
render Shared::SeeMoreLinkComponent.new(record, association_name, limit: limit)
end

def index_by(advanced_search)
polymorphic_path(model, advanced_search: advanced_search)
end

def count_out_of_limit(collection)
return 0 unless limit

collection.size - limit
end

def process
@process ||= SDG::ProcessEnabled.new(record_or_name)
end

def model
process.name.constantize
def association_name
raise NotImplementedError, "method must be implemented in the included class"
end
end
1 change: 1 addition & 0 deletions app/components/sdg/filter_links_component.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<%= link_list(*links, class: "sdg-#{parameter_name}-tag-list") %>
49 changes: 49 additions & 0 deletions app/components/sdg/filter_links_component.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
class SDG::FilterLinksComponent < ApplicationComponent
attr_reader :records, :related_model, :see_more_link
delegate :link_list, to: :helpers

def initialize(records, related_model, see_more_link: nil)
@records = records
@related_model = related_model
@see_more_link = see_more_link
end

def links
[*sdg_links, see_more_link]
end

private

def sdg_links
records.map do |goal_or_target|
[
render(SDG::TagComponent.new(goal_or_target)),
index_by(parameter_name => goal_or_target.code),
title: filter_text(goal_or_target),
data: { code: goal_or_target.code }
]
end
end

def filter_text(goal_or_target)
t("sdg.#{i18n_namespace}.filter.link",
resources: related_model.model_name.human(count: :other),
code: goal_or_target.code)
end

def index_by(advanced_search)
polymorphic_path(related_model, advanced_search: advanced_search)
end

def i18n_namespace
parameter_name.pluralize
end

def parameter_name
if records.first.is_a?(SDG::Goal)
"goal"
else
"target"
end
end
end
5 changes: 0 additions & 5 deletions app/components/sdg/goals/filter_links_component.html.erb

This file was deleted.

24 changes: 5 additions & 19 deletions app/components/sdg/goals/plain_tag_list_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,17 @@ class SDG::Goals::PlainTagListComponent < ApplicationComponent

private

def record
record_or_name
end

def tags
[*goal_tags, see_more_link].compact
end

def see_more_link
options = super(goals)

link_to(*options) if options.present?
[*goal_tags, see_more_link].select(&:present?)
end

def goal_tags
goals.order(:code).limit(limit).map do |goal|
render SDG::Goals::IconComponent.new(goal)
tag_records.map do |goal|
render SDG::TagComponent.new(goal)
end
end

def goals
record.sdg_goals
end

def i18n_namespace
"goals"
def association_name
:sdg_goals
end
end
5 changes: 5 additions & 0 deletions app/components/sdg/goals/tag_cloud_component.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<div class="sdg-goal-tag-cloud">
<div class="sidebar-divider"></div>
<h2 class="sidebar-title"><%= heading %></h2>
<%= render SDG::FilterLinksComponent.new(goals, class_name.constantize) %>
</div>
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class SDG::Goals::FilterLinksComponent < ApplicationComponent
class SDG::Goals::TagCloudComponent < ApplicationComponent
attr_reader :class_name

def initialize(class_name)
Expand All @@ -14,4 +14,8 @@ def render?
def heading
t("sdg.goals.filter.heading")
end

def goals
SDG::Goal.order(:code)
end
end
2 changes: 1 addition & 1 deletion app/components/sdg/goals/tag_list_component.html.erb
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<%= link_list(*links, class: "sdg-goal-tag-list") %>
<%= render SDG::FilterLinksComponent.new(tag_records, related_model, see_more_link: see_more_link) %>
30 changes: 4 additions & 26 deletions app/components/sdg/goals/tag_list_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,11 @@ class SDG::Goals::TagListComponent < ApplicationComponent

private

def record
record_or_name if record_or_name.respond_to?(:sdg_goals)
def association_name
:sdg_goals
end

def links
[*goal_links, see_more_link(goals)]
end

def goal_links
goals.order(:code).limit(limit).map do |goal|
[
render(SDG::Goals::IconComponent.new(goal)),
index_by_goal(goal),
title: filter_text(goal)
]
end
end

def goals
record&.sdg_goals || SDG::Goal.all
end

def index_by_goal(goal)
index_by(goal: goal.code)
end

def i18n_namespace
"goals"
def related_model
record.class
end
end
1 change: 1 addition & 0 deletions app/components/sdg/tag_component.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<%= text -%>
15 changes: 15 additions & 0 deletions app/components/sdg/tag_component.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class SDG::TagComponent < ApplicationComponent
attr_reader :goal_or_target

def initialize(goal_or_target)
@goal_or_target = goal_or_target
end

def text
if goal_or_target.is_a?(SDG::Goal)
render SDG::Goals::IconComponent.new(goal_or_target)
else
"#{SDG::Target.model_name.human} #{goal_or_target.code}"
end
end
end
28 changes: 5 additions & 23 deletions app/components/sdg/targets/plain_tag_list_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,17 @@ class SDG::Targets::PlainTagListComponent < ApplicationComponent

private

def record
record_or_name
end

def tags
[*target_tags, see_more_link].compact
end

def see_more_link
options = super(targets)

link_to(*options) if options.present?
[*target_tags, see_more_link].select(&:present?)
end

def target_tags
targets.sort[0..(limit.to_i - 1)].map do |target|
tag.span(text(target), data: { code: target.code })
tag_records.map do |target|
tag.span(render(SDG::TagComponent.new(target)), data: { code: target.code })
end
end

def targets
record.sdg_targets
end

def text(target)
"#{SDG::Target.model_name.human} #{target.code}"
end

def i18n_namespace
"targets"
def association_name
:sdg_targets
end
end
2 changes: 1 addition & 1 deletion app/components/sdg/targets/tag_list_component.html.erb
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<%= link_list(*links, class: "sdg-target-tag-list") %>
<%= render SDG::FilterLinksComponent.new(tag_records, related_model, see_more_link: see_more_link) %>
31 changes: 4 additions & 27 deletions app/components/sdg/targets/tag_list_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,11 @@ class SDG::Targets::TagListComponent < ApplicationComponent

private

def record
record_or_name
def association_name
:sdg_targets
end

def links
[*target_links, see_more_link(targets)]
end

def target_links
targets.sort[0..(limit.to_i - 1)].map do |target|
[
"#{SDG::Target.model_name.human} #{target.code}",
index_by_target(target),
title: filter_text(target),
data: { code: target.code }
]
end
end

def targets
record.sdg_targets
end

def index_by_target(target)
index_by(target: target.code)
end

def i18n_namespace
"targets"
def related_model
record.class
end
end
3 changes: 3 additions & 0 deletions app/components/shared/see_more_link_component.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<% if count_out_of_limit > 0 %>
<%= link_to text, url, class: html_class, title: title %>
<% end %>
37 changes: 37 additions & 0 deletions app/components/shared/see_more_link_component.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
class Shared::SeeMoreLinkComponent < ApplicationComponent
attr_reader :record, :association_name, :limit

def initialize(record, association_name, limit: nil)
@record = record
@association_name = association_name
@limit = limit
end

private

def text
"#{count_out_of_limit}+"
end

def url
polymorphic_path(record)
end

def title
t("#{i18n_namespace}.filter.more", count: count_out_of_limit)
end

def count_out_of_limit
return 0 unless limit

record.send(association_name).size - limit
end

def i18n_namespace
association_name.to_s.tr("_", ".")
end

def html_class
"more-#{i18n_namespace.split(".").last}"
end
end
1 change: 1 addition & 0 deletions app/components/shared/tag_list_component.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<%= link_list(*links, class: "tags", id: "tags_#{dom_id(taggable)}") %>