123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- import $ from 'jquery';
- import Scrollbar from './scrollbar';
- import Map from 'es6-map';
- const MOBILE_BREAKPOINT = 48 - 0.062;
- const DESKTOP_BREAKPOINT = 75 + 0.063;
- const EVENTS = 'touchstart._grav click._grav';
- const TARGETS = '[data-sidebar-mobile-toggle], #overlay';
- const MOBILE_QUERY = `(max-width: ${MOBILE_BREAKPOINT}em)`;
- const DESKTOP_QUERY = `(min-width: ${DESKTOP_BREAKPOINT}em)`;
- let map = new Map();
- export default class Sidebar {
- constructor() {
- this.timeout = null;
- this.isOpen = false;
- this.body = $('body');
- this.matchMedia = global.matchMedia(MOBILE_QUERY);
- this.scroller = new Scrollbar('.admin-menu-wrapper', { autoshow: true });
- this.enable();
- }
- enable() {
- const sidebar = $('#admin-sidebar');
- this.matchMedia.addListener(this._getBound('checkMatch'));
- this.checkMatch(this.matchMedia);
- this.body.on(EVENTS, '[data-sidebar-toggle]', this._getBound('toggleSidebarState'));
- if (sidebar.data('quickopen')) {
- sidebar.hover(this._getBound('quickOpenIn'), this._getBound('quickOpenOut'));
- }
- }
- disable() {
- const sidebar = $('#admin-sidebar');
- this.close();
- this.matchMedia.removeListener(this._getBound('checkMatch'));
- this.body.off(EVENTS, '[data-sidebar-toggle]', this._getBound('toggleSidebarState'));
- if (sidebar.data('quickopen')) {
- sidebar.off('mouseenter mouseleave');
- }
- }
- attach() {
- this.body.on(EVENTS, TARGETS, this._getBound('toggle'));
- }
- detach() {
- this.body.off(EVENTS, TARGETS, this._getBound('toggle'));
- }
- quickOpenIn(/* event */) {
- let isDesktop = global.matchMedia(DESKTOP_QUERY).matches;
- let delay = $('#admin-sidebar').data('quickopen-delay') || 500;
- if (this.body.hasClass('sidebar-mobile-open')) { return; }
- let shouldQuickOpen = isDesktop ? this.body.hasClass('sidebar-closed') : !this.body.hasClass('sidebar-open');
- if (!shouldQuickOpen && !this.body.hasClass('sidebar-quickopen')) { return this.quickOpenOut(); }
- this.timeout = setTimeout(() => {
- this.body.addClass('sidebar-open sidebar-quickopen');
- $(global).trigger('sidebar_state._grav', isDesktop);
- }, delay);
- }
- quickOpenOut(/* event */) {
- clearTimeout(this.timeout);
- if (this.body.hasClass('sidebar-quickopen')) {
- this.body.removeClass('sidebar-open sidebar-quickopen');
- }
- return true;
- }
- open(event) {
- if (event) { event.preventDefault(); }
- let overlay = $('#overlay');
- let sidebar = $('#admin-sidebar');
- let scrollbar = $('#admin-menu').data('scrollbar');
- this.body.addClass('sidebar-mobile-open');
- overlay.css('display', 'block');
- sidebar.css('display', 'block').animate({
- opacity: 1
- }, 200, () => { this.isOpen = true; });
- if (scrollbar) { scrollbar.update(); }
- }
- close(event) {
- if (event) { event.preventDefault(); }
- let overlay = $('#overlay');
- let sidebar = $('#admin-sidebar');
- let scrollbar = $('#admin-menu').data('scrollbar');
- this.body.removeClass('sidebar-mobile-open');
- overlay.css('display', 'none');
- sidebar.animate({
- opacity: 0
- }, 200, () => {
- sidebar.css('display', 'none');
- this.isOpen = false;
- });
- if (scrollbar) { scrollbar.update(); }
- }
- toggle(event) {
- if (event) { event.preventDefault(); }
- return this[this.isOpen ? 'close' : 'open'](event);
- }
- toggleSidebarState(event) {
- if (event) { event.preventDefault(); }
- clearTimeout(this.timeout);
- let isDesktop = global.matchMedia(DESKTOP_QUERY).matches;
- if (isDesktop) {
- this.body.removeClass('sidebar-open');
- }
- if (!isDesktop) {
- this.body.removeClass('sidebar-closed');
- this.body.removeClass('sidebar-mobile-open');
- }
- this.body.toggleClass(`sidebar-${isDesktop ? 'closed' : 'open'}`);
- $(global).trigger('sidebar_state._grav', isDesktop);
- }
- checkMatch(data) {
- let sidebar = $('#admin-sidebar');
- let overlay = $('#overlay');
- this.isOpen = false;
- overlay.css('display', 'none');
- sidebar.css({
- display: data.matches ? 'none' : 'inherit',
- opacity: data.matches ? 0 : 1
- });
- if (data.matches) {
- this.body.removeClass('sidebar-open sidebar-closed');
- }
- this[data.matches ? 'attach' : 'detach']();
- }
- _getBound(fn) {
- if (map.has(fn)) {
- return map.get(fn);
- }
- return map.set(fn, this[fn].bind(this)).get(fn);
- }
- }
- export let Instance = new Sidebar();
|