* 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>
122 lines
5.5 KiB
JavaScript
122 lines
5.5 KiB
JavaScript
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");
|
|
});
|
|
|
|
})
|
|
});
|