]> BookStack Code Mirror - bookstack/blob - resources/assets/js/global.js
Updated all application urls to allow path prefix.
[bookstack] / resources / assets / js / global.js
1 "use strict";
2
3 // AngularJS - Create application and load components
4 var angular = require('angular');
5 var ngResource = require('angular-resource');
6 var ngAnimate = require('angular-animate');
7 var ngSanitize = require('angular-sanitize');
8 require('angular-ui-sortable');
9
10 // Url retrieval function
11 window.baseUrl = function(path) {
12     let basePath = document.querySelector('meta[name="base-url"]').getAttribute('content');
13     if (basePath[basePath.length-1] === '/') basePath = basePath.slice(0, basePath.length-1);
14     if (path[0] === '/') path = path.slice(1);
15     return basePath + '/' + path;
16 };
17
18 var ngApp = angular.module('bookStack', ['ngResource', 'ngAnimate', 'ngSanitize', 'ui.sortable']);
19
20 // Global Event System
21 var Events = {
22     listeners: {},
23     emit: function (eventName, eventData) {
24         if (typeof this.listeners[eventName] === 'undefined') return this;
25         var eventsToStart = this.listeners[eventName];
26         for (let i = 0; i < eventsToStart.length; i++) {
27             var event = eventsToStart[i];
28             event(eventData);
29         }
30         return this;
31     },
32     listen: function (eventName, callback) {
33         if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = [];
34         this.listeners[eventName].push(callback);
35         return this;
36     }
37 };
38 window.Events = Events;
39
40
41 var services = require('./services')(ngApp, Events);
42 var directives = require('./directives')(ngApp, Events);
43 var controllers = require('./controllers')(ngApp, Events);
44
45 //Global jQuery Config & Extensions
46
47 // Smooth scrolling
48 jQuery.fn.smoothScrollTo = function () {
49     if (this.length === 0) return;
50     $('body').animate({
51         scrollTop: this.offset().top - 60 // Adjust to change final scroll position top margin
52     }, 800); // Adjust to change animations speed (ms)
53     return this;
54 };
55
56 // Making contains text expression not worry about casing
57 $.expr[":"].contains = $.expr.createPseudo(function (arg) {
58     return function (elem) {
59         return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
60     };
61 });
62
63 // Global jQuery Elements
64 $(function () {
65
66     var notifications = $('.notification');
67     var successNotification = notifications.filter('.pos');
68     var errorNotification = notifications.filter('.neg');
69     var warningNotification = notifications.filter('.warning');
70     // Notification Events
71     window.Events.listen('success', function (text) {
72         successNotification.hide();
73         successNotification.find('span').text(text);
74         setTimeout(() => {
75             successNotification.show();
76         }, 1);
77     });
78     window.Events.listen('warning', function (text) {
79         warningNotification.find('span').text(text);
80         warningNotification.show();
81     });
82     window.Events.listen('error', function (text) {
83         errorNotification.find('span').text(text);
84         errorNotification.show();
85     });
86
87     // Notification hiding
88     notifications.click(function () {
89         $(this).fadeOut(100);
90     });
91
92     // Chapter page list toggles
93     $('.chapter-toggle').click(function (e) {
94         e.preventDefault();
95         $(this).toggleClass('open');
96         $(this).closest('.chapter').find('.inset-list').slideToggle(180);
97     });
98
99     // Back to top button
100     $('#back-to-top').click(function() {
101          $('#header').smoothScrollTo();
102     });
103     var scrollTopShowing = false;
104     var scrollTop = document.getElementById('back-to-top');
105     var scrollTopBreakpoint = 1200;
106     window.addEventListener('scroll', function() {
107         if (!scrollTopShowing && document.body.scrollTop > scrollTopBreakpoint) {
108             scrollTop.style.display = 'block';
109             scrollTopShowing = true;
110             setTimeout(() => {
111                 scrollTop.style.opacity = 0.4;
112             }, 1);
113         } else if (scrollTopShowing && document.body.scrollTop < scrollTopBreakpoint) {
114             scrollTop.style.opacity = 0;
115             scrollTopShowing = false;
116             setTimeout(() => {
117                 scrollTop.style.display = 'none';
118             }, 500);
119         }
120     });
121
122     // Common jQuery actions
123     $('[data-action="expand-entity-list-details"]').click(function() {
124         $('.entity-list.compact').find('p').not('.empty-text').slideToggle(240);
125     });
126
127
128 });
129
130 // Page specific items
131 require('./pages/page-show');