X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/78564ec61dfe57ebb362eda21466ced6efaef276..refs/pull/474/head:/resources/assets/js/global.js diff --git a/resources/assets/js/global.js b/resources/assets/js/global.js index d4fe7020b..28d1e3b0c 100644 --- a/resources/assets/js/global.js +++ b/resources/assets/js/global.js @@ -1,127 +1,101 @@ "use strict"; +require("babel-polyfill"); + +// Url retrieval function +window.baseUrl = function(path) { + let basePath = document.querySelector('meta[name="base-url"]').getAttribute('content'); + if (basePath[basePath.length-1] === '/') basePath = basePath.slice(0, basePath.length-1); + if (path[0] === '/') path = path.slice(1); + return basePath + '/' + path; +}; + +const Vue = require("vue"); +const axios = require("axios"); + +let axiosInstance = axios.create({ + headers: { + 'X-CSRF-TOKEN': document.querySelector('meta[name=token]').getAttribute('content'), + 'baseURL': window.baseUrl('') + } +}); +window.$http = axiosInstance; +Vue.prototype.$http = axiosInstance; + // AngularJS - Create application and load components -var angular = require('angular'); -var ngResource = require('angular-resource'); -var ngAnimate = require('angular-animate'); -var ngSanitize = require('angular-sanitize'); -require('angular-ui-sortable'); +const angular = require("angular"); +require("angular-resource"); +require("angular-animate"); +require("angular-sanitize"); +require("angular-ui-sortable"); -var ngApp = angular.module('bookStack', ['ngResource', 'ngAnimate', 'ngSanitize', 'ui.sortable']); +let ngApp = angular.module('bookStack', ['ngResource', 'ngAnimate', 'ngSanitize', 'ui.sortable']); + +// Translation setup +// Creates a global function with name 'trans' to be used in the same way as Laravel's translation system +const Translations = require("./translations"); +let translator = new Translations(window.translations); +window.trans = translator.get.bind(translator); // Global Event System -var Events = { - listeners: {}, - emit: function (eventName, eventData) { +class EventManager { + constructor() { + this.listeners = {}; + } + + emit(eventName, eventData) { if (typeof this.listeners[eventName] === 'undefined') return this; - var eventsToStart = this.listeners[eventName]; + let eventsToStart = this.listeners[eventName]; for (let i = 0; i < eventsToStart.length; i++) { - var event = eventsToStart[i]; + let event = eventsToStart[i]; event(eventData); } return this; - }, - listen: function (eventName, callback) { + } + + listen(eventName, callback) { if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = []; this.listeners[eventName].push(callback); return this; } -}; -window.Events = Events; +} + +window.Events = new EventManager(); +Vue.prototype.$events = window.Events; -var services = require('./services')(ngApp, Events); -var directives = require('./directives')(ngApp, Events); -var controllers = require('./controllers')(ngApp, Events); +require("./vues/vues"); +require("./components"); + +// Load in angular specific items +const Directives = require('./directives'); +const Controllers = require('./controllers'); +Directives(ngApp, window.Events); +Controllers(ngApp, window.Events); //Global jQuery Config & Extensions // Smooth scrolling jQuery.fn.smoothScrollTo = function () { if (this.length === 0) return; - $('body').animate({ + $('html, body').animate({ scrollTop: this.offset().top - 60 // Adjust to change final scroll position top margin - }, 800); // Adjust to change animations speed (ms) + }, 300); // Adjust to change animations speed (ms) return this; }; // Making contains text expression not worry about casing -$.expr[":"].contains = $.expr.createPseudo(function (arg) { +jQuery.expr[":"].contains = $.expr.createPseudo(function (arg) { return function (elem) { return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; }; }); -// Global jQuery Elements -$(function () { - - var notifications = $('.notification'); - var successNotification = notifications.filter('.pos'); - var errorNotification = notifications.filter('.neg'); - var 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(); - }); - var scrollTopShowing = false; - var scrollTop = document.getElementById('back-to-top'); - var scrollTopBreakpoint = 1200; - window.addEventListener('scroll', function() { - if (!scrollTopShowing && document.body.scrollTop > scrollTopBreakpoint) { - scrollTop.style.display = 'block'; - scrollTopShowing = true; - setTimeout(() => { - scrollTop.style.opacity = 0.4; - }, 1); - } else if (scrollTopShowing && document.body.scrollTop < 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').slideToggle(240); - }); - - -}); - - -function elemExists(selector) { - return document.querySelector(selector) !== null; +// Detect IE for css +if(navigator.userAgent.indexOf('MSIE')!==-1 + || navigator.appVersion.indexOf('Trident/') > 0 + || navigator.userAgent.indexOf('Safari') !== -1){ + document.body.classList.add('flexbox-support'); } // Page specific items -require('./pages/page-show'); +require("./pages/page-show");