Files
grecia/app/components/admin/menu_component.rb
Javi Martín 38b38d1fcc Rename Poll::Question::Answer to Poll::Question::Option
Having a class named `Poll::Question::Answer` and another class named
`Poll::Answer` was so confusing that no developer working on the project
has ever been capable of remembering which is which for more than a few
seconds.

Furthermore, we're planning to add open answers to polls, and we might
add a reference from the `poll_answers` table to the
`poll_question_answers` table to property differentiate between open
answers and closed answers. Having yet another thing named answer would
be more than what our brains can handle (we know it because we did this
once in a prototype).

So we're renaming `Poll::Question::Answer` to `Poll::Question::Option`.
Hopefully that'll make it easier to remember. The name is also (more or
less) consistent with the `Legislation::QuestionOption` class, which is
similar.

We aren't changing the table or columns names for now in order to avoid
possible issues when upgrading (old code running with the new database
tables/columns after running the migrations but before deployment has
finished, for instance). We might do it in the future.

I've tried not to change the internationalization keys either so
existing translations would still be valid. However, since we have to
change the keys in `activerecord.yml` so methods like
`human_attribute_name` keep working, I'm also changing them in places
where similar keys were used (like `poll_question_answer` or
`poll/question/answer`).

Note that it isn't clear whether we should use `option` or
`question_option` in some cases. In order to keep things simple, we're
using `option` where we were using `answer` and `question_option` where
we were using `question_answer`.

Also note we're adding tests for the admin menu component, since at
first I forgot to change the `answers` reference there and all tests
passed.
2024-06-13 19:13:01 +02:00

588 lines
14 KiB
Ruby

