Implement sidebar collapse with stimulus.

This commit is contained in:
Jan Böhmer 2022-07-31 22:07:27 +02:00
parent ab179a8b71
commit 565cb3a790
5 changed files with 79 additions and 109 deletions

View file

@ -0,0 +1,73 @@
import {Controller} from "@hotwired/stimulus";
const STORAGE_KEY = 'hide_sidebar';
export default class extends Controller {
/**
* The element representing the sidebar which can be hidden.
* @type {HTMLElement}
* @private
*/
_sidebar;
/**
* The element of the container which is expanded to the full width.
* @type {HTMLElement}
* @private
*/
_container;
/**
* The button which toggles the sidebar.
* @private
*/
_toggle_button;
_hidden = false;
connect() {
this._sidebar = document.getElementById('fixed-sidebar');
this._container = document.getElementById('main');
this._toggle_button = this.element;
//Make the state persistent over reloads
if(localStorage.getItem(STORAGE_KEY) === 'true') {
sidebarHide();
}
}
hideSidebar() {
this._sidebar.classList.add('d-none');
this._container.classList.remove(...['col-md-9', 'col-lg-10', 'offset-md-3', 'offset-lg-2']);
this._container.classList.add('col-12');
//Change button icon
this._toggle_button.innerHTML = '<i class="fas fa-angle-right"></i>';
localStorage.setItem(STORAGE_KEY, 'true');
this._hidden = true;
}
showSidebar() {
this._sidebar.classList.remove('d-none');
this._container.classList.remove('col-12');
this._container.classList.add(...['col-md-9', 'col-lg-10', 'offset-md-3', 'offset-lg-2']);
//Change button icon
this._toggle_button.innerHTML = '<i class="fas fa-angle-left"></i>';
localStorage.setItem(STORAGE_KEY, 'false');
this._hidden = false;
}
toggleSidebar() {
if(this._hidden) {
this.showSidebar();
} else {
this.hideSidebar();
}
}
}

View file

@ -40,7 +40,6 @@ import '@fortawesome/fontawesome-free/css/all.css'
require('bootstrap');
import "./sidebar"
import "./datatables";
import "./error_handler";
import "./tab_remember";

View file

@ -1,60 +0,0 @@
'use strict';
import "patternfly-bootstrap-treeview/src/css/bootstrap-treeview.css"
import "patternfly-bootstrap-treeview";
class SidebarHelper {
constructor() {
this.BASE = $("body").data("base-url");
//If path doesn't end with slash, add it.
if(this.BASE[this.BASE.length - 1] !== '/') {
this.BASE = this.BASE + '/';
}
console.info("Base path is " + this.BASE);
this.registerSidebarHideButton();
//this.fillTrees();
}
registerSidebarHideButton()
{
let $sidebar = $("#fixed-sidebar");
let $container = $("#main");
let $toggler = $('#sidebar-toggle-button');
function sidebarHide() {
$sidebar.hide();
$container.removeClass('col-md-9 col-lg-10 offset-md-3 offset-lg-2');
$container.addClass('col-12');
$toggler.html('<i class="fas fa-angle-right"></i>');
$toggler.data('hidden', true);
localStorage.setItem('sidebarHidden', 'true');
}
function sidebarShow() {
let $sidebar = $("#fixed-sidebar");
$sidebar.show();
let $container = $("#main");
$container.removeClass('col-12');
$container.addClass('col-md-9 col-lg-10 offset-md-3 offset-lg-2');
$toggler.html('<i class="fas fa-angle-left"></i>');
$toggler.data('hidden', false);
localStorage.setItem('sidebarHidden', 'false');
}
//Make the state persistent over reloads
if(localStorage.getItem('sidebarHidden') === 'true') {
sidebarHide();
}
//Register handler
$toggler.click(function() {
if($(this).data('hidden')) {
sidebarShow();
} else {
sidebarHide();
}
});
}
}
export default new SidebarHelper();