* feat: add the nested sidebar with some elements * feat: create a tabbed nav item menu * feat: add the tabbed nav_item partial to the views that need tabbed nav items * fix: change variable back * feat: style the sidebar a bit more * chore: add some more styles * feat: add a spec for the nested navigational items * refactor: a more dynamic tabbed admin helper * feat: add some more nav items * fix: controller for reports * refactor: shorthand if statement * chore: add the whitespace back * refactor: rubocop fixes * chore: use any * chore: remove whitespace * refactor: rename the variable * refactor: use a DSL style admin helper * chore: variable renaming and routes * rubocop: fixes * refactor: move files to more apt places * chore: keep overview as it was previously * Update app/views/admin/secrets/index.html.erb Co-authored-by: Michael Kohl <me@citizen428.net> * Update app/views/admin/shared/_tabbed_navbar.erb Co-authored-by: Michael Kohl <me@citizen428.net> * Update app/views/admin/badges/index.html.erb Co-authored-by: Michael Kohl <me@citizen428.net> * chore: disable blocklength * refactor: move the logic to the model instead of in the view * chore: remove get_ prefix * chore: move the request mangling to a helper that finds the controller and scope * Update app/helpers/admin_helper.rb Co-authored-by: rhymes <rhymes@hey.com> * Update app/helpers/admin_helper.rb Co-authored-by: rhymes <rhymes@hey.com> * refactor: Address feedback * oops * oops use tr * feat: update specs * feat: make the navbar a dropdown * feat: add a cursor pointer to the dropdown * feat: add the icons which results in changed data structure * fix: badge achievements * feat: rename to an html file, show and collapse links + show active links * chore: rename tabbed view to an html file * fix: scope should be apps not app * feat: add icons for the admin menu * feat: increase the margin left * feat: move the overview into the feature flag block and add an icon * chore:remove files * chore: indent * feat: update crayons -link to have no text-decoration * feat: current link for a scope with one controller * Update app/lib/menu.rb Co-authored-by: Michael Kohl <me@citizen428.net> * Update app/models/admin_menu.rb Co-authored-by: Michael Kohl <me@citizen428.net> * refactor: we added svg to the builder so remove it from creating the hash * feat: undo change to crayons and add it to the admin stylesheet * Update app/views/admin/shared/_nested_sidebar.html.erb Co-authored-by: Suzanne Aitchison <suzanne@forem.com> * refactor: change to use ul and li's + a button * chore: add bracket to next line * feat: add aria-page * chore: remove brackets * feat: added focus specifically for the sidebar * Update app/views/admin/shared/_nested_sidebar.html.erb Co-authored-by: Jamie Gaskins <jgaskins@hey.com> * chore: remove additional title * chore: indent * feat: add a visibilee keyword to the payload and set it to true by default * feat: move the feature flagged routes into the correct sections * feat: check if an item is visible before rendering it * feat: amend the tabbed_navbar to be more accessible and add in visibilty checks * chore: update comment * chore: amend the styles * chore: change url to path * chore: comment * test: add more tests * Update app/assets/stylesheets/admin.scss Co-authored-by: Suzanne Aitchison <suzanne@forem.com> * Update app/views/admin/shared/_nested_sidebar.html.erb Co-authored-by: Suzanne Aitchison <suzanne@forem.com> * Update app/views/layouts/admin.html.erb Co-authored-by: Suzanne Aitchison <suzanne@forem.com> * chore: merge * feat: use focus for browsers that dont support focus-visible (I'm looking at you Safari) and move it within the crayons-link so we dont see it on mouse click * WIP: first pass of stimulus controller code * feat: interaction design * chore: remove unnecessary condiition * chore: only add transparent background when not the current link * Update app/models/admin_menu.rb Co-authored-by: Michael Kohl <me@citizen428.net> * feat; comment explaining * feat: add an id on the button to be clicked * feat: disable currentNavItem * chore: remove event params * chore: update cursor * feat: (safe fail) only show the tabbed navbar when the roures contain values form the data structure * chore: pass events through + tests * trigger an onload event and test the disabling of the menu item * refactor: tabbed menu items * feat: account for the visibility of the feature flags * chore: rubocop fixes * chore: indentation * feat: some refactors and updates for rubocop * Update app/javascript/admin/controllers/sidebar_controller.js Co-authored-by: Vaidehi Joshi <vaidehi.sj@gmail.com> * feat: set to true Co-authored-by: Michael Kohl <me@citizen428.net> Co-authored-by: rhymes <rhymes@hey.com> Co-authored-by: Suzanne Aitchison <suzanne@forem.com> Co-authored-by: Jamie Gaskins <jgaskins@hey.com> Co-authored-by: Vaidehi Joshi <vaidehi.sj@gmail.com>
109 lines
3.7 KiB
Ruby
109 lines
3.7 KiB
Ruby
# This "model" is not backed by the database. Its main purpose is to
|
|
# setup and provide methods to interact with the admin sidebar and tabbed menu
|
|
class AdminMenu
|
|
# On second level navigation with more children, we reference the default tabs controller. i.e look at developer_tools
|
|
# rubocop:disable Metrics/BlockLength
|
|
ITEMS = Menu.define do
|
|
scope :people, "group-2-line", [
|
|
item(name: "people", controller: "users"),
|
|
]
|
|
|
|
scope :content_manager, "dashboard-line", [
|
|
item(name: "posts", controller: "articles"),
|
|
item(name: "badges", children: [
|
|
item(name: "library", controller: "badges"),
|
|
item(name: "achievements", controller: "badge_achievements"),
|
|
]),
|
|
item(name: "organizations"),
|
|
item(name: "podcasts"),
|
|
item(name: "tags"),
|
|
]
|
|
|
|
scope :customization, "tools-line", [
|
|
item(name: "config"),
|
|
item(name: "html variants", controller: "html_variants"),
|
|
item(name: "display ads"),
|
|
item(name: "navigation links"),
|
|
item(name: "pages"),
|
|
item(name: "profile fields", visible: false),
|
|
]
|
|
|
|
scope :admin_team, "user-line", [
|
|
item(name: "admin team", controller: "permissions"),
|
|
]
|
|
|
|
scope :moderation, "shield-flash-line", [
|
|
item(name: "reports"),
|
|
item(name: "mods"),
|
|
item(name: "moderator actions ads", controller: "moderator_actions"),
|
|
item(name: "privileged reactions"),
|
|
# item(name: "interaction limits")
|
|
]
|
|
|
|
scope :advanced, "flashlight-line", [
|
|
item(name: "broadcasts"),
|
|
item(name: "response templates"),
|
|
item(name: "sponsorships"),
|
|
item(name: "developer tools", controller: "tools", children: [
|
|
item(name: "tools"),
|
|
item(name: "vault secrets", controller: "secrets"),
|
|
item(name: "webhooks", controller: "webhook_endpoints"),
|
|
item(name: "data update scripts", visible: false),
|
|
]),
|
|
]
|
|
|
|
scope :apps, "palette-line", [
|
|
item(name: "chat channels"),
|
|
item(name: "events"),
|
|
item(name: "listings"),
|
|
item(name: "welcome"),
|
|
]
|
|
end.freeze
|
|
# rubocop:enable Metrics/BlockLength
|
|
|
|
def self.navigation_items
|
|
return ITEMS unless FeatureFlag.enabled?(:profile_admin) || FeatureFlag.enabled?(:data_update_scripts)
|
|
|
|
feature_flagged_menu_items
|
|
end
|
|
|
|
def self.nested_menu_items(scope_name, nav_item)
|
|
return unless navigation_items.dig(scope_name.to_sym, :children)
|
|
|
|
navigation_items.dig(scope_name.to_sym, :children).each do |items|
|
|
return items if items[:controller] == nav_item
|
|
|
|
next unless items[:children]&.any?
|
|
|
|
items[:children].each do |child|
|
|
return items if child[:controller] == nav_item
|
|
end
|
|
end
|
|
end
|
|
|
|
def self.nested_menu_items_from_request(request)
|
|
scope, nav_item = request.path.split("/").last(2)
|
|
nested_menu_items(scope, nav_item)
|
|
end
|
|
|
|
def self.feature_flagged_menu_items
|
|
# We default to creating a ITEMS constant with visibility set to false
|
|
# and then simply amend the visibility of the feature flag when it's
|
|
# turned on, instead of creating the payload dynamically each time.
|
|
menu_items = ITEMS.dup
|
|
|
|
if FeatureFlag.enabled?(:profile_admin)
|
|
profile_hash = menu_items.dig(:customization, :children).detect { |item| item[:controller] == "profile_fields" }
|
|
profile_hash[:visible] = true
|
|
end
|
|
|
|
if FeatureFlag.enabled?(:data_update_scripts)
|
|
data_update_script_hash = menu_items.dig(:advanced, :children)
|
|
.detect { |item| item[:controller] == "tools" }[:children]
|
|
.detect { |item| item[:controller] == "data_update_scripts" }
|
|
data_update_script_hash[:visible] = true
|
|
end
|
|
|
|
menu_items
|
|
end
|
|
end
|