Skip to content

Commit

Permalink
Merge pull request #4345 from consul/sdg_list_refactor
Browse files Browse the repository at this point in the history
Refactor tags and SDG "tags" rendering
  • Loading branch information
javierm committed Feb 4, 2021
2 parents 2712cc1 + 92a09f7 commit fe1ef43
Show file tree
Hide file tree
Showing 32 changed files with 254 additions and 219 deletions.
6 changes: 0 additions & 6 deletions app/assets/stylesheets/participation.scss
Original file line number Diff line number Diff line change
Expand Up @@ -606,12 +606,6 @@
img {
max-width: 12rem;
}

.budget-investment-content {
ul {
margin-bottom: 0;
}
}
}
}

Expand Down
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)}") %>
Loading

0 comments on commit fe1ef43

Please sign in to comment.