X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/a663fc8aa83f51db45bb0707c463fc80941d6104..refs/pull/494/head:/resources/assets/js/global.js diff --git a/resources/assets/js/global.js b/resources/assets/js/global.js index 3a288f791..26dbf9a5e 100644 --- a/resources/assets/js/global.js +++ b/resources/assets/js/global.js @@ -1,4 +1,6 @@ "use strict"; +require("babel-polyfill"); +require('./dom-polyfills'); // Url retrieval function window.baseUrl = function(path) { @@ -8,6 +10,33 @@ window.baseUrl = function(path) { return basePath + '/' + path; }; +// Global Event System +class EventManager { + constructor() { + this.listeners = {}; + this.stack = []; + } + + emit(eventName, eventData) { + this.stack.push({name: eventName, data: eventData}); + if (typeof this.listeners[eventName] === 'undefined') return this; + let eventsToStart = this.listeners[eventName]; + for (let i = 0; i < eventsToStart.length; i++) { + let event = eventsToStart[i]; + event(eventData); + } + return this; + } + + listen(eventName, callback) { + if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = []; + this.listeners[eventName].push(callback); + return this; + } +} + +window.$events = new EventManager(); + const Vue = require("vue"); const axios = require("axios"); @@ -17,10 +46,17 @@ let axiosInstance = axios.create({ 'baseURL': window.baseUrl('') } }); +axiosInstance.interceptors.request.use(resp => { + return resp; +}, err => { + if (typeof err.response === "undefined" || typeof err.response.data === "undefined") return Promise.reject(err); + if (typeof err.response.data.error !== "undefined") window.$events.emit('error', err.response.data.error); + if (typeof err.response.data.message !== "undefined") window.$events.emit('error', err.response.data.message); +}); +window.$http = axiosInstance; Vue.prototype.$http = axiosInstance; - -require("./vues/vues"); +Vue.prototype.$events = window.$events; // AngularJS - Create application and load components @@ -38,39 +74,15 @@ const Translations = require("./translations"); let translator = new Translations(window.translations); window.trans = translator.get.bind(translator); -// Global Event System -class EventManager { - constructor() { - this.listeners = {}; - } - - emit(eventName, eventData) { - if (typeof this.listeners[eventName] === 'undefined') return this; - let eventsToStart = this.listeners[eventName]; - for (let i = 0; i < eventsToStart.length; i++) { - let event = eventsToStart[i]; - event(eventData); - } - return this; - } - - listen(eventName, callback) { - if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = []; - this.listeners[eventName].push(callback); - return this; - } -} -window.Events = new EventManager(); -Vue.prototype.$events = window.Events; +require("./vues/vues"); +require("./components"); // Load in angular specific items -const Services = require('./services'); const Directives = require('./directives'); const Controllers = require('./controllers'); -Services(ngApp, window.Events); -Directives(ngApp, window.Events); -Controllers(ngApp, window.Events); +Directives(ngApp, window.$events); +Controllers(ngApp, window.$events); //Global jQuery Config & Extensions @@ -90,90 +102,24 @@ jQuery.expr[":"].contains = $.expr.createPseudo(function (arg) { }; }); -// Global jQuery Elements -let notifications = $('.notification'); -let successNotification = notifications.filter('.pos'); -let errorNotification = notifications.filter('.neg'); -let warningNotification = notifications.filter('.warning'); -// Notification Events -window.Events.listen('success', function (text) { - successNotification.hide(); - successNotification.find('span').text(text); - setTimeout(() => { - successNotification.show(); - }, 1); -}); -window.Events.listen('warning', function (text) { - warningNotification.find('span').text(text); - warningNotification.show(); -}); -window.Events.listen('error', function (text) { - errorNotification.find('span').text(text); - errorNotification.show(); -}); - -// Notification hiding -notifications.click(function () { - $(this).fadeOut(100); -}); - -// Chapter page list toggles -$('.chapter-toggle').click(function (e) { - e.preventDefault(); - $(this).toggleClass('open'); - $(this).closest('.chapter').find('.inset-list').slideToggle(180); -}); - -// Back to top button -$('#back-to-top').click(function() { - $('#header').smoothScrollTo(); -}); -let scrollTopShowing = false; -let scrollTop = document.getElementById('back-to-top'); -let scrollTopBreakpoint = 1200; -window.addEventListener('scroll', function() { - let scrollTopPos = document.documentElement.scrollTop || document.body.scrollTop || 0; - if (!scrollTopShowing && scrollTopPos > scrollTopBreakpoint) { - scrollTop.style.display = 'block'; - scrollTopShowing = true; - setTimeout(() => { - scrollTop.style.opacity = 0.4; - }, 1); - } else if (scrollTopShowing && scrollTopPos < scrollTopBreakpoint) { - scrollTop.style.opacity = 0; - scrollTopShowing = false; - setTimeout(() => { - scrollTop.style.display = 'none'; - }, 500); - } -}); - // Common jQuery actions $('[data-action="expand-entity-list-details"]').click(function() { $('.entity-list.compact').find('p').not('.empty-text').slideToggle(240); }); -// Toggle thumbnails +// Toggle thumbnail::hide image and reduce grid size $(document).ready(function(){ $('[data-action="expand-thumbnail"]').click(function(){ - $('.galleryItem').toggleClass("collapse").find('img').slideToggle(50); + $('.gallery-item').toggleClass("collapse").find('img').slideToggle(50); }); }); -// Popup close -$('.popup-close').click(function() { - $(this).closest('.overlay').fadeOut(240); -}); -$('.overlay').click(function(event) { - if (!$(event.target).hasClass('overlay')) return; - $(this).fadeOut(240); -}); // Detect IE for css if(navigator.userAgent.indexOf('MSIE')!==-1 || navigator.appVersion.indexOf('Trident/') > 0 || navigator.userAgent.indexOf('Safari') !== -1){ - $('body').addClass('flexbox-support'); + document.body.classList.add('flexbox-support'); } // Page specific items