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