class Admin::MenuComponent < ApplicationComponent
include LinkListHelper
use_helpers :can?
def links
[
(proposals_link if feature?(:proposals)),
(debates_link if feature?(:debates)),
comments_link,
(polls_link if feature?(:polls)),
(legislation_link if feature?(:legislation)),
(budgets_link if feature?(:budgets)),
booths_links,
(signature_sheets_link if feature?(:signature_sheets)),
messages_links,
site_customization_links,
moderated_content_links,
profiles_links,
stats_link,
settings_links,
dashboard_links,
(machine_learning_link if ::MachineLearning.enabled?)
]
end
private
def moderated_content?
moderated_sections.include?(controller_name) && controller.class.module_parent != Admin::Legislation
end
def moderated_sections
["hidden_proposals", "hidden_debates", "hidden_comments", "hidden_users", "activity",
"hidden_budget_investments", "hidden_proposal_notifications"]
end
def budgets?
controller_name.starts_with?("budget") || controller_path =~ /budgets_wizard/
end
def polls?
controller.class.module_parent == Admin::Poll::Questions::Options ||
%w[polls active_polls recounts results questions options].include?(controller_name) &&
action_name != "booth_assignments"
end
def booths?
%w[officers booths shifts booth_assignments officer_assignments].include?(controller_name) ||
controller_name == "polls" && action_name == "booth_assignments"
end
def profiles?
%w[administrators organizations officials moderators valuators managers users].include?(controller_name)
end
def settings?
controllers_names = %w[settings tenants tags locales geozones local_census_records imports]
controllers_names.include?(controller_name)
end
def customization?
controllers_names = ["pages", "banners", "information_texts", "documents", "images", "content_blocks"]
(controllers_names.include?(controller_name) || homepage? || pages?) &&
controller.class.module_parent != Admin::Poll::Questions::Options
end
def homepage?
["homepage", "cards"].include?(controller_name) && params[:page_id].nil?
end
def pages?
["pages", "cards"].include?(controller_name) && params[:page_id].present?
end
def dashboard?
["actions", "administrator_tasks"].include?(controller_name)
end
def local_census_records?
controller_name == "local_census_records" ||
(controller_name == "imports" && controller.class.module_parent == Admin::LocalCensusRecords)
end
def messages_menu_active?
messages_sections.include?(controller_name)
end
def messages_sections
%w[newsletters emails_download admin_notifications system_emails]
end
def sdg_managers?
controller_name == "managers" && controller.class.module_parent == Admin::SDG
end
def managers?
controller_name == "managers" && controller.class.module_parent == Admin
end
def proposals_link
[
t("admin.menu.proposals"),
admin_proposals_path,
controller_name == "proposals",
class: "proposals-link"
]
end
def debates_link
[
t("admin.menu.debates"),
admin_debates_path,
controller_name == "debates",
class: "debates-link"
]
end
def polls_link
[
t("admin.menu.polls"),
admin_polls_path,
polls?,
class: "polls-link"
]
end
def comments_link
[
t("admin.menu.comments"),
admin_comments_path,
controller_name == "comments",
class: "comments-link"
]
end
def legislation_link
[
t("admin.menu.legislation"),
admin_legislation_processes_path,
controller.class.module_parent == Admin::Legislation,
class: "legislation-link"
]
end
def budgets_link
[
t("admin.menu.budgets"),
admin_budgets_path,
budgets?,
class: "budgets-link"
]
end
def booths_links
section(t("admin.menu.title_booths"), active: booths?, class: "booths-link") do
link_list(
officers_link,
booths_link,
booth_assignments_link,
shifts_link,
id: "booths_menu"
)
end
end
def officers_link
[
t("admin.menu.poll_officers"),
admin_officers_path,
%w[officers officer_assignments].include?(controller_name)
]
end
def booths_link
[
t("admin.menu.poll_booths"),
admin_booths_path,
controller_name == "booths" && action_name != "available"
]
end
def booth_assignments_link
[
t("admin.menu.poll_booth_assignments"),
booth_assignments_admin_polls_path,
controller_name == "polls" && action_name == "booth_assignments" ||
controller_name == "booth_assignments" && action_name == "manage"
]
end
def shifts_link
[
t("admin.menu.poll_shifts"),
available_admin_booths_path,
%w[shifts booths].include?(controller_name) && %w[available new].include?(action_name)
]
end
def signature_sheets_link
[
t("admin.menu.signature_sheets"),
admin_signature_sheets_path,
controller_name == "signature_sheets",
class: "signature-sheets-link"
]
end
def messages_links
section(t("admin.menu.messaging_users"), active: messages_menu_active?, class: "messages-link") do
link_list(
newsletters_link,
admin_notifications_link,
system_emails_link,
emails_download_link,
id: "messaging_users_menu"
)
end
end
def newsletters_link
[
t("admin.menu.newsletters"),
admin_newsletters_path,
controller_name == "newsletters"
]
end
def admin_notifications_link
[
t("admin.menu.admin_notifications"),
admin_admin_notifications_path,
controller_name == "admin_notifications"
]
end
def system_emails_link
[
t("admin.menu.system_emails"),
admin_system_emails_path,
controller_name == "system_emails"
]
end
def emails_download_link
[
t("admin.menu.emails_download"),
admin_emails_download_index_path,
controller_name == "emails_download"
]
end
def site_customization_links
section(t("admin.menu.title_site_customization"),
active: customization?, class: "site-customization-link") do
link_list(
homepage_link,
pages_link,
banners_link,
information_texts_link,
documents_link,
images_link,
content_blocks_link
)
end
end
def homepage_link
[
t("admin.menu.site_customization.homepage"),
admin_homepage_path,
homepage?
]
end
def pages_link
[
t("admin.menu.site_customization.pages"),
admin_site_customization_pages_path,
pages? || controller_name == "pages"
]
end
def banners_link
[
t("admin.menu.banner"),
admin_banners_path,
controller_name == "banners"
]
end
def information_texts_link
[
t("admin.menu.site_customization.information_texts"),
admin_site_customization_information_texts_path,
controller_name == "information_texts"
]
end
def documents_link
[
t("admin.menu.site_customization.documents"),
admin_site_customization_documents_path,
controller_name == "documents"
]
end
def moderated_content_links
section(t("admin.menu.title_moderated_content"),
active: moderated_content?, class: "moderated-content-link") do
link_list(
(hidden_proposals_link if feature?(:proposals)),
(hidden_debates_link if feature?(:debates)),
(hidden_budget_investments_link if feature?(:budgets)),
hidden_comments_link,
hidden_proposal_notifications_link,
hidden_users_link,
activity_link
)
end
end
def hidden_proposals_link
[
t("admin.menu.hidden_proposals"),
admin_hidden_proposals_path,
controller_name == "hidden_proposals"
]
end
def hidden_debates_link
[
t("admin.menu.hidden_debates"),
admin_hidden_debates_path,
controller_name == "hidden_debates"
]
end
def hidden_budget_investments_link
[
t("admin.menu.hidden_budget_investments"),
admin_hidden_budget_investments_path,
controller_name == "hidden_budget_investments"
]
end
def hidden_comments_link
[
t("admin.menu.hidden_comments"),
admin_hidden_comments_path,
controller_name == "hidden_comments"
]
end
def hidden_proposal_notifications_link
[
t("admin.menu.hidden_proposal_notifications"),
admin_hidden_proposal_notifications_path,
controller_name == "hidden_proposal_notifications"
]
end
def hidden_users_link
[
t("admin.menu.hidden_users"),
admin_hidden_users_path,
controller_name == "hidden_users"
]
end
def activity_link
[
t("admin.menu.activity"),
admin_activity_path,
controller_name == "activity"
]
end
def profiles_links
section(t("admin.menu.title_profiles"), active: profiles?, class: "profiles-link") do
link_list(
administrators_link,
organizations_link,
officials_link,
moderators_link,
valuators_link,
managers_link,
(sdg_managers_link if feature?(:sdg)),
users_link
)
end
end
def administrators_link
[
t("admin.menu.administrators"),
admin_administrators_path,
controller_name == "administrators"
]
end
def organizations_link
[
t("admin.menu.organizations"),
admin_organizations_path,
controller_name == "organizations"
]
end
def officials_link
[
t("admin.menu.officials"),
admin_officials_path,
controller_name == "officials"
]
end
def moderators_link
[
t("admin.menu.moderators"),
admin_moderators_path,
controller_name == "moderators"
]
end
def valuators_link
[
t("admin.menu.valuators"),
admin_valuators_path,
controller_name == "valuators"
]
end
def managers_link
[
t("admin.menu.managers"),
admin_managers_path,
managers?
]
end
def users_link
[
t("admin.menu.users"),
admin_users_path,
controller_name == "users"
]
end
def stats_link
[
t("admin.menu.stats"),
admin_stats_path,
controller_name == "stats",
class: "stats-link"
]
end
def settings_links
section(t("admin.menu.title_settings"), active: settings?, class: "settings-link") do
link_list(
settings_link,
tenants_link,
tags_link,
locales_link,
geozones_link,
local_census_records_link
)
end
end
def settings_link
[
t("admin.menu.settings"),
admin_settings_path,
controller_name == "settings"
]
end
def tenants_link
if can?(:read, Tenant)
[
t("admin.menu.multitenancy"),
admin_tenants_path,
controller_name == "tenants"
]
end
end
def tags_link
[
t("admin.menu.proposals_topics"),
admin_tags_path,
controller_name == "tags"
]
end
def locales_link
[
t("admin.menu.locales"),
admin_locales_path,
controller_name == "locales"
]
end
def geozones_link
[
t("admin.menu.geozones"),
admin_geozones_path,
controller_name == "geozones"
]
end
def images_link
[
t("admin.menu.site_customization.images"),
admin_site_customization_images_path,
controller_name == "images" && controller.class.module_parent != Admin::Poll::Questions::Options
]
end
def content_blocks_link
[
t("admin.menu.site_customization.content_blocks"),
admin_site_customization_content_blocks_path,
controller_name == "content_blocks"
]
end
def local_census_records_link
[
t("admin.menu.local_census_records"),
admin_local_census_records_path,
local_census_records?
]
end
def dashboard_links
section(t("admin.menu.dashboard"), active: dashboard?, class: "dashboard-link") do
link_list(
dashboard_actions_link,
administrator_tasks_link
)
end
end
def machine_learning_link
[
t("admin.menu.machine_learning"),
admin_machine_learning_path,
controller_name == "machine_learning",
class: "ml-link"
]
end
def administrator_tasks_link
[
t("admin.menu.administrator_tasks"),
admin_dashboard_administrator_tasks_path,
controller_name == "administrator_tasks"
]
end
def dashboard_actions_link
[
t("admin.menu.dashboard_actions"),
admin_dashboard_actions_path,
controller_name == "actions"
]
end
def sdg_managers_link
[
t("admin.menu.sdg_managers"),
admin_sdg_managers_path,
sdg_managers?
]
end
def section(title, **, &content)
section_opener(title, **) + content.call
end
def section_opener(title, active:, **options)
button_tag(title, { type: "button", disabled: "disabled", "aria-expanded": active }.merge(options))
end
end