RFC#50-P4: Feature Flagged Routes and Interaction Design (#12967)
* 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>
This commit is contained in:
parent
2c1e8443e1
commit
c53cfc5951
10 changed files with 343 additions and 70 deletions
|
|
@ -189,11 +189,29 @@ label {
|
|||
min-width: 120px;
|
||||
}
|
||||
|
||||
// Navbar links have text-decorations that are being
|
||||
// rendered from boostrap. We want to remove these to be
|
||||
// consistent with links in the crayons design system.
|
||||
.admin__left-sidebar {
|
||||
.crayons-link {
|
||||
button {
|
||||
border: 0;
|
||||
width: 100%;
|
||||
|
||||
// In safari the links show up with a grey background
|
||||
&:not(.crayons-link--current) {
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.crayons-link--current {
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
|
||||
.admin__tabbed-navbar,
|
||||
.admin__left-sidebar {
|
||||
// Navbar links have text-decorations that are being
|
||||
// rendered from boostrap. We want to remove these to be
|
||||
// consistent with links in the crayons design system.
|
||||
.crayons-link,
|
||||
.crayons-tabs__item {
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
|
|
@ -213,15 +231,8 @@ label {
|
|||
}
|
||||
}
|
||||
|
||||
button {
|
||||
border: 0;
|
||||
width: 100%;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,122 @@
|
|||
import { Application } from 'stimulus';
|
||||
import SidebarController from '../../controllers/sidebar_controller';
|
||||
|
||||
describe('SidebarController', () => {
|
||||
beforeAll(() => {
|
||||
document.head.innerHTML =
|
||||
'<meta name="csrf-token" content="some-csrf-token" />';
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
document.body.innerHTML = `
|
||||
<div class="admin__left-sidebar crayons-layout__left-sidebar" data-controller="sidebar" data-action="load@window->sidebar#disableCurrentNavItem">
|
||||
<nav class="hidden m:block">
|
||||
<ul>
|
||||
<li>
|
||||
<a class="crayons-link crayons-link--block " href="/admin/permissions" aria-page="" data-action="click->sidebar#expandDropdown">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" class="dropdown-icon crayons-icon" role="img"><path d="M4 22a8 8 0 1 1 16 0h-2a6 6 0 1 0-12 0H4zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4z"></path></svg>
|
||||
Admin Team
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<button class="crayons-link crayons-link--block cursor-pointer " id="advanced_button" data-toggle="collapse" data-target="#advanced" data-target-href="/admin/advanced/broadcasts" aria-expanded="false" aria-controls="advanced" data-action="click->sidebar#expandDropdown">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" class="dropdown-icon crayons-icon" role="img"><path d="M13 9h8L11 24v-9H4l9-15v9zm-2 2V7.22L7.532 13H13v4.394L17.263 11H11z"></path></svg>
|
||||
Advanced
|
||||
</button>
|
||||
<ul id="advanced" data-sidebar-target="submenu" class="collapse hide">
|
||||
<li>
|
||||
<a class="crayons-link crayons-link--block ml-7 " href="/admin/advanced/broadcasts" aria-page="">
|
||||
Broadcasts
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="crayons-link crayons-link--block ml-7 " href="/admin/advanced/response_templates" aria-page="">
|
||||
Response Templates
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="crayons-link crayons-link--block ml-7 " href="/admin/advanced/sponsorships" aria-page="">
|
||||
Sponsorships
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="crayons-link crayons-link--block ml-7 " href="/admin/advanced/tools" aria-page="">
|
||||
Developer Tools
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<button class="crayons-link crayons-link--block cursor-pointer crayons-link--current" id="apps_button" data-toggle="collapse" data-target="#apps" data-target-href="/admin/apps/chat_channels" aria-expanded="true" aria-controls="apps" data-action="click->sidebar#expandDropdown">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" class="dropdown-icon crayons-icon" role="img"><path d="M12 2c5.522 0 10 3.978 10 8.889a5.558 5.558 0 0 1-5.556 5.555h-1.966c-.922 0-1.667.745-1.667 1.667 0 .422.167.811.422 1.1.267.3.434.689.434 1.122C13.667 21.256 12.9 22 12 22 6.478 22 2 17.522 2 12S6.478 2 12 2zm-1.189 16.111a3.664 3.664 0 0 1 3.667-3.667h1.966A3.558 3.558 0 0 0 20 10.89C20 7.139 16.468 4 12 4a8 8 0 0 0-.676 15.972 3.648 3.648 0 0 1-.513-1.86zM7.5 12a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm9 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zM12 9a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"></path></svg>
|
||||
|
||||
Apps
|
||||
</button>
|
||||
<ul id="apps" data-sidebar-target="submenu" class="expand show">
|
||||
<li>
|
||||
<a class="crayons-link crayons-link--block ml-7 fw-bold" href="/admin/apps/chat_channels" aria-page="page">
|
||||
Chat Channels
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="crayons-link crayons-link--block ml-7 " href="/admin/apps/events" aria-page="">
|
||||
Events
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="crayons-link crayons-link--block ml-7 " href="/admin/apps/listings" aria-page="">
|
||||
Listings
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="crayons-link crayons-link--block ml-7 " href="/admin/apps/welcome" aria-page="">
|
||||
Welcome
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>`;
|
||||
|
||||
const application = Application.start();
|
||||
application.register('sidebar', SidebarController);
|
||||
});
|
||||
|
||||
describe('#disableCurrentNavItem', () => {
|
||||
it('sets the disabled attribute on the open menu button', () => {
|
||||
window.dispatchEvent(new Event('load'))
|
||||
const button = document.getElementById('apps_button');
|
||||
|
||||
expect(button.getAttribute("disabled")).toEqual("true");
|
||||
});
|
||||
});
|
||||
|
||||
describe('#expandDropdown', () => {
|
||||
beforeEach(() => {
|
||||
let assignMock = jest.fn();
|
||||
|
||||
delete window.location;
|
||||
window.location = { href: assignMock };
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
window.location = location;
|
||||
});
|
||||
|
||||
it('redirects to the first child navigation item', () => {
|
||||
const button = document.getElementById('advanced_button');
|
||||
button.click();
|
||||
|
||||
expect(window.location.href).toEqual("/admin/advanced/broadcasts")
|
||||
});
|
||||
|
||||
it('closes other menu items', () => {
|
||||
const button = document.getElementById('advanced_button');
|
||||
button.click();
|
||||
|
||||
expect(document.getElementById('apps').classList).toContain("hide");
|
||||
});
|
||||
|
||||
})
|
||||
});
|
||||
35
app/javascript/admin/controllers/sidebar_controller.js
Normal file
35
app/javascript/admin/controllers/sidebar_controller.js
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
import { Controller } from 'stimulus';
|
||||
|
||||
// eslint-disable-next-line no-restricted-syntax
|
||||
export default class SidebarController extends Controller {
|
||||
static targets = [
|
||||
'submenu'
|
||||
];
|
||||
|
||||
disableCurrentNavItem() {
|
||||
const activeMenuId = this.submenuTargets.filter((item) => item.classList.contains("show"))[0].id
|
||||
const activeButton = document.getElementById(`${activeMenuId}_button`);
|
||||
activeButton.setAttribute("disabled", true)
|
||||
}
|
||||
|
||||
expandDropdown(event) {
|
||||
this.redirectToFirstChildNavItem(event);
|
||||
this.closeOtherMenus();
|
||||
}
|
||||
|
||||
redirectToFirstChildNavItem(event) {
|
||||
window.location.href = event.target.getAttribute('data-target-href');
|
||||
}
|
||||
|
||||
closeOtherMenus() {
|
||||
const expandedList = ['expand', 'show'];
|
||||
const collapsedList = ['collapse', 'hide'];
|
||||
|
||||
this.submenuTargets.map((item) => {
|
||||
if (item.classList.contains("show")) {
|
||||
item.classList.remove(...expandedList);
|
||||
item.classList.add(...collapsedList);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -17,7 +17,7 @@ class Menu
|
|||
@items[name] = { svg: "#{svg}.svg", children: children }
|
||||
end
|
||||
|
||||
def item(name:, controller: name, children: [])
|
||||
{ name: name, controller: controller.tr(" ", "_"), children: children }
|
||||
def item(name:, controller: name, children: [], visible: true)
|
||||
{ name: name, controller: controller.tr(" ", "_"), children: children, visible: visible }
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# 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
|
||||
|
|
@ -23,6 +25,7 @@ class AdminMenu
|
|||
item(name: "display ads"),
|
||||
item(name: "navigation links"),
|
||||
item(name: "pages"),
|
||||
item(name: "profile fields", visible: false),
|
||||
]
|
||||
|
||||
scope :admin_team, "user-line", [
|
||||
|
|
@ -34,7 +37,7 @@ class AdminMenu
|
|||
item(name: "mods"),
|
||||
item(name: "moderator actions ads", controller: "moderator_actions"),
|
||||
item(name: "privileged reactions"),
|
||||
# item(name: "interaction limits", controller: "" )
|
||||
# item(name: "interaction limits")
|
||||
]
|
||||
|
||||
scope :advanced, "flashlight-line", [
|
||||
|
|
@ -45,6 +48,7 @@ class AdminMenu
|
|||
item(name: "tools"),
|
||||
item(name: "vault secrets", controller: "secrets"),
|
||||
item(name: "webhooks", controller: "webhook_endpoints"),
|
||||
item(name: "data update scripts", visible: false),
|
||||
]),
|
||||
]
|
||||
|
||||
|
|
@ -54,11 +58,19 @@ class AdminMenu
|
|||
item(name: "listings"),
|
||||
item(name: "welcome"),
|
||||
]
|
||||
end
|
||||
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)
|
||||
ITEMS.dig(scope_name.to_sym, :children).each do |items|
|
||||
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?
|
||||
|
|
@ -73,4 +85,25 @@ class AdminMenu
|
|||
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
|
||||
|
|
|
|||
|
|
@ -1,34 +1,44 @@
|
|||
<% menu_items.each do |group_name, group| %>
|
||||
<li>
|
||||
<% if group[:children].length == 1 %>
|
||||
<a class="crayons-link crayons-link--block <%= "crayons-link--current" if deduced_controller(request) == group[:children][0][:controller] %>"
|
||||
href="/admin/<%= group[:children][0][:controller] %>"
|
||||
aria-page="<%= "page" if deduced_controller(request) == group[:children][0][:controller] %>"
|
||||
>
|
||||
<%= inline_svg_tag("#{group[:svg]}", aria: true, class: "dropdown-icon crayons-icon") %>
|
||||
<%= display_name(group_name) %>
|
||||
</a>
|
||||
<% if group[:children][0][:visible] %>
|
||||
<a class="crayons-link crayons-link--block <%= "crayons-link--current" if deduced_controller(request) == group[:children][0][:controller] %>"
|
||||
href="/admin/<%= group[:children][0][:controller] %>"
|
||||
aria-page="<%= "page" if deduced_controller(request) == group[:children][0][:controller] %>"
|
||||
data-action="click->sidebar#expandDropdown"
|
||||
>
|
||||
<%= inline_svg_tag(group[:svg], aria: true, class: "dropdown-icon crayons-icon") %>
|
||||
<%= display_name(group_name) %>
|
||||
</a>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<button class="crayons-link crayons-link--block cursor-pointer <%= "crayons-link--current" if deduced_scope(request) == group_name.to_s %>"
|
||||
id="<%= group_name %>_button"
|
||||
data-toggle="collapse"
|
||||
data-target="#<%= group_name %>"
|
||||
data-target-href="/admin/<%= group_name %>/<%= group[:children][0][:controller] %>"
|
||||
aria-expanded="<%= (deduced_scope(request) == group_name.to_s).to_s %>"
|
||||
aria-controls="<%= group_name %>"
|
||||
data-action="click->sidebar#expandDropdown"
|
||||
>
|
||||
<%= inline_svg_tag(group[:svg], aria: true, class: "dropdown-icon crayons-icon") %>
|
||||
<%= display_name(group_name) %>
|
||||
</button>
|
||||
<ul id="<%= group_name %>"
|
||||
class="<%= (deduced_scope(request) == group_name.to_s) ? "expand show" : "collapse hide" %>"
|
||||
data-sidebar-target="submenu"
|
||||
class="<%= deduced_scope(request) == group_name.to_s ? "expand show" : "collapse hide" %>"
|
||||
>
|
||||
<% group[:children].each do |item| %>
|
||||
<li>
|
||||
<a class="crayons-link crayons-link--block ml-7 <%= "fw-bold" if deduced_controller(request) == item[:controller].to_s %>"
|
||||
href="/admin/<%= group_name %>/<%= item[:controller] %>"
|
||||
aria-page="<%= "page" if deduced_controller(request) == item[:controller].to_s %>"
|
||||
>
|
||||
<%= item[:name].to_s.titleize %>
|
||||
</a>
|
||||
</li>
|
||||
<% if item[:visible] %>
|
||||
<li>
|
||||
<a class="crayons-link crayons-link--block ml-7 <%= "fw-bold" if deduced_controller(request) == item[:controller].to_s %>"
|
||||
href="/admin/<%= group_name %>/<%= item[:controller] %>"
|
||||
aria-page="<%= "page" if deduced_controller(request) == item[:controller].to_s %>"
|
||||
>
|
||||
<%= item[:name].to_s.titleize %>
|
||||
</a>
|
||||
</li>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</ul>
|
||||
<% end %>
|
||||
|
|
|
|||
|
|
@ -1,17 +1,21 @@
|
|||
<% nested_menu_items = AdminMenu.nested_menu_items_from_request(request) %>
|
||||
|
||||
<% if nested_menu_items[:children].any? %>
|
||||
<header class="mb-3">
|
||||
<h2 class="crayons-title"><%= nested_menu_items[:name].to_s.titleize %></h2>
|
||||
<% if menu_items.present? && menu_items[:children].any? %>
|
||||
<header class="mb-3 admin__tabbed-navbar">
|
||||
<h2 class="crayons-title"><%= menu_items[:name].to_s.titleize %></h2>
|
||||
<div class="block s:flex items-center space-between">
|
||||
<nav class="crayons-tabs crayons-tabs--wrapped">
|
||||
<% nested_menu_items[:children].each do |item| %>
|
||||
<a
|
||||
href="/admin/<%= deduced_scope(request) %>/<%= item[:controller] %>"
|
||||
class="crayons-tabs__item <%= "crayons-tabs__item--current" if deduced_controller(request)&.match?(item[:controller]) %>" <>
|
||||
<%= item[:name].to_s.titleize %>
|
||||
</a>
|
||||
<% end %>
|
||||
<nav>
|
||||
<ul class="crayons-tabs crayons-tabs--wrapped">
|
||||
<% menu_items[:children].each do |item| %>
|
||||
<% if item[:visible] %>
|
||||
<li>
|
||||
<a
|
||||
href="/admin/<%= deduced_scope(request) %>/<%= item[:controller] %>"
|
||||
class="crayons-tabs__item <%= "crayons-tabs__item--current" if deduced_controller(request)&.match?(item[:controller]) %>" <>
|
||||
<%= item[:name].to_s.titleize %>
|
||||
</a>
|
||||
</li>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@
|
|||
</header>
|
||||
|
||||
<div class="crayons-layout crayons-layout--2-cols">
|
||||
<div class="admin__left-sidebar crayons-layout__left-sidebar">
|
||||
<div class="admin__left-sidebar crayons-layout__left-sidebar" data-controller="sidebar" data-action="load@window->sidebar#disableCurrentNavItem">
|
||||
<nav class="hidden m:block">
|
||||
<% if FeatureFlag.enabled?(:admin_restructure) %>
|
||||
<ul>
|
||||
|
|
@ -61,7 +61,7 @@
|
|||
Overview
|
||||
</a>
|
||||
</li>
|
||||
<%= render "admin/shared/nested_sidebar", menu_items: AdminMenu::ITEMS %>
|
||||
<%= render "admin/shared/nested_sidebar", menu_items: AdminMenu.navigation_items %>
|
||||
</ul>
|
||||
<% else %>
|
||||
<a class="crayons-link crayons-link--block <%= "crayons-link--current" if controller.controller_name == "overview" %>" href="/admin/">
|
||||
|
|
@ -88,7 +88,7 @@
|
|||
<% if FeatureFlag.enabled?(:admin_restructure) %>
|
||||
<!-- hack to ensure that when you go to the old admin view nothing breaks -->
|
||||
<% if request.path.split("/")[-3] == "admin" %>
|
||||
<%= render "admin/shared/tabbed_navbar", menu_items: AdminMenu::ITEMS %>
|
||||
<%= render "admin/shared/tabbed_navbar", menu_items: AdminMenu.nested_menu_items_from_request(request) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
|
|
|
|||
|
|
@ -72,22 +72,6 @@ Rails.application.routes.draw do
|
|||
end
|
||||
end
|
||||
|
||||
# We do not expose the Data Update Scripts to all Forems by default.
|
||||
constraints(->(_request) { FeatureFlag.enabled?(:data_update_scripts) }) do
|
||||
resources :data_update_scripts, only: %i[index show] do
|
||||
member do
|
||||
post :force_run
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# NOTE: @citizen428 The next two resources have a temporary constraint
|
||||
# while profile generalization is still WIP
|
||||
constraints(->(_request) { FeatureFlag.enabled?(:profile_admin) }) do
|
||||
resources :profile_field_groups, only: %i[update create destroy]
|
||||
resources :profile_fields, only: %i[index update create destroy]
|
||||
end
|
||||
|
||||
# These redirects serve as a safeguard to prevent 404s for any Admins
|
||||
# who have the old badge_achievement URLs bookmarked.
|
||||
get "/badges/badge_achievements", to: redirect("/admin/badge_achievements")
|
||||
|
|
@ -153,13 +137,27 @@ Rails.application.routes.draw do
|
|||
end
|
||||
resources :webhook_endpoints, only: :index
|
||||
resources :welcome, only: %i[index create]
|
||||
|
||||
# We do not expose the Data Update Scripts to all Forems by default.
|
||||
constraints(->(_request) { FeatureFlag.enabled?(:data_update_scripts) }) do
|
||||
resources :data_update_scripts, only: %i[index show] do
|
||||
member do
|
||||
post :force_run
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# NOTE: @citizen428 The next two resources have a temporary constraint
|
||||
# while profile generalization is still WIP
|
||||
constraints(->(_request) { FeatureFlag.enabled?(:profile_admin) }) do
|
||||
resources :profile_field_groups, only: %i[update create destroy]
|
||||
resources :profile_fields, only: %i[index update create destroy]
|
||||
end
|
||||
|
||||
# @ridhwana end of routes that will be deleted once we remove the admin_restructure feature flag
|
||||
|
||||
# @ridhwana Feature Flag that implements the updated routes for the admin restructure is a work in progress.
|
||||
constraints(->(_request) { FeatureFlag.enabled?(:admin_restructure) }) do
|
||||
# People
|
||||
# get "admin/users", to: ""
|
||||
|
||||
scope path: :content_manager, as: "content_manager" do
|
||||
resources :articles, only: %i[index show update]
|
||||
resources :badges, only: %i[index edit update new create]
|
||||
|
|
@ -189,6 +187,13 @@ Rails.application.routes.draw do
|
|||
resources :html_variants, only: %i[index edit update new create show destroy]
|
||||
resources :navigation_links, only: %i[index update create destroy]
|
||||
resources :pages, only: %i[index new create edit update destroy]
|
||||
|
||||
# NOTE: @citizen428 The next two resources have a temporary constraint
|
||||
# while profile generalization is still WIP
|
||||
constraints(->(_request) { FeatureFlag.enabled?(:profile_admin) }) do
|
||||
resources :profile_field_groups, only: %i[update create destroy]
|
||||
resources :profile_fields, only: %i[index update create destroy]
|
||||
end
|
||||
end
|
||||
|
||||
scope path: :moderation, as: "moderation" do
|
||||
|
|
@ -216,6 +221,15 @@ Rails.application.routes.draw do
|
|||
end
|
||||
end
|
||||
resources :webhook_endpoints, only: :index
|
||||
|
||||
# We do not expose the Data Update Scripts to all Forems by default.
|
||||
constraints(->(_request) { FeatureFlag.enabled?(:data_update_scripts) }) do
|
||||
resources :data_update_scripts, only: %i[index show] do
|
||||
member do
|
||||
post :force_run
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
scope path: :apps do
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ RSpec.describe "admin sidebar", type: :request do
|
|||
it "shows the correct options in the sidebar when the feature flag is enabled" do
|
||||
allow(FeatureFlag).to receive(:enabled?).with(:admin_restructure).and_return(true)
|
||||
|
||||
get admin_content_manager_articles_url
|
||||
get admin_content_manager_articles_path
|
||||
|
||||
expect(response.body).to include("Content Manager")
|
||||
end
|
||||
|
|
@ -31,7 +31,7 @@ RSpec.describe "admin sidebar", type: :request do
|
|||
it "shows parent level and nested child items" do
|
||||
allow(FeatureFlag).to receive(:enabled?).with(:admin_restructure).and_return(true)
|
||||
|
||||
get admin_content_manager_articles_url
|
||||
get admin_content_manager_articles_path
|
||||
|
||||
expect(response.body).to include("Advanced")
|
||||
expect(response.body).to include("Developer Tools")
|
||||
|
|
@ -42,10 +42,54 @@ RSpec.describe "admin sidebar", type: :request do
|
|||
it "shows nested grandchildren items where applicable" do
|
||||
allow(FeatureFlag).to receive(:enabled?).with(:admin_restructure).and_return(true)
|
||||
|
||||
get admin_content_manager_badges_url
|
||||
get admin_content_manager_badges_path
|
||||
|
||||
expect(response.body).to include("Library")
|
||||
expect(response.body).to include("Achievements")
|
||||
end
|
||||
end
|
||||
|
||||
describe "profile admin feature flag" do
|
||||
before do
|
||||
allow(FeatureFlag).to receive(:enabled?).with(:admin_restructure).and_return(true)
|
||||
end
|
||||
|
||||
it "does not show the option in the sidebar when the feature flag is disabled" do
|
||||
allow(FeatureFlag).to receive(:enabled?).with(:profile_admin).and_return(false)
|
||||
|
||||
get admin_content_manager_articles_path
|
||||
|
||||
expect(response.body).not_to include("Profile Fields")
|
||||
end
|
||||
|
||||
it "shows the option in the sidebar when the feature flag is enabled" do
|
||||
allow(FeatureFlag).to receive(:enabled?).with(:profile_admin).and_return(true)
|
||||
|
||||
get admin_content_manager_articles_path
|
||||
|
||||
expect(response.body).to include("Profile Fields")
|
||||
end
|
||||
end
|
||||
|
||||
describe "data update script admin feature flag" do
|
||||
before do
|
||||
allow(FeatureFlag).to receive(:enabled?).with(:admin_restructure).and_return(true)
|
||||
end
|
||||
|
||||
it "does not show the option in the sidebar when the feature flag is disabled" do
|
||||
allow(FeatureFlag).to receive(:enabled?).with(:data_update_scripts).and_return(false)
|
||||
|
||||
get admin_advanced_tools_path
|
||||
|
||||
expect(response.body).not_to include("Data Update Scripts")
|
||||
end
|
||||
|
||||
it "shows the option in the sidebar when the feature flag is enabled" do
|
||||
allow(FeatureFlag).to receive(:enabled?).with(:data_update_scripts).and_return(true)
|
||||
|
||||
get admin_advanced_tools_path
|
||||
|
||||
expect(response.body).to include("Data Update Scripts")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue