- added new "rallyPoke" column to "system" table, #279
- fixed "rally point" desktop notifications, #279 - updated/fixed "pnotify" library 2.0.1 -> 3.0.0, #279 - moved some "map util" functions from map.js -> map/util.js
This commit is contained in:
@@ -115,6 +115,11 @@ class SystemModel extends BasicModel {
|
||||
'type' => Schema::DT_TIMESTAMP,
|
||||
'default' => null
|
||||
],
|
||||
'rallyPoke' => [
|
||||
'type' => Schema::DT_BOOL,
|
||||
'nullable' => false,
|
||||
'default' => 0
|
||||
],
|
||||
'description' => [
|
||||
'type' => Schema::DT_VARCHAR512,
|
||||
'nullable' => false,
|
||||
@@ -234,6 +239,7 @@ class SystemModel extends BasicModel {
|
||||
|
||||
$systemData->locked = $this->locked;
|
||||
$systemData->rallyUpdated = strtotime($this->rallyUpdated);
|
||||
$systemData->rallyPoke = $this->rallyPoke;
|
||||
$systemData->description = $this->description;
|
||||
|
||||
$systemData->statics = $this->getStaticWormholeData();
|
||||
|
||||
@@ -63,7 +63,7 @@ requirejs.config({
|
||||
'datatables.net-select': 'lib/datatables/Select-1.2.0/js/dataTables.select.min',
|
||||
|
||||
// notification plugin
|
||||
pnotify: 'lib/pnotify/pnotify.core', // v2.0.1 PNotify - notification core file
|
||||
pnotify: 'lib/pnotify/pnotify', // v3.0.0 PNotify - notification core file - https://sciactive.com/pnotify/
|
||||
'pnotify.buttons': 'lib/pnotify/pnotify.buttons', // PNotify - buttons notification extension
|
||||
'pnotify.confirm': 'lib/pnotify/pnotify.confirm', // PNotify - confirmation notification extension
|
||||
'pnotify.nonblock': 'lib/pnotify/pnotify.nonblock', // PNotify - notification non-block extension (hover effect)
|
||||
|
||||
@@ -66,9 +66,6 @@ define([
|
||||
systemDialogId: 'pf-system-dialog', // id for system dialog
|
||||
systemDialogSelectClass: 'pf-system-dialog-select', // class for system select Element
|
||||
|
||||
// local storage
|
||||
mapLocalStoragePrefix: 'map_', // prefix for map local storage key
|
||||
|
||||
// system security classes
|
||||
systemSec: 'pf-system-sec',
|
||||
systemSecHigh: 'pf-system-sec-highSec',
|
||||
@@ -450,68 +447,6 @@ define([
|
||||
system.addClass( statusClass );
|
||||
};
|
||||
|
||||
/**
|
||||
* set or change rallyPoint for systems
|
||||
* @param rallyUpdated
|
||||
* @param options
|
||||
* @returns {*}
|
||||
*/
|
||||
$.fn.setSystemRally = function(rallyUpdated, options){
|
||||
rallyUpdated = rallyUpdated || 0;
|
||||
|
||||
var defaultOptions = {
|
||||
poke: false,
|
||||
hideNotification: false,
|
||||
hideCounter: false,
|
||||
};
|
||||
options = $.extend({}, defaultOptions, options);
|
||||
|
||||
return this.each(function(){
|
||||
var system = $(this);
|
||||
var rally = system.data('rallyUpdated') || 0;
|
||||
|
||||
if(rallyUpdated !== rally){
|
||||
// rally status changed
|
||||
if( !options.hideCounter ){
|
||||
system.getMapOverlay('timer').startMapUpdateCounter();
|
||||
}
|
||||
|
||||
var rallyClass = MapUtil.getInfoForSystem('rally', 'class');
|
||||
|
||||
if(rallyUpdated > 0){
|
||||
// new rally point set
|
||||
system.addClass( rallyClass );
|
||||
|
||||
if( !options.hideNotification ){
|
||||
var systemName = system.getSystemInfo( ['alias'] );
|
||||
|
||||
var notificationOptions = {
|
||||
title: 'Rally Point',
|
||||
text: 'System: ' + systemName,
|
||||
type: 'success'
|
||||
};
|
||||
|
||||
if(options.poke){
|
||||
// desktop poke
|
||||
Util.showNotify(notificationOptions, {desktop: true, stack: 'barBottom'});
|
||||
}else{
|
||||
Util.showNotify(notificationOptions, {stack: 'barBottom'});
|
||||
}
|
||||
}
|
||||
}else{
|
||||
// rally point removed
|
||||
system.removeClass( rallyClass );
|
||||
|
||||
if( !options.hideNotification ){
|
||||
Util.showNotify({title: 'Rally point removed', type: 'success'});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
system.data('rallyUpdated', rallyUpdated);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* returns a new system or updates an existing system
|
||||
* @param map
|
||||
@@ -669,6 +604,7 @@ define([
|
||||
|
||||
// rally system
|
||||
system.setSystemRally(data.rallyUpdated, {
|
||||
poke: data.rallyPoke || false,
|
||||
hideNotification: true,
|
||||
hideCounter: true,
|
||||
});
|
||||
@@ -1904,7 +1840,7 @@ define([
|
||||
}
|
||||
},
|
||||
setRallyPoke: {
|
||||
label: '<i class="fa fa-fw fa-bullhorn"></i> Set rally and poke',
|
||||
label: '<i class="fa fa-fw fa-bullhorn"></i> set rally and poke',
|
||||
className: 'btn-primary',
|
||||
callback: function() {
|
||||
currentSystem.setSystemRally(1, {
|
||||
@@ -1914,7 +1850,7 @@ define([
|
||||
}
|
||||
},
|
||||
success: {
|
||||
label: '<i class="fa fa-fw fa-check"></i> save',
|
||||
label: '<i class="fa fa-fw fa-users"></i> set rally',
|
||||
className: 'btn-success',
|
||||
callback: function() {
|
||||
currentSystem.setSystemRally(1);
|
||||
@@ -2500,7 +2436,7 @@ define([
|
||||
if(component.data('locked') === true){
|
||||
activeOptions.push('lock_system');
|
||||
}
|
||||
if(component.data('rally') === true){
|
||||
if(component.data('rallyUpdated') > 0){
|
||||
activeOptions.push('set_rally');
|
||||
}
|
||||
}
|
||||
@@ -2623,7 +2559,6 @@ define([
|
||||
* @returns {*}
|
||||
*/
|
||||
$.fn.getSystemInfo = function(info){
|
||||
|
||||
var systemInfo = [];
|
||||
|
||||
for(var i = 0; i < info.length; i++){
|
||||
@@ -3118,6 +3053,7 @@ define([
|
||||
};
|
||||
systemData.locked = system.data('locked') ? 1 : 0;
|
||||
systemData.rallyUpdated = system.data('rallyUpdated') || 0;
|
||||
systemData.rallyPoke = system.data('rallyPoke') ? 1 : 0;
|
||||
systemData.currentUser = system.data('currentUser'); // if user is currently in this system
|
||||
systemData.statics = system.data('statics');
|
||||
systemData.updated = {
|
||||
@@ -3337,7 +3273,7 @@ define([
|
||||
var mapWrapper = mapContainer.parents('.' + config.mapWrapperClass);
|
||||
|
||||
// auto scroll map to previous position
|
||||
var promiseStore = getMapData( mapContainer.data('id') );
|
||||
var promiseStore = MapUtil.getMapData( mapContainer.data('id') );
|
||||
promiseStore.then(function(data) {
|
||||
// This code runs once the value has been loaded
|
||||
// from the offline store.
|
||||
@@ -3365,46 +3301,6 @@ define([
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* get stored map data from client cache (IndexedDB)
|
||||
* @param mapId
|
||||
* @returns {*} promise
|
||||
*/
|
||||
var getMapData = function(mapId){
|
||||
if(mapId > 0){
|
||||
var mapStorageKey = config.mapLocalStoragePrefix + mapId;
|
||||
return Util.localforage.getItem(mapStorageKey);
|
||||
}else{
|
||||
console.error('Map local storage requires mapId > 0');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* store local map config to client cache (IndexedDB)
|
||||
* @param mapId
|
||||
* @param key
|
||||
* @param value
|
||||
*/
|
||||
var storeMapData = function(mapId, key, value){
|
||||
if(mapId > 0){
|
||||
// get current map config
|
||||
var mapStorageKey = config.mapLocalStoragePrefix + mapId;
|
||||
Util.localforage.getItem(mapStorageKey).then(function(data) {
|
||||
// This code runs once the value has been loaded
|
||||
// from the offline store.
|
||||
data = (data === null) ? {} : data;
|
||||
// set/update value
|
||||
data[key] = value;
|
||||
Util.localforage.setItem(mapStorageKey, data);
|
||||
}).catch(function(err) {
|
||||
// This code runs if there were any errors
|
||||
console.error('Map local storage can not be accessed!');
|
||||
});
|
||||
}else{
|
||||
console.error('Map local storage requires mapId > 0');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* init scrollbar for Map element
|
||||
*/
|
||||
@@ -3418,7 +3314,7 @@ define([
|
||||
// scroll complete
|
||||
var mapElement = $(this).find('.' + config.mapClass);
|
||||
// store new map scrollOffset -> localDB
|
||||
storeMapData( mapElement.data('id'), 'offsetX', Math.abs(this.mcs.left) );
|
||||
MapUtil.storeMapData( mapElement.data('id'), 'offsetX', Math.abs(this.mcs.left) );
|
||||
},
|
||||
onScrollStart: function(){
|
||||
// hide all open xEditable fields
|
||||
|
||||
@@ -9,6 +9,11 @@ define([
|
||||
], function($, Init, Util) {
|
||||
'use strict';
|
||||
|
||||
var config = {
|
||||
// local storage
|
||||
mapLocalStoragePrefix: 'map_', // prefix for map local storage key
|
||||
};
|
||||
|
||||
/**
|
||||
* get all available map Types
|
||||
* optional they can be filtered by current access level of a user
|
||||
@@ -326,6 +331,171 @@ define([
|
||||
return scopeInfo;
|
||||
};
|
||||
|
||||
/**
|
||||
* set or change rallyPoint for systems
|
||||
* @param rallyUpdated
|
||||
* @param options
|
||||
* @returns {*}
|
||||
*/
|
||||
$.fn.setSystemRally = function(rallyUpdated, options){
|
||||
rallyUpdated = rallyUpdated || 0;
|
||||
var rallyPoke = false;
|
||||
|
||||
var defaultOptions = {
|
||||
poke: false,
|
||||
hideNotification: false,
|
||||
hideCounter: false,
|
||||
};
|
||||
options = $.extend({}, defaultOptions, options);
|
||||
|
||||
return this.each(function(){
|
||||
var system = $(this);
|
||||
var rally = system.data('rallyUpdated') || 0;
|
||||
|
||||
if(rallyUpdated !== rally){
|
||||
// rally status changed
|
||||
if( !options.hideCounter ){
|
||||
system.getMapOverlay('timer').startMapUpdateCounter();
|
||||
}
|
||||
|
||||
var rallyClass = getInfoForSystem('rally', 'class');
|
||||
|
||||
if(rallyUpdated > 0){
|
||||
// new rally point set OR update system with rally information
|
||||
|
||||
system.addClass( rallyClass );
|
||||
// rallyUpdated > 0 is required for poke!
|
||||
rallyPoke = options.poke;
|
||||
|
||||
var notificationOptions = {
|
||||
title: 'Rally Point',
|
||||
text: 'System: ' + system.data('name')
|
||||
};
|
||||
|
||||
if(rallyUpdated === 1){
|
||||
// rally point not saved on DB
|
||||
notificationOptions.type = 'success';
|
||||
Util.showNotify(notificationOptions);
|
||||
}else if(options.poke){
|
||||
// rally saved AND poke option active
|
||||
|
||||
// check if desktop notification was already send
|
||||
var mapId = system.data('mapid');
|
||||
var systemId = system.data('id');
|
||||
var promiseStore = getMapData(mapId);
|
||||
promiseStore.then(function(data) {
|
||||
// This code runs once the value has been loaded
|
||||
// from the offline store.
|
||||
var rallyPokeData = {};
|
||||
|
||||
if(
|
||||
data &&
|
||||
data.rallyPoke
|
||||
){
|
||||
// poke data exists
|
||||
rallyPokeData = data.rallyPoke;
|
||||
}
|
||||
|
||||
if(
|
||||
!rallyPokeData.hasOwnProperty(this.systemId) || // rally poke was not already send to client
|
||||
rallyPokeData[this.systemId] !== rallyUpdated // already send to that system but in the past
|
||||
){
|
||||
rallyPokeData[this.systemId] = rallyUpdated;
|
||||
storeMapData(this.mapId, 'rallyPoke', rallyPokeData);
|
||||
|
||||
notificationOptions.type = 'info';
|
||||
Util.showNotify(notificationOptions, {desktop: true, stack: 'barBottom'});
|
||||
}
|
||||
}.bind({
|
||||
mapId: mapId,
|
||||
systemId: systemId,
|
||||
rallyUpdated: rallyUpdated
|
||||
}));
|
||||
}
|
||||
}else{
|
||||
// rally point removed
|
||||
system.removeClass( rallyClass );
|
||||
|
||||
if( !options.hideNotification ){
|
||||
Util.showNotify({title: 'Rally point removed', type: 'success'});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
system.data('rallyUpdated', rallyUpdated);
|
||||
system.data('rallyPoke', rallyPoke);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* get stored map data from client cache (IndexedDB)
|
||||
* @param mapId
|
||||
* @returns {*} promise
|
||||
*/
|
||||
var getMapData = function(mapId){
|
||||
if(mapId > 0){
|
||||
var mapStorageKey = config.mapLocalStoragePrefix + mapId;
|
||||
return Util.localforage.getItem(mapStorageKey);
|
||||
}else{
|
||||
console.error('Map local storage requires mapId > 0');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* store local map config to client cache (IndexedDB)
|
||||
* @param mapId
|
||||
* @param key
|
||||
* @param value
|
||||
*/
|
||||
var storeMapData = function(mapId, key, value){
|
||||
if(mapId > 0){
|
||||
// get current map config
|
||||
var mapStorageKey = config.mapLocalStoragePrefix + mapId;
|
||||
Util.localforage.getItem(mapStorageKey).then(function(data) {
|
||||
// This code runs once the value has been loaded
|
||||
// from the offline store.
|
||||
data = (data === null) ? {} : data;
|
||||
// set/update value
|
||||
data[this.key] = this.value;
|
||||
Util.localforage.setItem(this.mapStorageKey, data);
|
||||
}.bind({
|
||||
key: key,
|
||||
value: value,
|
||||
mapStorageKey: mapStorageKey
|
||||
})).catch(function(err) {
|
||||
// This code runs if there were any errors
|
||||
console.error('Map local storage can not be accessed!');
|
||||
});
|
||||
}else{
|
||||
console.error('storeMapData(): Local storage requires mapId > 0');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* delete local map configuration by key (IndexedDB)
|
||||
* @param mapId
|
||||
* @param key
|
||||
*/
|
||||
var deleteMapData = function(mapId, key){
|
||||
if(mapId > 0){
|
||||
// get current map config
|
||||
var mapStorageKey = config.mapLocalStoragePrefix + mapId;
|
||||
Util.localforage.getItem(mapStorageKey).then(function(data) {
|
||||
if(
|
||||
data &&
|
||||
data.hasOwnProperty(key)
|
||||
){
|
||||
delete data[key];
|
||||
Util.localforage.setItem(this.mapStorageKey, data);
|
||||
}
|
||||
}.bind({
|
||||
mapStorageKey: mapStorageKey
|
||||
}));
|
||||
}else{
|
||||
console.error('deleteMapData(): Local storage requires mapId > 0');
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
getMapTypes: getMapTypes,
|
||||
getMapScopes: getMapScopes,
|
||||
@@ -341,6 +511,9 @@ define([
|
||||
checkForConnection: checkForConnection,
|
||||
getDefaultConnectionTypeByScope: getDefaultConnectionTypeByScope,
|
||||
setConnectionWHStatus: setConnectionWHStatus,
|
||||
getScopeInfoForConnection: getScopeInfoForConnection
|
||||
getScopeInfoForConnection: getScopeInfoForConnection,
|
||||
getMapData: getMapData,
|
||||
storeMapData: storeMapData,
|
||||
deleteMapData: deleteMapData
|
||||
};
|
||||
});
|
||||
@@ -49,13 +49,10 @@ define([
|
||||
|
||||
/**
|
||||
* get all maps for a maps module
|
||||
* @param mapModule
|
||||
* @returns {*}
|
||||
*/
|
||||
$.fn.getMaps = function(){
|
||||
|
||||
var maps = $(this).find('.' + config.mapClass);
|
||||
|
||||
return maps;
|
||||
};
|
||||
|
||||
|
||||
@@ -17,31 +17,18 @@ define([
|
||||
text: '',
|
||||
type: '', // 'info', 'success', error, 'warning'
|
||||
icon: false,
|
||||
opacity: 0.8,
|
||||
styling: 'fontawesome', // 'fontawesome', 'bootstrap3', 'jqueryui'
|
||||
animate_speed: 200, // effect animation
|
||||
position_animate_speed: 100, // animation speed for notifications moving up/down
|
||||
animate_speed: 'fast', // animation speed for notifications moving up/down
|
||||
hide: true, // close after few seconds
|
||||
delay: 5000, // visible time for notification in browser
|
||||
mouse_reset: true, // Reset the hide timer if the mouse moves over the notice.
|
||||
shadow: true,
|
||||
addclass: 'stack-bottomright', // class for display, must changed on stack different stacks
|
||||
width: '250px',
|
||||
// animation settings
|
||||
animation: {
|
||||
'effect_in': 'fade',
|
||||
'options_in': {
|
||||
easing: 'linear'
|
||||
},
|
||||
'effect_out': 'fade',
|
||||
'options_out': {
|
||||
easing: 'linear'
|
||||
}
|
||||
},
|
||||
// nonblock extension parameter (click through notifications)
|
||||
nonblock: {
|
||||
nonblock: true,
|
||||
nonblock_opacity: 0.2
|
||||
nonblock: true, // change for enable
|
||||
nonblock_opacity: 0.9
|
||||
},
|
||||
// desktop extension "Web Notifications"
|
||||
desktop: {
|
||||
@@ -64,42 +51,28 @@ define([
|
||||
},
|
||||
addclass: 'stack-bottomright',
|
||||
width: '250px',
|
||||
opacity: 0.8
|
||||
},
|
||||
barTop: {
|
||||
stack: {
|
||||
dir1: 'down',
|
||||
dir2: 'right',
|
||||
push: 'top',
|
||||
spacing1: 0,
|
||||
spacing2: 0,
|
||||
|
||||
},
|
||||
addclass: 'stack-bar-top',
|
||||
width: '80%',
|
||||
opacity: 1
|
||||
},
|
||||
barBottom: {
|
||||
stack: {
|
||||
dir1: 'up',
|
||||
dir2: 'right',
|
||||
firstpos1: 30,
|
||||
// context: $('body'),
|
||||
spacing1: 0,
|
||||
spacing2: 0
|
||||
},
|
||||
addclass: 'stack-bar-bottom',
|
||||
width: '100%',
|
||||
opacity: 1
|
||||
width: '70%',
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* show a notification in browser and/or "Web Notifications" in OS
|
||||
* @param customConfig
|
||||
* @param settings
|
||||
*/
|
||||
var showNotify = function(customConfig, settings){
|
||||
|
||||
customConfig = $.extend({}, config, customConfig );
|
||||
customConfig = $.extend(true, {}, config, customConfig );
|
||||
|
||||
// desktop notification
|
||||
if(
|
||||
@@ -114,10 +87,6 @@ define([
|
||||
|
||||
// make browser tab blink
|
||||
startTabBlink(customConfig.title);
|
||||
|
||||
}else{
|
||||
customConfig.delay = 5000;
|
||||
customConfig.desktop.desktop = false;
|
||||
}
|
||||
|
||||
// set notification stack
|
||||
@@ -128,11 +97,9 @@ define([
|
||||
customConfig.stack = stack[settings.stack].stack;
|
||||
customConfig.addclass = stack[settings.stack].addclass;
|
||||
customConfig.width = stack[settings.stack].width;
|
||||
customConfig.opacity = stack[settings.stack].opacity;
|
||||
}else{
|
||||
customConfig.stack = stack.bottomRight.stack;
|
||||
customConfig.addclass = stack.bottomRight.addclass;
|
||||
customConfig.opacity = stack.bottomRight.opacity;
|
||||
}
|
||||
|
||||
switch(customConfig.type){
|
||||
@@ -168,7 +135,6 @@ define([
|
||||
* @param blinkTitle
|
||||
*/
|
||||
var startTabBlink = function(blinkTitle){
|
||||
|
||||
var initBlink = (function(blinkTitle){
|
||||
|
||||
var currentTitle = document.title;
|
||||
@@ -195,10 +161,8 @@ define([
|
||||
}( blinkTitle ));
|
||||
|
||||
initBlink();
|
||||
|
||||
};
|
||||
|
||||
|
||||
return {
|
||||
showNotify: showNotify,
|
||||
startTabBlink: startTabBlink
|
||||
|
||||
176
js/lib/pnotify/pnotify.buttons.js
Normal file
176
js/lib/pnotify/pnotify.buttons.js
Normal file
@@ -0,0 +1,176 @@
|
||||
// Buttons
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.buttons', ['jquery', 'pnotify'], factory);
|
||||
} else if (typeof exports === 'object' && typeof module !== 'undefined') {
|
||||
// CommonJS
|
||||
module.exports = factory(require('jquery'), require('./pnotify'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(root.jQuery, root.PNotify);
|
||||
}
|
||||
}(this, function($, PNotify){
|
||||
PNotify.prototype.options.buttons = {
|
||||
// Provide a button for the user to manually close the notice.
|
||||
closer: true,
|
||||
// Only show the closer button on hover.
|
||||
closer_hover: true,
|
||||
// Provide a button for the user to manually stick the notice.
|
||||
sticker: true,
|
||||
// Only show the sticker button on hover.
|
||||
sticker_hover: true,
|
||||
// Show the buttons even when the nonblock module is in use.
|
||||
show_on_nonblock: false,
|
||||
// The various displayed text, helps facilitating internationalization.
|
||||
labels: {
|
||||
close: "Close",
|
||||
stick: "Stick",
|
||||
unstick: "Unstick"
|
||||
},
|
||||
// The classes to use for button icons. Leave them null to use the classes from the styling you're using.
|
||||
classes: {
|
||||
closer: null,
|
||||
pin_up: null,
|
||||
pin_down: null
|
||||
}
|
||||
};
|
||||
PNotify.prototype.modules.buttons = {
|
||||
closer: null,
|
||||
sticker: null,
|
||||
|
||||
init: function(notice, options){
|
||||
var that = this;
|
||||
notice.elem.on({
|
||||
"mouseenter": function(e){
|
||||
// Show the buttons.
|
||||
if (that.options.sticker && (!(notice.options.nonblock && notice.options.nonblock.nonblock) || that.options.show_on_nonblock)) {
|
||||
that.sticker.trigger("pnotify:buttons:toggleStick").css("visibility", "visible");
|
||||
}
|
||||
if (that.options.closer && (!(notice.options.nonblock && notice.options.nonblock.nonblock) || that.options.show_on_nonblock)) {
|
||||
that.closer.css("visibility", "visible");
|
||||
}
|
||||
},
|
||||
"mouseleave": function(e){
|
||||
// Hide the buttons.
|
||||
if (that.options.sticker_hover) {
|
||||
that.sticker.css("visibility", "hidden");
|
||||
}
|
||||
if (that.options.closer_hover) {
|
||||
that.closer.css("visibility", "hidden");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Provide a button to stick the notice.
|
||||
this.sticker = $("<div />", {
|
||||
"class": "ui-pnotify-sticker",
|
||||
"aria-role": "button",
|
||||
"aria-pressed": notice.options.hide ? "false" : "true",
|
||||
"tabindex": "0",
|
||||
"title": notice.options.hide ? options.labels.stick : options.labels.unstick,
|
||||
"css": {
|
||||
"cursor": "pointer",
|
||||
"visibility": options.sticker_hover ? "hidden" : "visible"
|
||||
},
|
||||
"click": function(){
|
||||
notice.options.hide = !notice.options.hide;
|
||||
if (notice.options.hide) {
|
||||
notice.queueRemove();
|
||||
} else {
|
||||
notice.cancelRemove();
|
||||
}
|
||||
$(this).trigger("pnotify:buttons:toggleStick");
|
||||
}
|
||||
})
|
||||
.bind("pnotify:buttons:toggleStick", function(){
|
||||
var pin_up = that.options.classes.pin_up === null ? notice.styles.pin_up : that.options.classes.pin_up;
|
||||
var pin_down = that.options.classes.pin_down === null ? notice.styles.pin_down : that.options.classes.pin_down;
|
||||
$(this)
|
||||
.attr("title", notice.options.hide ? that.options.labels.stick : that.options.labels.unstick)
|
||||
.children()
|
||||
.attr("class", "")
|
||||
.addClass(notice.options.hide ? pin_up : pin_down)
|
||||
.attr("aria-pressed", notice.options.hide ? "false" : "true");
|
||||
})
|
||||
.append("<span />")
|
||||
.trigger("pnotify:buttons:toggleStick")
|
||||
.prependTo(notice.container);
|
||||
if (!options.sticker || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.sticker.css("display", "none");
|
||||
}
|
||||
|
||||
// Provide a button to close the notice.
|
||||
this.closer = $("<div />", {
|
||||
"class": "ui-pnotify-closer",
|
||||
"aria-role": "button",
|
||||
"tabindex": "0",
|
||||
"title": options.labels.close,
|
||||
"css": {"cursor": "pointer", "visibility": options.closer_hover ? "hidden" : "visible"},
|
||||
"click": function(){
|
||||
notice.remove(false);
|
||||
that.sticker.css("visibility", "hidden");
|
||||
that.closer.css("visibility", "hidden");
|
||||
}
|
||||
})
|
||||
.append($("<span />", {"class": options.classes.closer === null ? notice.styles.closer : options.classes.closer}))
|
||||
.prependTo(notice.container);
|
||||
if (!options.closer || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.closer.css("display", "none");
|
||||
}
|
||||
},
|
||||
update: function(notice, options){
|
||||
// Update the sticker and closer buttons.
|
||||
if (!options.closer || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.closer.css("display", "none");
|
||||
} else if (options.closer) {
|
||||
this.closer.css("display", "block");
|
||||
}
|
||||
if (!options.sticker || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.sticker.css("display", "none");
|
||||
} else if (options.sticker) {
|
||||
this.sticker.css("display", "block");
|
||||
}
|
||||
// Update the sticker icon.
|
||||
this.sticker.trigger("pnotify:buttons:toggleStick");
|
||||
// Update the close icon.
|
||||
this.closer.find("span").attr("class", "").addClass(options.classes.closer === null ? notice.styles.closer : options.classes.closer);
|
||||
// Update the hover status of the buttons.
|
||||
if (options.sticker_hover) {
|
||||
this.sticker.css("visibility", "hidden");
|
||||
} else if (!(notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.sticker.css("visibility", "visible");
|
||||
}
|
||||
if (options.closer_hover) {
|
||||
this.closer.css("visibility", "hidden");
|
||||
} else if (!(notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.closer.css("visibility", "visible");
|
||||
}
|
||||
}
|
||||
};
|
||||
$.extend(PNotify.styling.brighttheme, {
|
||||
closer: "brighttheme-icon-closer",
|
||||
pin_up: "brighttheme-icon-sticker",
|
||||
pin_down: "brighttheme-icon-sticker brighttheme-icon-stuck"
|
||||
});
|
||||
$.extend(PNotify.styling.jqueryui, {
|
||||
closer: "ui-icon ui-icon-close",
|
||||
pin_up: "ui-icon ui-icon-pin-w",
|
||||
pin_down: "ui-icon ui-icon-pin-s"
|
||||
});
|
||||
$.extend(PNotify.styling.bootstrap2, {
|
||||
closer: "icon-remove",
|
||||
pin_up: "icon-pause",
|
||||
pin_down: "icon-play"
|
||||
});
|
||||
$.extend(PNotify.styling.bootstrap3, {
|
||||
closer: "glyphicon glyphicon-remove",
|
||||
pin_up: "glyphicon glyphicon-pause",
|
||||
pin_down: "glyphicon glyphicon-play"
|
||||
});
|
||||
$.extend(PNotify.styling.fontawesome, {
|
||||
closer: "fa fa-times",
|
||||
pin_up: "fa fa-pause",
|
||||
pin_down: "fa fa-play"
|
||||
});
|
||||
}));
|
||||
@@ -1,14 +1,16 @@
|
||||
// Callbacks
|
||||
// Uses AMD or browser globals for jQuery.
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.callbacks', ['jquery', 'pnotify'], factory);
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery, PNotify);
|
||||
}
|
||||
}(function($, PNotify){
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.callbacks', ['jquery', 'pnotify'], factory);
|
||||
} else if (typeof exports === 'object' && typeof module !== 'undefined') {
|
||||
// CommonJS
|
||||
module.exports = factory(require('jquery'), require('./pnotify'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(root.jQuery, root.PNotify);
|
||||
}
|
||||
}(this, function($, PNotify){
|
||||
var _init = PNotify.prototype.init,
|
||||
_open = PNotify.prototype.open,
|
||||
_remove = PNotify.prototype.remove;
|
||||
|
||||
@@ -1,778 +0,0 @@
|
||||
/*
|
||||
PNotify 2.0.1 sciactive.com/pnotify/
|
||||
(C) 2014 Hunter Perrin
|
||||
license GPL/LGPL/MPL
|
||||
*/
|
||||
/*
|
||||
* ====== PNotify ======
|
||||
*
|
||||
* http://sciactive.com/pnotify/
|
||||
*
|
||||
* Copyright 2009-2014 Hunter Perrin
|
||||
*
|
||||
* Triple licensed under the GPL, LGPL, and MPL.
|
||||
* http://gnu.org/licenses/gpl.html
|
||||
* http://gnu.org/licenses/lgpl.html
|
||||
* http://mozilla.org/MPL/MPL-1.1.html
|
||||
*/
|
||||
|
||||
// Uses AMD or browser globals for jQuery.
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify', ['jquery'], factory);
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function($){
|
||||
var default_stack = {
|
||||
dir1: "down",
|
||||
dir2: "left",
|
||||
push: "bottom",
|
||||
spacing1: 25,
|
||||
spacing2: 25,
|
||||
context: $("body")
|
||||
};
|
||||
var timer, // Position all timer.
|
||||
body,
|
||||
jwindow = $(window);
|
||||
// Set global variables.
|
||||
var do_when_ready = function(){
|
||||
body = $("body");
|
||||
PNotify.prototype.options.stack.context = body;
|
||||
jwindow = $(window);
|
||||
// Reposition the notices when the window resizes.
|
||||
jwindow.bind('resize', function(){
|
||||
if (timer)
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(function(){ PNotify.positionAll(true) }, 10);
|
||||
});
|
||||
};
|
||||
PNotify = function(options){
|
||||
this.parseOptions(options);
|
||||
this.init();
|
||||
};
|
||||
$.extend(PNotify.prototype, {
|
||||
// The current version of PNotify.
|
||||
version: "2.0.1",
|
||||
|
||||
// === Options ===
|
||||
|
||||
// Options defaults.
|
||||
options: {
|
||||
// The notice's title.
|
||||
title: false,
|
||||
// Whether to escape the content of the title. (Not allow HTML.)
|
||||
title_escape: false,
|
||||
// The notice's text.
|
||||
text: false,
|
||||
// Whether to escape the content of the text. (Not allow HTML.)
|
||||
text_escape: false,
|
||||
// What styling classes to use. (Can be either jqueryui or bootstrap.)
|
||||
styling: "bootstrap3",
|
||||
// Additional classes to be added to the notice. (For custom styling.)
|
||||
addclass: "",
|
||||
// Class to be added to the notice for corner styling.
|
||||
cornerclass: "",
|
||||
// Display the notice when it is created.
|
||||
auto_display: true,
|
||||
// Width of the notice.
|
||||
width: "300px",
|
||||
// Minimum height of the notice. It will expand to fit content.
|
||||
min_height: "16px",
|
||||
// Type of the notice. "notice", "info", "success", or "error".
|
||||
type: "notice",
|
||||
// Set icon to true to use the default icon for the selected
|
||||
// style/type, false for no icon, or a string for your own icon class.
|
||||
icon: true,
|
||||
// Opacity of the notice.
|
||||
opacity: 1,
|
||||
// The animation to use when displaying and hiding the notice. "none",
|
||||
// "show", "fade", and "slide" are built in to jQuery. Others require jQuery
|
||||
// UI. Use an object with effect_in and effect_out to use different effects.
|
||||
animation: "fade",
|
||||
// Speed at which the notice animates in and out. "slow", "def" or "normal",
|
||||
// "fast" or number of milliseconds.
|
||||
animate_speed: "slow",
|
||||
// Specify a specific duration of position animation
|
||||
position_animate_speed: 500,
|
||||
// Display a drop shadow.
|
||||
shadow: true,
|
||||
// After a delay, remove the notice.
|
||||
hide: true,
|
||||
// Delay in milliseconds before the notice is removed.
|
||||
delay: 8000,
|
||||
// Reset the hide timer if the mouse moves over the notice.
|
||||
mouse_reset: true,
|
||||
// Remove the notice's elements from the DOM after it is removed.
|
||||
remove: true,
|
||||
// Change new lines to br tags.
|
||||
insert_brs: true,
|
||||
// Whether to remove notices from the global array.
|
||||
destroy: true,
|
||||
// The stack on which the notices will be placed. Also controls the
|
||||
// direction the notices stack.
|
||||
stack: default_stack
|
||||
},
|
||||
|
||||
// === Modules ===
|
||||
|
||||
// This object holds all the PNotify modules. They are used to provide
|
||||
// additional functionality.
|
||||
modules: {},
|
||||
// This runs an event on all the modules.
|
||||
runModules: function(event, arg){
|
||||
var curArg;
|
||||
for (var module in this.modules) {
|
||||
curArg = ((typeof arg === "object" && module in arg) ? arg[module] : arg);
|
||||
if (typeof this.modules[module][event] === 'function')
|
||||
this.modules[module][event](this, typeof this.options[module] === 'object' ? this.options[module] : {}, curArg);
|
||||
}
|
||||
},
|
||||
|
||||
// === Class Variables ===
|
||||
|
||||
state: "initializing", // The state can be "initializing", "opening", "open", "closing", and "closed".
|
||||
timer: null, // Auto close timer.
|
||||
styles: null,
|
||||
elem: null,
|
||||
container: null,
|
||||
title_container: null,
|
||||
text_container: null,
|
||||
animating: false, // Stores what is currently being animated (in or out).
|
||||
timerHide: false, // Stores whether the notice was hidden by a timer.
|
||||
|
||||
// === Events ===
|
||||
|
||||
init: function(){
|
||||
var that = this;
|
||||
|
||||
// First and foremost, we don't want our module objects all referencing the prototype.
|
||||
this.modules = {};
|
||||
$.extend(true, this.modules, PNotify.prototype.modules);
|
||||
|
||||
// Get our styling object.
|
||||
if (typeof this.options.styling === "object") {
|
||||
this.styles = this.options.styling;
|
||||
} else {
|
||||
this.styles = PNotify.styling[this.options.styling];
|
||||
}
|
||||
|
||||
// Create our widget.
|
||||
// Stop animation, reset the removal timer when the user mouses over.
|
||||
this.elem = $("<div />", {
|
||||
"class": "ui-pnotify "+this.options.addclass,
|
||||
"css": {"display": "none"},
|
||||
"mouseenter": function(e){
|
||||
if (that.options.mouse_reset && that.animating === "out") {
|
||||
if (!that.timerHide)
|
||||
return;
|
||||
that.cancelRemove();
|
||||
}
|
||||
// Stop the close timer.
|
||||
if (that.options.hide && that.options.mouse_reset) that.cancelRemove();
|
||||
},
|
||||
"mouseleave": function(e){
|
||||
// Start the close timer.
|
||||
if (that.options.hide && that.options.mouse_reset) that.queueRemove();
|
||||
PNotify.positionAll();
|
||||
}
|
||||
});
|
||||
// Create a container for the notice contents.
|
||||
this.container = $("<div />", {"class": this.styles.container+" ui-pnotify-container "+(this.options.type === "error" ? this.styles.error : (this.options.type === "info" ? this.styles.info : (this.options.type === "success" ? this.styles.success : this.styles.notice)))})
|
||||
.appendTo(this.elem);
|
||||
if (this.options.cornerclass !== "")
|
||||
this.container.removeClass("ui-corner-all").addClass(this.options.cornerclass);
|
||||
// Create a drop shadow.
|
||||
if (this.options.shadow)
|
||||
this.container.addClass("ui-pnotify-shadow");
|
||||
|
||||
|
||||
// Add the appropriate icon.
|
||||
if (this.options.icon !== false) {
|
||||
$("<div />", {"class": "ui-pnotify-icon"})
|
||||
.append($("<span />", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon}))
|
||||
.prependTo(this.container);
|
||||
}
|
||||
|
||||
// Add a title.
|
||||
this.title_container = $("<h4 />", {
|
||||
"class": "ui-pnotify-title"
|
||||
})
|
||||
.appendTo(this.container);
|
||||
if (this.options.title === false)
|
||||
this.title_container.hide();
|
||||
else if (this.options.title_escape)
|
||||
this.title_container.text(this.options.title);
|
||||
else
|
||||
this.title_container.html(this.options.title);
|
||||
|
||||
// Add text.
|
||||
this.text_container = $("<div />", {
|
||||
"class": "ui-pnotify-text"
|
||||
})
|
||||
.appendTo(this.container);
|
||||
if (this.options.text === false)
|
||||
this.text_container.hide();
|
||||
else if (this.options.text_escape)
|
||||
this.text_container.text(this.options.text);
|
||||
else
|
||||
this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text);
|
||||
|
||||
// Set width and min height.
|
||||
if (typeof this.options.width === "string")
|
||||
this.elem.css("width", this.options.width);
|
||||
if (typeof this.options.min_height === "string")
|
||||
this.container.css("min-height", this.options.min_height);
|
||||
|
||||
|
||||
// Add the notice to the notice array.
|
||||
if (this.options.stack.push === "top")
|
||||
PNotify.notices = $.merge([this], PNotify.notices);
|
||||
else
|
||||
PNotify.notices = $.merge(PNotify.notices, [this]);
|
||||
// Now position all the notices if they are to push to the top.
|
||||
if (this.options.stack.push === "top")
|
||||
this.queuePosition(false, 1);
|
||||
|
||||
|
||||
|
||||
|
||||
// Mark the stack so it won't animate the new notice.
|
||||
this.options.stack.animation = false;
|
||||
|
||||
// Run the modules.
|
||||
this.runModules('init');
|
||||
|
||||
// Display the notice.
|
||||
if (this.options.auto_display)
|
||||
this.open();
|
||||
return this;
|
||||
},
|
||||
|
||||
// This function is for updating the notice.
|
||||
update: function(options){
|
||||
// Save old options.
|
||||
var oldOpts = this.options;
|
||||
// Then update to the new options.
|
||||
this.parseOptions(oldOpts, options);
|
||||
// Update the corner class.
|
||||
if (this.options.cornerclass !== oldOpts.cornerclass)
|
||||
this.container.removeClass("ui-corner-all "+oldOpts.cornerclass).addClass(this.options.cornerclass);
|
||||
// Update the shadow.
|
||||
if (this.options.shadow !== oldOpts.shadow) {
|
||||
if (this.options.shadow)
|
||||
this.container.addClass("ui-pnotify-shadow");
|
||||
else
|
||||
this.container.removeClass("ui-pnotify-shadow");
|
||||
}
|
||||
// Update the additional classes.
|
||||
if (this.options.addclass === false)
|
||||
this.elem.removeClass(oldOpts.addclass);
|
||||
else if (this.options.addclass !== oldOpts.addclass)
|
||||
this.elem.removeClass(oldOpts.addclass).addClass(this.options.addclass);
|
||||
// Update the title.
|
||||
if (this.options.title === false)
|
||||
this.title_container.slideUp("fast");
|
||||
else if (this.options.title !== oldOpts.title) {
|
||||
if (this.options.title_escape)
|
||||
this.title_container.text(this.options.title);
|
||||
else
|
||||
this.title_container.html(this.options.title);
|
||||
if (oldOpts.title === false)
|
||||
this.title_container.slideDown(200)
|
||||
}
|
||||
// Update the text.
|
||||
if (this.options.text === false) {
|
||||
this.text_container.slideUp("fast");
|
||||
} else if (this.options.text !== oldOpts.text) {
|
||||
if (this.options.text_escape)
|
||||
this.text_container.text(this.options.text);
|
||||
else
|
||||
this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text);
|
||||
if (oldOpts.text === false)
|
||||
this.text_container.slideDown(200)
|
||||
}
|
||||
// Change the notice type.
|
||||
if (this.options.type !== oldOpts.type)
|
||||
this.container.removeClass(
|
||||
this.styles.error+" "+this.styles.notice+" "+this.styles.success+" "+this.styles.info
|
||||
).addClass(this.options.type === "error" ?
|
||||
this.styles.error :
|
||||
(this.options.type === "info" ?
|
||||
this.styles.info :
|
||||
(this.options.type === "success" ?
|
||||
this.styles.success :
|
||||
this.styles.notice
|
||||
)
|
||||
)
|
||||
);
|
||||
if (this.options.icon !== oldOpts.icon || (this.options.icon === true && this.options.type !== oldOpts.type)) {
|
||||
// Remove any old icon.
|
||||
this.container.find("div.ui-pnotify-icon").remove();
|
||||
if (this.options.icon !== false) {
|
||||
// Build the new icon.
|
||||
$("<div />", {"class": "ui-pnotify-icon"})
|
||||
.append($("<span />", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon}))
|
||||
.prependTo(this.container);
|
||||
}
|
||||
}
|
||||
// Update the width.
|
||||
if (this.options.width !== oldOpts.width)
|
||||
this.elem.animate({width: this.options.width});
|
||||
// Update the minimum height.
|
||||
if (this.options.min_height !== oldOpts.min_height)
|
||||
this.container.animate({minHeight: this.options.min_height});
|
||||
// Update the opacity.
|
||||
if (this.options.opacity !== oldOpts.opacity)
|
||||
this.elem.fadeTo(this.options.animate_speed, this.options.opacity);
|
||||
// Update the timed hiding.
|
||||
if (!this.options.hide)
|
||||
this.cancelRemove();
|
||||
else if (!oldOpts.hide)
|
||||
this.queueRemove();
|
||||
this.queuePosition(true);
|
||||
|
||||
// Run the modules.
|
||||
this.runModules('update', oldOpts);
|
||||
return this;
|
||||
},
|
||||
|
||||
// Display the notice.
|
||||
open: function(){
|
||||
this.state = "opening";
|
||||
// Run the modules.
|
||||
this.runModules('beforeOpen');
|
||||
|
||||
var that = this;
|
||||
// If the notice is not in the DOM, append it.
|
||||
if (!this.elem.parent().length)
|
||||
this.elem.appendTo(this.options.stack.context ? this.options.stack.context : body);
|
||||
// Try to put it in the right position.
|
||||
if (this.options.stack.push !== "top")
|
||||
this.position(true);
|
||||
// First show it, then set its opacity, then hide it.
|
||||
if (this.options.animation === "fade" || this.options.animation.effect_in === "fade") {
|
||||
// If it's fading in, it should start at 0.
|
||||
this.elem.show().fadeTo(0, 0).hide();
|
||||
} else {
|
||||
// Or else it should be set to the opacity.
|
||||
if (this.options.opacity !== 1)
|
||||
this.elem.show().fadeTo(0, this.options.opacity).hide();
|
||||
}
|
||||
this.animateIn(function(){
|
||||
that.queuePosition(true);
|
||||
|
||||
// Now set it to hide.
|
||||
if (that.options.hide)
|
||||
that.queueRemove();
|
||||
|
||||
that.state = "open";
|
||||
|
||||
// Run the modules.
|
||||
that.runModules('afterOpen');
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
// Remove the notice.
|
||||
remove: function(timer_hide) {
|
||||
this.state = "closing";
|
||||
this.timerHide = !!timer_hide; // Make sure it's a boolean.
|
||||
// Run the modules.
|
||||
this.runModules('beforeClose');
|
||||
|
||||
var that = this;
|
||||
if (this.timer) {
|
||||
window.clearTimeout(this.timer);
|
||||
this.timer = null;
|
||||
}
|
||||
this.animateOut(function(){
|
||||
that.state = "closed";
|
||||
// Run the modules.
|
||||
that.runModules('afterClose');
|
||||
that.queuePosition(true);
|
||||
// If we're supposed to remove the notice from the DOM, do it.
|
||||
if (that.options.remove)
|
||||
that.elem.detach();
|
||||
// Run the modules.
|
||||
that.runModules('beforeDestroy');
|
||||
// Remove object from PNotify.notices to prevent memory leak (issue #49)
|
||||
// unless destroy is off
|
||||
if (that.options.destroy) {
|
||||
if (PNotify.notices !== null) {
|
||||
var idx = $.inArray(that,PNotify.notices);
|
||||
if (idx !== -1) {
|
||||
PNotify.notices.splice(idx,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Run the modules.
|
||||
that.runModules('afterDestroy');
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
// === Class Methods ===
|
||||
|
||||
// Get the DOM element.
|
||||
get: function(){ return this.elem; },
|
||||
|
||||
// Put all the options in the right places.
|
||||
parseOptions: function(options, moreOptions){
|
||||
this.options = $.extend(true, {}, PNotify.prototype.options);
|
||||
// This is the only thing that *should* be copied by reference.
|
||||
this.options.stack = PNotify.prototype.options.stack;
|
||||
var optArray = [options, moreOptions], curOpts;
|
||||
for (var curIndex in optArray) {
|
||||
curOpts = optArray[curIndex];
|
||||
if (typeof curOpts == "undefined")
|
||||
break;
|
||||
if (typeof curOpts !== 'object') {
|
||||
this.options.text = curOpts;
|
||||
} else {
|
||||
for (var option in curOpts) {
|
||||
if (this.modules[option]) {
|
||||
// Avoid overwriting module defaults.
|
||||
$.extend(true, this.options[option], curOpts[option]);
|
||||
} else {
|
||||
this.options[option] = curOpts[option];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Animate the notice in.
|
||||
animateIn: function(callback){
|
||||
// Declare that the notice is animating in. (Or has completed animating in.)
|
||||
this.animating = "in";
|
||||
var animation;
|
||||
if (typeof this.options.animation.effect_in !== "undefined")
|
||||
animation = this.options.animation.effect_in;
|
||||
else
|
||||
animation = this.options.animation;
|
||||
if (animation === "none") {
|
||||
this.elem.show();
|
||||
callback();
|
||||
} else if (animation === "show")
|
||||
this.elem.show(this.options.animate_speed, callback);
|
||||
else if (animation === "fade")
|
||||
this.elem.show().fadeTo(this.options.animate_speed, this.options.opacity, callback);
|
||||
else if (animation === "slide")
|
||||
this.elem.slideDown(this.options.animate_speed, callback);
|
||||
else if (typeof animation === "function")
|
||||
animation("in", callback, this.elem);
|
||||
else
|
||||
this.elem.show(animation, (typeof this.options.animation.options_in === "object" ? this.options.animation.options_in : {}), this.options.animate_speed, callback);
|
||||
if (this.elem.parent().hasClass('ui-effects-wrapper'))
|
||||
this.elem.parent().css({"position": "fixed", "overflow": "visible"});
|
||||
if (animation !== "slide")
|
||||
this.elem.css("overflow", "visible");
|
||||
this.container.css("overflow", "hidden");
|
||||
},
|
||||
|
||||
// Animate the notice out.
|
||||
animateOut: function(callback){
|
||||
// Declare that the notice is animating out. (Or has completed animating out.)
|
||||
this.animating = "out";
|
||||
var animation;
|
||||
if (typeof this.options.animation.effect_out !== "undefined")
|
||||
animation = this.options.animation.effect_out;
|
||||
else
|
||||
animation = this.options.animation;
|
||||
if (animation === "none") {
|
||||
this.elem.hide();
|
||||
callback();
|
||||
} else if (animation === "show")
|
||||
this.elem.hide(this.options.animate_speed, callback);
|
||||
else if (animation === "fade")
|
||||
this.elem.fadeOut(this.options.animate_speed, callback);
|
||||
else if (animation === "slide")
|
||||
this.elem.slideUp(this.options.animate_speed, callback);
|
||||
else if (typeof animation === "function")
|
||||
animation("out", callback, this.elem);
|
||||
else
|
||||
this.elem.hide(animation, (typeof this.options.animation.options_out === "object" ? this.options.animation.options_out : {}), this.options.animate_speed, callback);
|
||||
if (this.elem.parent().hasClass('ui-effects-wrapper'))
|
||||
this.elem.parent().css({"position": "fixed", "overflow": "visible"});
|
||||
if (animation !== "slide")
|
||||
this.elem.css("overflow", "visible");
|
||||
this.container.css("overflow", "hidden");
|
||||
},
|
||||
|
||||
// Position the notice. dont_skip_hidden causes the notice to
|
||||
// position even if it's not visible.
|
||||
position: function(dontSkipHidden){
|
||||
// Get the notice's stack.
|
||||
var s = this.options.stack,
|
||||
e = this.elem;
|
||||
if (e.parent().hasClass('ui-effects-wrapper'))
|
||||
e = this.elem.css({"left": "0", "top": "0", "right": "0", "bottom": "0"}).parent();
|
||||
if (typeof s.context === "undefined")
|
||||
s.context = body;
|
||||
if (!s) return;
|
||||
if (typeof s.nextpos1 !== "number")
|
||||
s.nextpos1 = s.firstpos1;
|
||||
if (typeof s.nextpos2 !== "number")
|
||||
s.nextpos2 = s.firstpos2;
|
||||
if (typeof s.addpos2 !== "number")
|
||||
s.addpos2 = 0;
|
||||
var hidden = e.css("display") === "none";
|
||||
// Skip this notice if it's not shown.
|
||||
if (!hidden || dontSkipHidden) {
|
||||
var curpos1, curpos2;
|
||||
// Store what will need to be animated.
|
||||
var animate = {};
|
||||
// Calculate the current pos1 value.
|
||||
var csspos1;
|
||||
switch (s.dir1) {
|
||||
case "down":
|
||||
csspos1 = "top";
|
||||
break;
|
||||
case "up":
|
||||
csspos1 = "bottom";
|
||||
break;
|
||||
case "left":
|
||||
csspos1 = "right";
|
||||
break;
|
||||
case "right":
|
||||
csspos1 = "left";
|
||||
break;
|
||||
}
|
||||
curpos1 = parseInt(e.css(csspos1).replace(/(?:\..*|[^0-9.])/g, ''));
|
||||
if (isNaN(curpos1))
|
||||
curpos1 = 0;
|
||||
// Remember the first pos1, so the first visible notice goes there.
|
||||
if (typeof s.firstpos1 === "undefined" && !hidden) {
|
||||
s.firstpos1 = curpos1;
|
||||
s.nextpos1 = s.firstpos1;
|
||||
}
|
||||
// Calculate the current pos2 value.
|
||||
var csspos2;
|
||||
switch (s.dir2) {
|
||||
case "down":
|
||||
csspos2 = "top";
|
||||
break;
|
||||
case "up":
|
||||
csspos2 = "bottom";
|
||||
break;
|
||||
case "left":
|
||||
csspos2 = "right";
|
||||
break;
|
||||
case "right":
|
||||
csspos2 = "left";
|
||||
break;
|
||||
}
|
||||
curpos2 = parseInt(e.css(csspos2).replace(/(?:\..*|[^0-9.])/g, ''));
|
||||
if (isNaN(curpos2))
|
||||
curpos2 = 0;
|
||||
// Remember the first pos2, so the first visible notice goes there.
|
||||
if (typeof s.firstpos2 === "undefined" && !hidden) {
|
||||
s.firstpos2 = curpos2;
|
||||
s.nextpos2 = s.firstpos2;
|
||||
}
|
||||
// Check that it's not beyond the viewport edge.
|
||||
if ((s.dir1 === "down" && s.nextpos1 + e.height() > (s.context.is(body) ? jwindow.height() : s.context.prop('scrollHeight')) ) ||
|
||||
(s.dir1 === "up" && s.nextpos1 + e.height() > (s.context.is(body) ? jwindow.height() : s.context.prop('scrollHeight')) ) ||
|
||||
(s.dir1 === "left" && s.nextpos1 + e.width() > (s.context.is(body) ? jwindow.width() : s.context.prop('scrollWidth')) ) ||
|
||||
(s.dir1 === "right" && s.nextpos1 + e.width() > (s.context.is(body) ? jwindow.width() : s.context.prop('scrollWidth')) ) ) {
|
||||
// If it is, it needs to go back to the first pos1, and over on pos2.
|
||||
s.nextpos1 = s.firstpos1;
|
||||
s.nextpos2 += s.addpos2 + (typeof s.spacing2 === "undefined" ? 25 : s.spacing2);
|
||||
s.addpos2 = 0;
|
||||
}
|
||||
// Animate if we're moving on dir2.
|
||||
if (s.animation && s.nextpos2 < curpos2) {
|
||||
switch (s.dir2) {
|
||||
case "down":
|
||||
animate.top = s.nextpos2+"px";
|
||||
break;
|
||||
case "up":
|
||||
animate.bottom = s.nextpos2+"px";
|
||||
break;
|
||||
case "left":
|
||||
animate.right = s.nextpos2+"px";
|
||||
break;
|
||||
case "right":
|
||||
animate.left = s.nextpos2+"px";
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if(typeof s.nextpos2 === "number")
|
||||
e.css(csspos2, s.nextpos2+"px");
|
||||
}
|
||||
// Keep track of the widest/tallest notice in the column/row, so we can push the next column/row.
|
||||
switch (s.dir2) {
|
||||
case "down":
|
||||
case "up":
|
||||
if (e.outerHeight(true) > s.addpos2)
|
||||
s.addpos2 = e.height();
|
||||
break;
|
||||
case "left":
|
||||
case "right":
|
||||
if (e.outerWidth(true) > s.addpos2)
|
||||
s.addpos2 = e.width();
|
||||
break;
|
||||
}
|
||||
// Move the notice on dir1.
|
||||
if (typeof s.nextpos1 === "number") {
|
||||
// Animate if we're moving toward the first pos.
|
||||
if (s.animation && (curpos1 > s.nextpos1 || animate.top || animate.bottom || animate.right || animate.left)) {
|
||||
switch (s.dir1) {
|
||||
case "down":
|
||||
animate.top = s.nextpos1+"px";
|
||||
break;
|
||||
case "up":
|
||||
animate.bottom = s.nextpos1+"px";
|
||||
break;
|
||||
case "left":
|
||||
animate.right = s.nextpos1+"px";
|
||||
break;
|
||||
case "right":
|
||||
animate.left = s.nextpos1+"px";
|
||||
break;
|
||||
}
|
||||
} else
|
||||
e.css(csspos1, s.nextpos1+"px");
|
||||
}
|
||||
// Run the animation.
|
||||
if (animate.top || animate.bottom || animate.right || animate.left)
|
||||
e.animate(animate, {duration: this.options.position_animate_speed, queue: false});
|
||||
// Calculate the next dir1 position.
|
||||
switch (s.dir1) {
|
||||
case "down":
|
||||
case "up":
|
||||
s.nextpos1 += e.height() + (typeof s.spacing1 === "undefined" ? 25 : s.spacing1);
|
||||
break;
|
||||
case "left":
|
||||
case "right":
|
||||
s.nextpos1 += e.width() + (typeof s.spacing1 === "undefined" ? 25 : s.spacing1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return this;
|
||||
},
|
||||
// Queue the position all function so it doesn't run repeatedly and
|
||||
// use up resources.
|
||||
queuePosition: function(animate, milliseconds){
|
||||
if (timer)
|
||||
clearTimeout(timer);
|
||||
if (!milliseconds)
|
||||
milliseconds = 10;
|
||||
timer = setTimeout(function(){ PNotify.positionAll(animate) }, milliseconds);
|
||||
return this;
|
||||
},
|
||||
|
||||
|
||||
// Cancel any pending removal timer.
|
||||
cancelRemove: function(){
|
||||
if (this.timer)
|
||||
window.clearTimeout(this.timer);
|
||||
if (this.state === "closing") {
|
||||
// If it's animating out, animate back in really quickly.
|
||||
this.elem.stop(true);
|
||||
this.state = "open";
|
||||
this.animating = "in";
|
||||
this.elem.css("height", "auto").animate({"width": this.options.width, "opacity": this.options.opacity}, "fast");
|
||||
}
|
||||
return this;
|
||||
},
|
||||
// Queue a removal timer.
|
||||
queueRemove: function(){
|
||||
var that = this;
|
||||
// Cancel any current removal timer.
|
||||
this.cancelRemove();
|
||||
this.timer = window.setTimeout(function(){
|
||||
that.remove(true);
|
||||
}, (isNaN(this.options.delay) ? 0 : this.options.delay));
|
||||
return this;
|
||||
}
|
||||
});
|
||||
// These functions affect all notices.
|
||||
$.extend(PNotify, {
|
||||
// This holds all the notices.
|
||||
notices: [],
|
||||
removeAll: function () {
|
||||
$.each(PNotify.notices, function(){
|
||||
if (this.remove)
|
||||
this.remove();
|
||||
});
|
||||
},
|
||||
positionAll: function (animate) {
|
||||
// This timer is used for queueing this function so it doesn't run
|
||||
// repeatedly.
|
||||
if (timer)
|
||||
clearTimeout(timer);
|
||||
timer = null;
|
||||
// Reset the next position data.
|
||||
$.each(PNotify.notices, function(){
|
||||
var s = this.options.stack;
|
||||
if (!s) return;
|
||||
s.nextpos1 = s.firstpos1;
|
||||
s.nextpos2 = s.firstpos2;
|
||||
s.addpos2 = 0;
|
||||
s.animation = animate;
|
||||
});
|
||||
$.each(PNotify.notices, function(){
|
||||
this.position();
|
||||
});
|
||||
},
|
||||
styling: {
|
||||
jqueryui: {
|
||||
container: "ui-widget ui-widget-content ui-corner-all",
|
||||
notice: "ui-state-highlight",
|
||||
// (The actual jQUI notice icon looks terrible.)
|
||||
notice_icon: "ui-icon ui-icon-info",
|
||||
info: "",
|
||||
info_icon: "ui-icon ui-icon-info",
|
||||
success: "ui-state-default",
|
||||
success_icon: "ui-icon ui-icon-circle-check",
|
||||
error: "ui-state-error",
|
||||
error_icon: "ui-icon ui-icon-alert"
|
||||
},
|
||||
bootstrap2: {
|
||||
container: "alert",
|
||||
notice: "",
|
||||
notice_icon: "icon-exclamation-sign",
|
||||
info: "alert-info",
|
||||
info_icon: "icon-info-sign",
|
||||
success: "alert-success",
|
||||
success_icon: "icon-ok-sign",
|
||||
error: "alert-error",
|
||||
error_icon: "icon-warning-sign"
|
||||
},
|
||||
bootstrap3: {
|
||||
container: "alert",
|
||||
notice: "alert-warning",
|
||||
notice_icon: "glyphicon glyphicon-exclamation-sign",
|
||||
info: "alert-info",
|
||||
info_icon: "glyphicon glyphicon-info-sign",
|
||||
success: "alert-success",
|
||||
success_icon: "glyphicon glyphicon-ok-sign",
|
||||
error: "alert-danger",
|
||||
error_icon: "glyphicon glyphicon-warning-sign"
|
||||
}
|
||||
}
|
||||
});
|
||||
/*
|
||||
* uses icons from http://fontawesome.io/
|
||||
* version 4.0.3
|
||||
*/
|
||||
PNotify.styling.fontawesome = $.extend({}, PNotify.styling.bootstrap3);
|
||||
$.extend(PNotify.styling.fontawesome, {
|
||||
notice_icon: "fa fa-exclamation-circle",
|
||||
info_icon: "fa fa-info",
|
||||
success_icon: "fa fa-check",
|
||||
error_icon: "fa fa-warning"
|
||||
});
|
||||
|
||||
if (document.body)
|
||||
do_when_ready();
|
||||
else
|
||||
$(do_when_ready);
|
||||
return PNotify;
|
||||
}));
|
||||
@@ -1,14 +1,16 @@
|
||||
// Desktop
|
||||
// Uses AMD or browser globals for jQuery.
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.desktop', ['jquery', 'pnotify'], factory);
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery, PNotify);
|
||||
}
|
||||
}(function($, PNotify){
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.desktop', ['jquery', 'pnotify'], factory);
|
||||
} else if (typeof exports === 'object' && typeof module !== 'undefined') {
|
||||
// CommonJS
|
||||
module.exports = factory(require('jquery'), require('./pnotify'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(root.jQuery, root.PNotify);
|
||||
}
|
||||
}(this, function($, PNotify){
|
||||
var permission;
|
||||
var notify = function(title, options){
|
||||
// Memoize based on feature detection.
|
||||
@@ -43,6 +45,8 @@
|
||||
PNotify.prototype.options.desktop = {
|
||||
// Display the notification as a desktop notification.
|
||||
desktop: false,
|
||||
// If desktop notifications are not supported or allowed, fall back to a regular notice.
|
||||
fallback: true,
|
||||
// The URL of the icon to display. If false, no icon will show. If null, a default icon will show.
|
||||
icon: null,
|
||||
// Using a tag lets you update an existing notice, or keep from duplicating notices between tabs.
|
||||
@@ -66,10 +70,10 @@
|
||||
}
|
||||
notice.desktop = notify(notice.options.title, {
|
||||
icon: this.icon,
|
||||
body: notice.options.text,
|
||||
body: options.text || notice.options.text,
|
||||
tag: this.tag
|
||||
});
|
||||
if (!("close" in notice.desktop)) {
|
||||
if (!("close" in notice.desktop) && ("cancel" in notice.desktop)) {
|
||||
notice.desktop.close = function(){
|
||||
notice.desktop.cancel();
|
||||
};
|
||||
@@ -87,38 +91,45 @@
|
||||
if (!options.desktop)
|
||||
return;
|
||||
permission = PNotify.desktop.checkPermission();
|
||||
if (permission != 0)
|
||||
if (permission !== 0) {
|
||||
// Keep the notice from opening if fallback is false.
|
||||
if (!options.fallback) {
|
||||
notice.options.auto_display = false;
|
||||
}
|
||||
return;
|
||||
}
|
||||
this.genNotice(notice, options);
|
||||
},
|
||||
update: function(notice, options, oldOpts){
|
||||
if (permission != 0 || !options.desktop)
|
||||
if ((permission !== 0 && options.fallback) || !options.desktop)
|
||||
return;
|
||||
this.genNotice(notice, options);
|
||||
},
|
||||
beforeOpen: function(notice, options){
|
||||
if (permission != 0 || !options.desktop)
|
||||
if ((permission !== 0 && options.fallback) || !options.desktop)
|
||||
return;
|
||||
notice.elem.css({'left': '-10000px', 'display': 'none'});
|
||||
notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in');
|
||||
},
|
||||
afterOpen: function(notice, options){
|
||||
if (permission != 0 || !options.desktop)
|
||||
if ((permission !== 0 && options.fallback) || !options.desktop)
|
||||
return;
|
||||
notice.elem.css({'left': '-10000px', 'display': 'none'});
|
||||
notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in');
|
||||
if ("show" in notice.desktop) {
|
||||
notice.desktop.show();
|
||||
}
|
||||
},
|
||||
beforeClose: function(notice, options){
|
||||
if (permission != 0 || !options.desktop)
|
||||
if ((permission !== 0 && options.fallback) || !options.desktop)
|
||||
return;
|
||||
notice.elem.css({'left': '-10000px', 'display': 'none'});
|
||||
notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in');
|
||||
},
|
||||
afterClose: function(notice, options){
|
||||
if (permission != 0 || !options.desktop)
|
||||
if ((permission !== 0 && options.fallback) || !options.desktop)
|
||||
return;
|
||||
notice.elem.css({'left': '-10000px', 'display': 'none'});
|
||||
notice.desktop.close();
|
||||
notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in');
|
||||
if ("close" in notice.desktop) {
|
||||
notice.desktop.close();
|
||||
}
|
||||
}
|
||||
};
|
||||
PNotify.desktop = {
|
||||
@@ -131,9 +142,9 @@
|
||||
},
|
||||
checkPermission: function(){
|
||||
if (typeof Notification !== "undefined" && "permission" in Notification) {
|
||||
return (Notification.permission == "granted" ? 0 : 1);
|
||||
return (Notification.permission === "granted" ? 0 : 1);
|
||||
} else if ("webkitNotifications" in window) {
|
||||
return window.webkitNotifications.checkPermission();
|
||||
return window.webkitNotifications.checkPermission() == 0 ? 0 : 1;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
|
||||
873
js/lib/pnotify/pnotify.js
Normal file
873
js/lib/pnotify/pnotify.js
Normal file
@@ -0,0 +1,873 @@
|
||||
/*
|
||||
PNotify 3.0.0 sciactive.com/pnotify/
|
||||
(C) 2015 Hunter Perrin; Google, Inc.
|
||||
license Apache-2.0
|
||||
*/
|
||||
/*
|
||||
* ====== PNotify ======
|
||||
*
|
||||
* http://sciactive.com/pnotify/
|
||||
*
|
||||
* Copyright 2009-2015 Hunter Perrin
|
||||
* Copyright 2015 Google, Inc.
|
||||
*
|
||||
* Licensed under Apache License, Version 2.0.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*/
|
||||
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify', ['jquery'], function($){
|
||||
return factory($, root);
|
||||
});
|
||||
} else if (typeof exports === 'object' && typeof module !== 'undefined') {
|
||||
// CommonJS
|
||||
module.exports = factory(require('jquery'), global || root);
|
||||
} else {
|
||||
// Browser globals
|
||||
root.PNotify = factory(root.jQuery, root);
|
||||
}
|
||||
}(this, function($, root){
|
||||
var init = function(root){
|
||||
var default_stack = {
|
||||
dir1: "down",
|
||||
dir2: "left",
|
||||
push: "bottom",
|
||||
spacing1: 36,
|
||||
spacing2: 36,
|
||||
context: $("body"),
|
||||
modal: false
|
||||
};
|
||||
var posTimer, // Position all timer.
|
||||
body,
|
||||
jwindow = $(root);
|
||||
// Set global variables.
|
||||
var do_when_ready = function(){
|
||||
body = $("body");
|
||||
PNotify.prototype.options.stack.context = body;
|
||||
jwindow = $(root);
|
||||
// Reposition the notices when the window resizes.
|
||||
jwindow.bind('resize', function(){
|
||||
if (posTimer) {
|
||||
clearTimeout(posTimer);
|
||||
}
|
||||
posTimer = setTimeout(function(){
|
||||
PNotify.positionAll(true);
|
||||
}, 10);
|
||||
});
|
||||
};
|
||||
var createStackOverlay = function(stack) {
|
||||
var overlay = $("<div />", {"class": "ui-pnotify-modal-overlay"});
|
||||
overlay.prependTo(stack.context);
|
||||
if (stack.overlay_close) {
|
||||
// Close the notices on overlay click.
|
||||
overlay.click(function(){
|
||||
PNotify.removeStack(stack);
|
||||
});
|
||||
}
|
||||
return overlay;
|
||||
};
|
||||
var PNotify = function(options){
|
||||
this.parseOptions(options);
|
||||
this.init();
|
||||
};
|
||||
$.extend(PNotify.prototype, {
|
||||
// The current version of PNotify.
|
||||
version: "3.0.0",
|
||||
|
||||
// === Options ===
|
||||
|
||||
// Options defaults.
|
||||
options: {
|
||||
// The notice's title.
|
||||
title: false,
|
||||
// Whether to escape the content of the title. (Not allow HTML.)
|
||||
title_escape: false,
|
||||
// The notice's text.
|
||||
text: false,
|
||||
// Whether to escape the content of the text. (Not allow HTML.)
|
||||
text_escape: false,
|
||||
// What styling classes to use. (Can be either "brighttheme", "jqueryui", "bootstrap2", "bootstrap3", or "fontawesome".)
|
||||
styling: "brighttheme",
|
||||
// Additional classes to be added to the notice. (For custom styling.)
|
||||
addclass: "",
|
||||
// Class to be added to the notice for corner styling.
|
||||
cornerclass: "",
|
||||
// Display the notice when it is created.
|
||||
auto_display: true,
|
||||
// Width of the notice.
|
||||
width: "300px",
|
||||
// Minimum height of the notice. It will expand to fit content.
|
||||
min_height: "16px",
|
||||
// Type of the notice. "notice", "info", "success", or "error".
|
||||
type: "notice",
|
||||
// Set icon to true to use the default icon for the selected
|
||||
// style/type, false for no icon, or a string for your own icon class.
|
||||
icon: true,
|
||||
// The animation to use when displaying and hiding the notice. "none"
|
||||
// and "fade" are supported through CSS. Others are supported
|
||||
// through the Animate module and Animate.css.
|
||||
animation: "fade",
|
||||
// Speed at which the notice animates in and out. "slow", "normal",
|
||||
// or "fast". Respectively, 600ms, 400ms, 200ms.
|
||||
animate_speed: "normal",
|
||||
// Display a drop shadow.
|
||||
shadow: true,
|
||||
// After a delay, remove the notice.
|
||||
hide: true,
|
||||
// Delay in milliseconds before the notice is removed.
|
||||
delay: 8000,
|
||||
// Reset the hide timer if the mouse moves over the notice.
|
||||
mouse_reset: true,
|
||||
// Remove the notice's elements from the DOM after it is removed.
|
||||
remove: true,
|
||||
// Change new lines to br tags.
|
||||
insert_brs: true,
|
||||
// Whether to remove notices from the global array.
|
||||
destroy: true,
|
||||
// The stack on which the notices will be placed. Also controls the
|
||||
// direction the notices stack.
|
||||
stack: default_stack
|
||||
},
|
||||
|
||||
// === Modules ===
|
||||
|
||||
// This object holds all the PNotify modules. They are used to provide
|
||||
// additional functionality.
|
||||
modules: {},
|
||||
// This runs an event on all the modules.
|
||||
runModules: function(event, arg){
|
||||
var curArg;
|
||||
for (var module in this.modules) {
|
||||
curArg = ((typeof arg === "object" && module in arg) ? arg[module] : arg);
|
||||
if (typeof this.modules[module][event] === 'function') {
|
||||
this.modules[module].notice = this;
|
||||
this.modules[module].options = typeof this.options[module] === 'object' ? this.options[module] : {};
|
||||
this.modules[module][event](this, typeof this.options[module] === 'object' ? this.options[module] : {}, curArg);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// === Class Variables ===
|
||||
|
||||
state: "initializing", // The state can be "initializing", "opening", "open", "closing", and "closed".
|
||||
timer: null, // Auto close timer.
|
||||
animTimer: null, // Animation timer.
|
||||
styles: null,
|
||||
elem: null,
|
||||
container: null,
|
||||
title_container: null,
|
||||
text_container: null,
|
||||
animating: false, // Stores what is currently being animated (in or out).
|
||||
timerHide: false, // Stores whether the notice was hidden by a timer.
|
||||
|
||||
// === Events ===
|
||||
|
||||
init: function(){
|
||||
var that = this;
|
||||
|
||||
// First and foremost, we don't want our module objects all referencing the prototype.
|
||||
this.modules = {};
|
||||
$.extend(true, this.modules, PNotify.prototype.modules);
|
||||
|
||||
// Get our styling object.
|
||||
if (typeof this.options.styling === "object") {
|
||||
this.styles = this.options.styling;
|
||||
} else {
|
||||
this.styles = PNotify.styling[this.options.styling];
|
||||
}
|
||||
|
||||
// Create our widget.
|
||||
// Stop animation, reset the removal timer when the user mouses over.
|
||||
this.elem = $("<div />", {
|
||||
"class": "ui-pnotify "+this.options.addclass,
|
||||
"css": {"display": "none"},
|
||||
"aria-live": "assertive",
|
||||
"aria-role": "alertdialog",
|
||||
"mouseenter": function(e){
|
||||
if (that.options.mouse_reset && that.animating === "out") {
|
||||
if (!that.timerHide) {
|
||||
return;
|
||||
}
|
||||
that.cancelRemove();
|
||||
}
|
||||
// Stop the close timer.
|
||||
if (that.options.hide && that.options.mouse_reset) {
|
||||
that.cancelRemove();
|
||||
}
|
||||
},
|
||||
"mouseleave": function(e){
|
||||
// Start the close timer.
|
||||
if (that.options.hide && that.options.mouse_reset && that.animating !== "out") {
|
||||
that.queueRemove();
|
||||
}
|
||||
PNotify.positionAll();
|
||||
}
|
||||
});
|
||||
// Maybe we need to fade in/out.
|
||||
if (this.options.animation === "fade") {
|
||||
this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed);
|
||||
}
|
||||
// Create a container for the notice contents.
|
||||
this.container = $("<div />", {
|
||||
"class": this.styles.container+" ui-pnotify-container "+(this.options.type === "error" ? this.styles.error : (this.options.type === "info" ? this.styles.info : (this.options.type === "success" ? this.styles.success : this.styles.notice))),
|
||||
"role": "alert"
|
||||
}).appendTo(this.elem);
|
||||
if (this.options.cornerclass !== "") {
|
||||
this.container.removeClass("ui-corner-all").addClass(this.options.cornerclass);
|
||||
}
|
||||
// Create a drop shadow.
|
||||
if (this.options.shadow) {
|
||||
this.container.addClass("ui-pnotify-shadow");
|
||||
}
|
||||
|
||||
|
||||
// Add the appropriate icon.
|
||||
if (this.options.icon !== false) {
|
||||
$("<div />", {"class": "ui-pnotify-icon"})
|
||||
.append($("<span />", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon}))
|
||||
.prependTo(this.container);
|
||||
}
|
||||
|
||||
// Add a title.
|
||||
this.title_container = $("<h4 />", {
|
||||
"class": "ui-pnotify-title"
|
||||
})
|
||||
.appendTo(this.container);
|
||||
if (this.options.title === false) {
|
||||
this.title_container.hide();
|
||||
} else if (this.options.title_escape) {
|
||||
this.title_container.text(this.options.title);
|
||||
} else {
|
||||
this.title_container.html(this.options.title);
|
||||
}
|
||||
|
||||
// Add text.
|
||||
this.text_container = $("<div />", {
|
||||
"class": "ui-pnotify-text",
|
||||
"aria-role": "alert"
|
||||
})
|
||||
.appendTo(this.container);
|
||||
if (this.options.text === false) {
|
||||
this.text_container.hide();
|
||||
} else if (this.options.text_escape) {
|
||||
this.text_container.text(this.options.text);
|
||||
} else {
|
||||
this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text);
|
||||
}
|
||||
|
||||
// Set width and min height.
|
||||
if (typeof this.options.width === "string") {
|
||||
this.elem.css("width", this.options.width);
|
||||
}
|
||||
if (typeof this.options.min_height === "string") {
|
||||
this.container.css("min-height", this.options.min_height);
|
||||
}
|
||||
|
||||
|
||||
// Add the notice to the notice array.
|
||||
if (this.options.stack.push === "top") {
|
||||
PNotify.notices = $.merge([this], PNotify.notices);
|
||||
} else {
|
||||
PNotify.notices = $.merge(PNotify.notices, [this]);
|
||||
}
|
||||
// Now position all the notices if they are to push to the top.
|
||||
if (this.options.stack.push === "top") {
|
||||
this.queuePosition(false, 1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Mark the stack so it won't animate the new notice.
|
||||
this.options.stack.animation = false;
|
||||
|
||||
// Run the modules.
|
||||
this.runModules('init');
|
||||
|
||||
// Display the notice.
|
||||
if (this.options.auto_display) {
|
||||
this.open();
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
// This function is for updating the notice.
|
||||
update: function(options){
|
||||
// Save old options.
|
||||
var oldOpts = this.options;
|
||||
// Then update to the new options.
|
||||
this.parseOptions(oldOpts, options);
|
||||
// Maybe we need to fade in/out.
|
||||
this.elem.removeClass("ui-pnotify-fade-slow ui-pnotify-fade-normal ui-pnotify-fade-fast");
|
||||
if (this.options.animation === "fade") {
|
||||
this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed);
|
||||
}
|
||||
// Update the corner class.
|
||||
if (this.options.cornerclass !== oldOpts.cornerclass) {
|
||||
this.container.removeClass("ui-corner-all "+oldOpts.cornerclass).addClass(this.options.cornerclass);
|
||||
}
|
||||
// Update the shadow.
|
||||
if (this.options.shadow !== oldOpts.shadow) {
|
||||
if (this.options.shadow) {
|
||||
this.container.addClass("ui-pnotify-shadow");
|
||||
} else {
|
||||
this.container.removeClass("ui-pnotify-shadow");
|
||||
}
|
||||
}
|
||||
// Update the additional classes.
|
||||
if (this.options.addclass === false) {
|
||||
this.elem.removeClass(oldOpts.addclass);
|
||||
} else if (this.options.addclass !== oldOpts.addclass) {
|
||||
this.elem.removeClass(oldOpts.addclass).addClass(this.options.addclass);
|
||||
}
|
||||
// Update the title.
|
||||
if (this.options.title === false) {
|
||||
this.title_container.slideUp("fast");
|
||||
} else if (this.options.title !== oldOpts.title) {
|
||||
if (this.options.title_escape) {
|
||||
this.title_container.text(this.options.title);
|
||||
} else {
|
||||
this.title_container.html(this.options.title);
|
||||
}
|
||||
if (oldOpts.title === false) {
|
||||
this.title_container.slideDown(200);
|
||||
}
|
||||
}
|
||||
// Update the text.
|
||||
if (this.options.text === false) {
|
||||
this.text_container.slideUp("fast");
|
||||
} else if (this.options.text !== oldOpts.text) {
|
||||
if (this.options.text_escape) {
|
||||
this.text_container.text(this.options.text);
|
||||
} else {
|
||||
this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text);
|
||||
}
|
||||
if (oldOpts.text === false) {
|
||||
this.text_container.slideDown(200);
|
||||
}
|
||||
}
|
||||
// Change the notice type.
|
||||
if (this.options.type !== oldOpts.type)
|
||||
this.container.removeClass(
|
||||
this.styles.error+" "+this.styles.notice+" "+this.styles.success+" "+this.styles.info
|
||||
).addClass(this.options.type === "error" ?
|
||||
this.styles.error :
|
||||
(this.options.type === "info" ?
|
||||
this.styles.info :
|
||||
(this.options.type === "success" ?
|
||||
this.styles.success :
|
||||
this.styles.notice
|
||||
)
|
||||
)
|
||||
);
|
||||
if (this.options.icon !== oldOpts.icon || (this.options.icon === true && this.options.type !== oldOpts.type)) {
|
||||
// Remove any old icon.
|
||||
this.container.find("div.ui-pnotify-icon").remove();
|
||||
if (this.options.icon !== false) {
|
||||
// Build the new icon.
|
||||
$("<div />", {"class": "ui-pnotify-icon"})
|
||||
.append($("<span />", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon}))
|
||||
.prependTo(this.container);
|
||||
}
|
||||
}
|
||||
// Update the width.
|
||||
if (this.options.width !== oldOpts.width) {
|
||||
this.elem.animate({width: this.options.width});
|
||||
}
|
||||
// Update the minimum height.
|
||||
if (this.options.min_height !== oldOpts.min_height) {
|
||||
this.container.animate({minHeight: this.options.min_height});
|
||||
}
|
||||
// Update the timed hiding.
|
||||
if (!this.options.hide) {
|
||||
this.cancelRemove();
|
||||
} else if (!oldOpts.hide) {
|
||||
this.queueRemove();
|
||||
}
|
||||
this.queuePosition(true);
|
||||
|
||||
// Run the modules.
|
||||
this.runModules('update', oldOpts);
|
||||
return this;
|
||||
},
|
||||
|
||||
// Display the notice.
|
||||
open: function(){
|
||||
this.state = "opening";
|
||||
// Run the modules.
|
||||
this.runModules('beforeOpen');
|
||||
|
||||
var that = this;
|
||||
// If the notice is not in the DOM, append it.
|
||||
if (!this.elem.parent().length) {
|
||||
this.elem.appendTo(this.options.stack.context ? this.options.stack.context : body);
|
||||
}
|
||||
// Try to put it in the right position.
|
||||
if (this.options.stack.push !== "top") {
|
||||
this.position(true);
|
||||
}
|
||||
this.animateIn(function(){
|
||||
that.queuePosition(true);
|
||||
|
||||
// Now set it to hide.
|
||||
if (that.options.hide) {
|
||||
that.queueRemove();
|
||||
}
|
||||
|
||||
that.state = "open";
|
||||
|
||||
// Run the modules.
|
||||
that.runModules('afterOpen');
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
// Remove the notice.
|
||||
remove: function(timer_hide) {
|
||||
this.state = "closing";
|
||||
this.timerHide = !!timer_hide; // Make sure it's a boolean.
|
||||
// Run the modules.
|
||||
this.runModules('beforeClose');
|
||||
|
||||
var that = this;
|
||||
if (this.timer) {
|
||||
root.clearTimeout(this.timer);
|
||||
this.timer = null;
|
||||
}
|
||||
this.animateOut(function(){
|
||||
that.state = "closed";
|
||||
// Run the modules.
|
||||
that.runModules('afterClose');
|
||||
that.queuePosition(true);
|
||||
// If we're supposed to remove the notice from the DOM, do it.
|
||||
if (that.options.remove) {
|
||||
that.elem.detach();
|
||||
}
|
||||
// Run the modules.
|
||||
that.runModules('beforeDestroy');
|
||||
// Remove object from PNotify.notices to prevent memory leak (issue #49)
|
||||
// unless destroy is off
|
||||
if (that.options.destroy) {
|
||||
if (PNotify.notices !== null) {
|
||||
var idx = $.inArray(that,PNotify.notices);
|
||||
if (idx !== -1) {
|
||||
PNotify.notices.splice(idx,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Run the modules.
|
||||
that.runModules('afterDestroy');
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
// === Class Methods ===
|
||||
|
||||
// Get the DOM element.
|
||||
get: function(){
|
||||
return this.elem;
|
||||
},
|
||||
|
||||
// Put all the options in the right places.
|
||||
parseOptions: function(options, moreOptions){
|
||||
this.options = $.extend(true, {}, PNotify.prototype.options);
|
||||
// This is the only thing that *should* be copied by reference.
|
||||
this.options.stack = PNotify.prototype.options.stack;
|
||||
var optArray = [options, moreOptions], curOpts;
|
||||
for (var curIndex=0; curIndex < optArray.length; curIndex++) {
|
||||
curOpts = optArray[curIndex];
|
||||
if (typeof curOpts === "undefined") {
|
||||
break;
|
||||
}
|
||||
if (typeof curOpts !== 'object') {
|
||||
this.options.text = curOpts;
|
||||
} else {
|
||||
for (var option in curOpts) {
|
||||
if (this.modules[option]) {
|
||||
// Avoid overwriting module defaults.
|
||||
$.extend(true, this.options[option], curOpts[option]);
|
||||
} else {
|
||||
this.options[option] = curOpts[option];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Animate the notice in.
|
||||
animateIn: function(callback){
|
||||
// Declare that the notice is animating in.
|
||||
this.animating = "in";
|
||||
var that = this;
|
||||
callback = (function(){
|
||||
if (that.animTimer) {
|
||||
clearTimeout(that.animTimer);
|
||||
}
|
||||
if (that.animating !== "in") {
|
||||
return;
|
||||
}
|
||||
if (that.elem.is(":visible")) {
|
||||
if (this) {
|
||||
this.call();
|
||||
}
|
||||
// Declare that the notice has completed animating.
|
||||
that.animating = false;
|
||||
} else {
|
||||
that.animTimer = setTimeout(callback, 40);
|
||||
}
|
||||
}).bind(callback);
|
||||
|
||||
if (this.options.animation === "fade") {
|
||||
this.elem.one('webkitTransitionEnd mozTransitionEnd MSTransitionEnd oTransitionEnd transitionend', callback).addClass("ui-pnotify-in");
|
||||
this.elem.css("opacity"); // This line is necessary for some reason. Some notices don't fade without it.
|
||||
this.elem.addClass("ui-pnotify-fade-in");
|
||||
// Just in case the event doesn't fire, call it after 650 ms.
|
||||
this.animTimer = setTimeout(callback, 650);
|
||||
} else {
|
||||
this.elem.addClass("ui-pnotify-in");
|
||||
callback();
|
||||
}
|
||||
},
|
||||
|
||||
// Animate the notice out.
|
||||
animateOut: function(callback){
|
||||
// Declare that the notice is animating out.
|
||||
this.animating = "out";
|
||||
var that = this;
|
||||
callback = (function(){
|
||||
if (that.animTimer) {
|
||||
clearTimeout(that.animTimer);
|
||||
}
|
||||
if (that.animating !== "out") {
|
||||
return;
|
||||
}
|
||||
if (that.elem.css("opacity") == "0" || !that.elem.is(":visible")) {
|
||||
that.elem.removeClass("ui-pnotify-in");
|
||||
if (this) {
|
||||
this.call();
|
||||
}
|
||||
// Declare that the notice has completed animating.
|
||||
that.animating = false;
|
||||
} else {
|
||||
// In case this was called before the notice finished animating.
|
||||
that.animTimer = setTimeout(callback, 40);
|
||||
}
|
||||
}).bind(callback);
|
||||
|
||||
if (this.options.animation === "fade") {
|
||||
this.elem.one('webkitTransitionEnd mozTransitionEnd MSTransitionEnd oTransitionEnd transitionend', callback).removeClass("ui-pnotify-fade-in");
|
||||
// Just in case the event doesn't fire, call it after 650 ms.
|
||||
this.animTimer = setTimeout(callback, 650);
|
||||
} else {
|
||||
this.elem.removeClass("ui-pnotify-in");
|
||||
callback();
|
||||
}
|
||||
},
|
||||
|
||||
// Position the notice. dont_skip_hidden causes the notice to
|
||||
// position even if it's not visible.
|
||||
position: function(dontSkipHidden){
|
||||
// Get the notice's stack.
|
||||
var stack = this.options.stack,
|
||||
elem = this.elem;
|
||||
if (typeof stack.context === "undefined") {
|
||||
stack.context = body;
|
||||
}
|
||||
if (!stack) {
|
||||
return;
|
||||
}
|
||||
if (typeof stack.nextpos1 !== "number") {
|
||||
stack.nextpos1 = stack.firstpos1;
|
||||
}
|
||||
if (typeof stack.nextpos2 !== "number") {
|
||||
stack.nextpos2 = stack.firstpos2;
|
||||
}
|
||||
if (typeof stack.addpos2 !== "number") {
|
||||
stack.addpos2 = 0;
|
||||
}
|
||||
var hidden = !elem.hasClass("ui-pnotify-in");
|
||||
// Skip this notice if it's not shown.
|
||||
if (!hidden || dontSkipHidden) {
|
||||
if (stack.modal) {
|
||||
if (stack.overlay) {
|
||||
stack.overlay.show();
|
||||
} else {
|
||||
stack.overlay = createStackOverlay(stack);
|
||||
}
|
||||
}
|
||||
// Add animate class by default.
|
||||
elem.addClass("ui-pnotify-move");
|
||||
var curpos1, curpos2;
|
||||
// Calculate the current pos1 value.
|
||||
var csspos1;
|
||||
switch (stack.dir1) {
|
||||
case "down":
|
||||
csspos1 = "top";
|
||||
break;
|
||||
case "up":
|
||||
csspos1 = "bottom";
|
||||
break;
|
||||
case "left":
|
||||
csspos1 = "right";
|
||||
break;
|
||||
case "right":
|
||||
csspos1 = "left";
|
||||
break;
|
||||
}
|
||||
curpos1 = parseInt(elem.css(csspos1).replace(/(?:\..*|[^0-9.])/g, ''));
|
||||
if (isNaN(curpos1)) {
|
||||
curpos1 = 0;
|
||||
}
|
||||
// Remember the first pos1, so the first visible notice goes there.
|
||||
if (typeof stack.firstpos1 === "undefined" && !hidden) {
|
||||
stack.firstpos1 = curpos1;
|
||||
stack.nextpos1 = stack.firstpos1;
|
||||
}
|
||||
// Calculate the current pos2 value.
|
||||
var csspos2;
|
||||
switch (stack.dir2) {
|
||||
case "down":
|
||||
csspos2 = "top";
|
||||
break;
|
||||
case "up":
|
||||
csspos2 = "bottom";
|
||||
break;
|
||||
case "left":
|
||||
csspos2 = "right";
|
||||
break;
|
||||
case "right":
|
||||
csspos2 = "left";
|
||||
break;
|
||||
}
|
||||
curpos2 = parseInt(elem.css(csspos2).replace(/(?:\..*|[^0-9.])/g, ''));
|
||||
if (isNaN(curpos2)) {
|
||||
curpos2 = 0;
|
||||
}
|
||||
// Remember the first pos2, so the first visible notice goes there.
|
||||
if (typeof stack.firstpos2 === "undefined" && !hidden) {
|
||||
stack.firstpos2 = curpos2;
|
||||
stack.nextpos2 = stack.firstpos2;
|
||||
}
|
||||
// Check that it's not beyond the viewport edge.
|
||||
if (
|
||||
(stack.dir1 === "down" && stack.nextpos1 + elem.height() > (stack.context.is(body) ? jwindow.height() : stack.context.prop('scrollHeight')) ) ||
|
||||
(stack.dir1 === "up" && stack.nextpos1 + elem.height() > (stack.context.is(body) ? jwindow.height() : stack.context.prop('scrollHeight')) ) ||
|
||||
(stack.dir1 === "left" && stack.nextpos1 + elem.width() > (stack.context.is(body) ? jwindow.width() : stack.context.prop('scrollWidth')) ) ||
|
||||
(stack.dir1 === "right" && stack.nextpos1 + elem.width() > (stack.context.is(body) ? jwindow.width() : stack.context.prop('scrollWidth')) )
|
||||
) {
|
||||
// If it is, it needs to go back to the first pos1, and over on pos2.
|
||||
stack.nextpos1 = stack.firstpos1;
|
||||
stack.nextpos2 += stack.addpos2 + (typeof stack.spacing2 === "undefined" ? 25 : stack.spacing2);
|
||||
stack.addpos2 = 0;
|
||||
}
|
||||
if (typeof stack.nextpos2 === "number") {
|
||||
if (!stack.animation) {
|
||||
elem.removeClass("ui-pnotify-move");
|
||||
elem.css(csspos2, stack.nextpos2+"px");
|
||||
elem.css(csspos2);
|
||||
elem.addClass("ui-pnotify-move");
|
||||
} else {
|
||||
elem.css(csspos2, stack.nextpos2+"px");
|
||||
}
|
||||
}
|
||||
// Keep track of the widest/tallest notice in the column/row, so we can push the next column/row.
|
||||
switch (stack.dir2) {
|
||||
case "down":
|
||||
case "up":
|
||||
if (elem.outerHeight(true) > stack.addpos2) {
|
||||
stack.addpos2 = elem.height();
|
||||
}
|
||||
break;
|
||||
case "left":
|
||||
case "right":
|
||||
if (elem.outerWidth(true) > stack.addpos2) {
|
||||
stack.addpos2 = elem.width();
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Move the notice on dir1.
|
||||
if (typeof stack.nextpos1 === "number") {
|
||||
if (!stack.animation) {
|
||||
elem.removeClass("ui-pnotify-move");
|
||||
elem.css(csspos1, stack.nextpos1+"px");
|
||||
elem.css(csspos1);
|
||||
elem.addClass("ui-pnotify-move");
|
||||
} else {
|
||||
elem.css(csspos1, stack.nextpos1+"px");
|
||||
}
|
||||
}
|
||||
// Calculate the next dir1 position.
|
||||
switch (stack.dir1) {
|
||||
case "down":
|
||||
case "up":
|
||||
stack.nextpos1 += elem.height() + (typeof stack.spacing1 === "undefined" ? 25 : stack.spacing1);
|
||||
break;
|
||||
case "left":
|
||||
case "right":
|
||||
stack.nextpos1 += elem.width() + (typeof stack.spacing1 === "undefined" ? 25 : stack.spacing1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return this;
|
||||
},
|
||||
// Queue the position all function so it doesn't run repeatedly and
|
||||
// use up resources.
|
||||
queuePosition: function(animate, milliseconds){
|
||||
if (posTimer) {
|
||||
clearTimeout(posTimer);
|
||||
}
|
||||
if (!milliseconds) {
|
||||
milliseconds = 10;
|
||||
}
|
||||
posTimer = setTimeout(function(){
|
||||
PNotify.positionAll(animate);
|
||||
}, milliseconds);
|
||||
return this;
|
||||
},
|
||||
|
||||
|
||||
// Cancel any pending removal timer.
|
||||
cancelRemove: function(){
|
||||
if (this.timer) {
|
||||
root.clearTimeout(this.timer);
|
||||
}
|
||||
if (this.animTimer) {
|
||||
root.clearTimeout(this.animTimer);
|
||||
}
|
||||
if (this.state === "closing") {
|
||||
// If it's animating out, stop it.
|
||||
this.state = "open";
|
||||
this.animating = false;
|
||||
this.elem.addClass("ui-pnotify-in");
|
||||
if (this.options.animation === "fade") {
|
||||
this.elem.addClass("ui-pnotify-fade-in");
|
||||
}
|
||||
}
|
||||
return this;
|
||||
},
|
||||
// Queue a removal timer.
|
||||
queueRemove: function(){
|
||||
var that = this;
|
||||
// Cancel any current removal timer.
|
||||
this.cancelRemove();
|
||||
this.timer = root.setTimeout(function(){
|
||||
that.remove(true);
|
||||
}, (isNaN(this.options.delay) ? 0 : this.options.delay));
|
||||
return this;
|
||||
}
|
||||
});
|
||||
// These functions affect all notices.
|
||||
$.extend(PNotify, {
|
||||
// This holds all the notices.
|
||||
notices: [],
|
||||
reload: init,
|
||||
removeAll: function(){
|
||||
$.each(PNotify.notices, function(){
|
||||
if (this.remove) {
|
||||
this.remove(false);
|
||||
}
|
||||
});
|
||||
},
|
||||
removeStack: function(stack){
|
||||
$.each(PNotify.notices, function(){
|
||||
if (this.remove && this.options.stack === stack) {
|
||||
this.remove(false);
|
||||
}
|
||||
});
|
||||
},
|
||||
positionAll: function(animate){
|
||||
// This timer is used for queueing this function so it doesn't run
|
||||
// repeatedly.
|
||||
if (posTimer) {
|
||||
clearTimeout(posTimer);
|
||||
}
|
||||
posTimer = null;
|
||||
// Reset the next position data.
|
||||
if (PNotify.notices && PNotify.notices.length) {
|
||||
$.each(PNotify.notices, function(){
|
||||
var s = this.options.stack;
|
||||
if (!s) {
|
||||
return;
|
||||
}
|
||||
if (s.overlay) {
|
||||
s.overlay.hide();
|
||||
}
|
||||
s.nextpos1 = s.firstpos1;
|
||||
s.nextpos2 = s.firstpos2;
|
||||
s.addpos2 = 0;
|
||||
s.animation = animate;
|
||||
});
|
||||
$.each(PNotify.notices, function(){
|
||||
this.position();
|
||||
});
|
||||
} else {
|
||||
var s = PNotify.prototype.options.stack;
|
||||
if (s) {
|
||||
delete s.nextpos1;
|
||||
delete s.nextpos2;
|
||||
}
|
||||
}
|
||||
},
|
||||
styling: {
|
||||
brighttheme: {
|
||||
// Bright Theme doesn't require any UI libraries.
|
||||
container: "brighttheme",
|
||||
notice: "brighttheme-notice",
|
||||
notice_icon: "brighttheme-icon-notice",
|
||||
info: "brighttheme-info",
|
||||
info_icon: "brighttheme-icon-info",
|
||||
success: "brighttheme-success",
|
||||
success_icon: "brighttheme-icon-success",
|
||||
error: "brighttheme-error",
|
||||
error_icon: "brighttheme-icon-error"
|
||||
},
|
||||
jqueryui: {
|
||||
container: "ui-widget ui-widget-content ui-corner-all",
|
||||
notice: "ui-state-highlight",
|
||||
// (The actual jQUI notice icon looks terrible.)
|
||||
notice_icon: "ui-icon ui-icon-info",
|
||||
info: "",
|
||||
info_icon: "ui-icon ui-icon-info",
|
||||
success: "ui-state-default",
|
||||
success_icon: "ui-icon ui-icon-circle-check",
|
||||
error: "ui-state-error",
|
||||
error_icon: "ui-icon ui-icon-alert"
|
||||
},
|
||||
bootstrap3: {
|
||||
container: "alert",
|
||||
notice: "alert-warning",
|
||||
notice_icon: "glyphicon glyphicon-exclamation-sign",
|
||||
info: "alert-info",
|
||||
info_icon: "glyphicon glyphicon-info-sign",
|
||||
success: "alert-success",
|
||||
success_icon: "glyphicon glyphicon-ok-sign",
|
||||
error: "alert-danger",
|
||||
error_icon: "glyphicon glyphicon-warning-sign"
|
||||
}
|
||||
}
|
||||
});
|
||||
/*
|
||||
* uses icons from http://fontawesome.io/
|
||||
* version 4.0.3
|
||||
*/
|
||||
PNotify.styling.fontawesome = $.extend({}, PNotify.styling.bootstrap3);
|
||||
$.extend(PNotify.styling.fontawesome, {
|
||||
notice_icon: "fa fa-exclamation-circle",
|
||||
info_icon: "fa fa-info",
|
||||
success_icon: "fa fa-check",
|
||||
error_icon: "fa fa-warning"
|
||||
});
|
||||
|
||||
if (root.document.body) {
|
||||
do_when_ready();
|
||||
} else {
|
||||
$(do_when_ready);
|
||||
}
|
||||
return PNotify;
|
||||
};
|
||||
return init(root);
|
||||
}));
|
||||
@@ -1,14 +1,16 @@
|
||||
// Nonblock
|
||||
// Uses AMD or browser globals for jQuery.
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.nonblock', ['jquery', 'pnotify'], factory);
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery, PNotify);
|
||||
}
|
||||
}(function($, PNotify){
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.nonblock', ['jquery', 'pnotify'], factory);
|
||||
} else if (typeof exports === 'object' && typeof module !== 'undefined') {
|
||||
// CommonJS
|
||||
module.exports = factory(require('jquery'), require('./pnotify'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(root.jQuery, root.PNotify);
|
||||
}
|
||||
}(this, function($, PNotify){
|
||||
// Some useful regexes.
|
||||
var re_on = /^on/,
|
||||
re_mouse_events = /^(dbl)?click$|^mouse(move|down|up|over|out|enter|leave)$|^contextmenu$/,
|
||||
@@ -54,11 +56,14 @@
|
||||
var nonblock_last_elem;
|
||||
// This is used to pass events through the notice if it is non-blocking.
|
||||
var nonblock_pass = function(notice, e, e_name){
|
||||
notice.elem.css("display", "none");
|
||||
notice.elem.addClass("ui-pnotify-nonblock-hide");
|
||||
var element_below = document.elementFromPoint(e.clientX, e.clientY);
|
||||
notice.elem.css("display", "block");
|
||||
notice.elem.removeClass("ui-pnotify-nonblock-hide");
|
||||
var jelement_below = $(element_below);
|
||||
var cursor_style = jelement_below.css("cursor");
|
||||
if (cursor_style === "auto" && element_below.tagName === "A") {
|
||||
cursor_style = "pointer";
|
||||
}
|
||||
notice.elem.css("cursor", cursor_style !== "auto" ? cursor_style : "default");
|
||||
// If the element changed, call mouseenter, mouseleave, etc.
|
||||
if (!nonblock_last_elem || nonblock_last_elem.get(0) != element_below) {
|
||||
@@ -77,75 +82,75 @@
|
||||
|
||||
PNotify.prototype.options.nonblock = {
|
||||
// Create a non-blocking notice. It lets the user click elements underneath it.
|
||||
nonblock: false,
|
||||
// The opacity of the notice (if it's non-blocking) when the mouse is over it.
|
||||
nonblock_opacity: .2
|
||||
nonblock: false
|
||||
};
|
||||
PNotify.prototype.modules.nonblock = {
|
||||
// This lets us update the options available in the closures.
|
||||
myOptions: null,
|
||||
|
||||
init: function(notice, options){
|
||||
var that = this;
|
||||
this.myOptions = options;
|
||||
notice.elem.on({
|
||||
"mouseenter": function(e){
|
||||
if (that.myOptions.nonblock) e.stopPropagation();
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
if (that.options.nonblock) {
|
||||
// If it's non-blocking, animate to the other opacity.
|
||||
notice.elem.stop().animate({"opacity": that.myOptions.nonblock_opacity}, "fast");
|
||||
notice.elem.addClass("ui-pnotify-nonblock-fade");
|
||||
}
|
||||
},
|
||||
"mouseleave": function(e){
|
||||
if (that.myOptions.nonblock) e.stopPropagation();
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
nonblock_last_elem = null;
|
||||
notice.elem.css("cursor", "auto");
|
||||
// Animate back to the normal opacity.
|
||||
if (that.myOptions.nonblock && notice.animating !== "out")
|
||||
notice.elem.stop().animate({"opacity": notice.options.opacity}, "fast");
|
||||
if (that.options.nonblock && notice.animating !== "out") {
|
||||
notice.elem.removeClass("ui-pnotify-nonblock-fade");
|
||||
}
|
||||
},
|
||||
"mouseover": function(e){
|
||||
if (that.myOptions.nonblock) e.stopPropagation();
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
},
|
||||
"mouseout": function(e){
|
||||
if (that.myOptions.nonblock) e.stopPropagation();
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
},
|
||||
"mousemove": function(e){
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
nonblock_pass(notice, e, "onmousemove");
|
||||
}
|
||||
},
|
||||
"mousedown": function(e){
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
nonblock_pass(notice, e, "onmousedown");
|
||||
}
|
||||
},
|
||||
"mouseup": function(e){
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
nonblock_pass(notice, e, "onmouseup");
|
||||
}
|
||||
},
|
||||
"click": function(e){
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
nonblock_pass(notice, e, "onclick");
|
||||
}
|
||||
},
|
||||
"dblclick": function(e){
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
nonblock_pass(notice, e, "ondblclick");
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
update: function(notice, options){
|
||||
this.myOptions = options;
|
||||
}
|
||||
};
|
||||
}));
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -63,7 +63,7 @@ requirejs.config({
|
||||
'datatables.net-select': 'lib/datatables/Select-1.2.0/js/dataTables.select.min',
|
||||
|
||||
// notification plugin
|
||||
pnotify: 'lib/pnotify/pnotify.core', // v2.0.1 PNotify - notification core file
|
||||
pnotify: 'lib/pnotify/pnotify', // v3.0.0 PNotify - notification core file - https://sciactive.com/pnotify/
|
||||
'pnotify.buttons': 'lib/pnotify/pnotify.buttons', // PNotify - buttons notification extension
|
||||
'pnotify.confirm': 'lib/pnotify/pnotify.confirm', // PNotify - confirmation notification extension
|
||||
'pnotify.nonblock': 'lib/pnotify/pnotify.nonblock', // PNotify - notification non-block extension (hover effect)
|
||||
|
||||
@@ -66,9 +66,6 @@ define([
|
||||
systemDialogId: 'pf-system-dialog', // id for system dialog
|
||||
systemDialogSelectClass: 'pf-system-dialog-select', // class for system select Element
|
||||
|
||||
// local storage
|
||||
mapLocalStoragePrefix: 'map_', // prefix for map local storage key
|
||||
|
||||
// system security classes
|
||||
systemSec: 'pf-system-sec',
|
||||
systemSecHigh: 'pf-system-sec-highSec',
|
||||
@@ -450,68 +447,6 @@ define([
|
||||
system.addClass( statusClass );
|
||||
};
|
||||
|
||||
/**
|
||||
* set or change rallyPoint for systems
|
||||
* @param rallyUpdated
|
||||
* @param options
|
||||
* @returns {*}
|
||||
*/
|
||||
$.fn.setSystemRally = function(rallyUpdated, options){
|
||||
rallyUpdated = rallyUpdated || 0;
|
||||
|
||||
var defaultOptions = {
|
||||
poke: false,
|
||||
hideNotification: false,
|
||||
hideCounter: false,
|
||||
};
|
||||
options = $.extend({}, defaultOptions, options);
|
||||
|
||||
return this.each(function(){
|
||||
var system = $(this);
|
||||
var rally = system.data('rallyUpdated') || 0;
|
||||
|
||||
if(rallyUpdated !== rally){
|
||||
// rally status changed
|
||||
if( !options.hideCounter ){
|
||||
system.getMapOverlay('timer').startMapUpdateCounter();
|
||||
}
|
||||
|
||||
var rallyClass = MapUtil.getInfoForSystem('rally', 'class');
|
||||
|
||||
if(rallyUpdated > 0){
|
||||
// new rally point set
|
||||
system.addClass( rallyClass );
|
||||
|
||||
if( !options.hideNotification ){
|
||||
var systemName = system.getSystemInfo( ['alias'] );
|
||||
|
||||
var notificationOptions = {
|
||||
title: 'Rally Point',
|
||||
text: 'System: ' + systemName,
|
||||
type: 'success'
|
||||
};
|
||||
|
||||
if(options.poke){
|
||||
// desktop poke
|
||||
Util.showNotify(notificationOptions, {desktop: true, stack: 'barBottom'});
|
||||
}else{
|
||||
Util.showNotify(notificationOptions, {stack: 'barBottom'});
|
||||
}
|
||||
}
|
||||
}else{
|
||||
// rally point removed
|
||||
system.removeClass( rallyClass );
|
||||
|
||||
if( !options.hideNotification ){
|
||||
Util.showNotify({title: 'Rally point removed', type: 'success'});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
system.data('rallyUpdated', rallyUpdated);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* returns a new system or updates an existing system
|
||||
* @param map
|
||||
@@ -669,6 +604,7 @@ define([
|
||||
|
||||
// rally system
|
||||
system.setSystemRally(data.rallyUpdated, {
|
||||
poke: data.rallyPoke || false,
|
||||
hideNotification: true,
|
||||
hideCounter: true,
|
||||
});
|
||||
@@ -1904,7 +1840,7 @@ define([
|
||||
}
|
||||
},
|
||||
setRallyPoke: {
|
||||
label: '<i class="fa fa-fw fa-bullhorn"></i> Set rally and poke',
|
||||
label: '<i class="fa fa-fw fa-bullhorn"></i> set rally and poke',
|
||||
className: 'btn-primary',
|
||||
callback: function() {
|
||||
currentSystem.setSystemRally(1, {
|
||||
@@ -1914,7 +1850,7 @@ define([
|
||||
}
|
||||
},
|
||||
success: {
|
||||
label: '<i class="fa fa-fw fa-check"></i> save',
|
||||
label: '<i class="fa fa-fw fa-users"></i> set rally',
|
||||
className: 'btn-success',
|
||||
callback: function() {
|
||||
currentSystem.setSystemRally(1);
|
||||
@@ -2500,7 +2436,7 @@ define([
|
||||
if(component.data('locked') === true){
|
||||
activeOptions.push('lock_system');
|
||||
}
|
||||
if(component.data('rally') === true){
|
||||
if(component.data('rallyUpdated') > 0){
|
||||
activeOptions.push('set_rally');
|
||||
}
|
||||
}
|
||||
@@ -2623,7 +2559,6 @@ define([
|
||||
* @returns {*}
|
||||
*/
|
||||
$.fn.getSystemInfo = function(info){
|
||||
|
||||
var systemInfo = [];
|
||||
|
||||
for(var i = 0; i < info.length; i++){
|
||||
@@ -3118,6 +3053,7 @@ define([
|
||||
};
|
||||
systemData.locked = system.data('locked') ? 1 : 0;
|
||||
systemData.rallyUpdated = system.data('rallyUpdated') || 0;
|
||||
systemData.rallyPoke = system.data('rallyPoke') ? 1 : 0;
|
||||
systemData.currentUser = system.data('currentUser'); // if user is currently in this system
|
||||
systemData.statics = system.data('statics');
|
||||
systemData.updated = {
|
||||
@@ -3337,7 +3273,7 @@ define([
|
||||
var mapWrapper = mapContainer.parents('.' + config.mapWrapperClass);
|
||||
|
||||
// auto scroll map to previous position
|
||||
var promiseStore = getMapData( mapContainer.data('id') );
|
||||
var promiseStore = MapUtil.getMapData( mapContainer.data('id') );
|
||||
promiseStore.then(function(data) {
|
||||
// This code runs once the value has been loaded
|
||||
// from the offline store.
|
||||
@@ -3365,46 +3301,6 @@ define([
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* get stored map data from client cache (IndexedDB)
|
||||
* @param mapId
|
||||
* @returns {*} promise
|
||||
*/
|
||||
var getMapData = function(mapId){
|
||||
if(mapId > 0){
|
||||
var mapStorageKey = config.mapLocalStoragePrefix + mapId;
|
||||
return Util.localforage.getItem(mapStorageKey);
|
||||
}else{
|
||||
console.error('Map local storage requires mapId > 0');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* store local map config to client cache (IndexedDB)
|
||||
* @param mapId
|
||||
* @param key
|
||||
* @param value
|
||||
*/
|
||||
var storeMapData = function(mapId, key, value){
|
||||
if(mapId > 0){
|
||||
// get current map config
|
||||
var mapStorageKey = config.mapLocalStoragePrefix + mapId;
|
||||
Util.localforage.getItem(mapStorageKey).then(function(data) {
|
||||
// This code runs once the value has been loaded
|
||||
// from the offline store.
|
||||
data = (data === null) ? {} : data;
|
||||
// set/update value
|
||||
data[key] = value;
|
||||
Util.localforage.setItem(mapStorageKey, data);
|
||||
}).catch(function(err) {
|
||||
// This code runs if there were any errors
|
||||
console.error('Map local storage can not be accessed!');
|
||||
});
|
||||
}else{
|
||||
console.error('Map local storage requires mapId > 0');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* init scrollbar for Map element
|
||||
*/
|
||||
@@ -3418,7 +3314,7 @@ define([
|
||||
// scroll complete
|
||||
var mapElement = $(this).find('.' + config.mapClass);
|
||||
// store new map scrollOffset -> localDB
|
||||
storeMapData( mapElement.data('id'), 'offsetX', Math.abs(this.mcs.left) );
|
||||
MapUtil.storeMapData( mapElement.data('id'), 'offsetX', Math.abs(this.mcs.left) );
|
||||
},
|
||||
onScrollStart: function(){
|
||||
// hide all open xEditable fields
|
||||
|
||||
@@ -9,6 +9,11 @@ define([
|
||||
], function($, Init, Util) {
|
||||
'use strict';
|
||||
|
||||
var config = {
|
||||
// local storage
|
||||
mapLocalStoragePrefix: 'map_', // prefix for map local storage key
|
||||
};
|
||||
|
||||
/**
|
||||
* get all available map Types
|
||||
* optional they can be filtered by current access level of a user
|
||||
@@ -326,6 +331,171 @@ define([
|
||||
return scopeInfo;
|
||||
};
|
||||
|
||||
/**
|
||||
* set or change rallyPoint for systems
|
||||
* @param rallyUpdated
|
||||
* @param options
|
||||
* @returns {*}
|
||||
*/
|
||||
$.fn.setSystemRally = function(rallyUpdated, options){
|
||||
rallyUpdated = rallyUpdated || 0;
|
||||
var rallyPoke = false;
|
||||
|
||||
var defaultOptions = {
|
||||
poke: false,
|
||||
hideNotification: false,
|
||||
hideCounter: false,
|
||||
};
|
||||
options = $.extend({}, defaultOptions, options);
|
||||
|
||||
return this.each(function(){
|
||||
var system = $(this);
|
||||
var rally = system.data('rallyUpdated') || 0;
|
||||
|
||||
if(rallyUpdated !== rally){
|
||||
// rally status changed
|
||||
if( !options.hideCounter ){
|
||||
system.getMapOverlay('timer').startMapUpdateCounter();
|
||||
}
|
||||
|
||||
var rallyClass = getInfoForSystem('rally', 'class');
|
||||
|
||||
if(rallyUpdated > 0){
|
||||
// new rally point set OR update system with rally information
|
||||
|
||||
system.addClass( rallyClass );
|
||||
// rallyUpdated > 0 is required for poke!
|
||||
rallyPoke = options.poke;
|
||||
|
||||
var notificationOptions = {
|
||||
title: 'Rally Point',
|
||||
text: 'System: ' + system.data('name')
|
||||
};
|
||||
|
||||
if(rallyUpdated === 1){
|
||||
// rally point not saved on DB
|
||||
notificationOptions.type = 'success';
|
||||
Util.showNotify(notificationOptions);
|
||||
}else if(options.poke){
|
||||
// rally saved AND poke option active
|
||||
|
||||
// check if desktop notification was already send
|
||||
var mapId = system.data('mapid');
|
||||
var systemId = system.data('id');
|
||||
var promiseStore = getMapData(mapId);
|
||||
promiseStore.then(function(data) {
|
||||
// This code runs once the value has been loaded
|
||||
// from the offline store.
|
||||
var rallyPokeData = {};
|
||||
|
||||
if(
|
||||
data &&
|
||||
data.rallyPoke
|
||||
){
|
||||
// poke data exists
|
||||
rallyPokeData = data.rallyPoke;
|
||||
}
|
||||
|
||||
if(
|
||||
!rallyPokeData.hasOwnProperty(this.systemId) || // rally poke was not already send to client
|
||||
rallyPokeData[this.systemId] !== rallyUpdated // already send to that system but in the past
|
||||
){
|
||||
rallyPokeData[this.systemId] = rallyUpdated;
|
||||
storeMapData(this.mapId, 'rallyPoke', rallyPokeData);
|
||||
|
||||
notificationOptions.type = 'info';
|
||||
Util.showNotify(notificationOptions, {desktop: true, stack: 'barBottom'});
|
||||
}
|
||||
}.bind({
|
||||
mapId: mapId,
|
||||
systemId: systemId,
|
||||
rallyUpdated: rallyUpdated
|
||||
}));
|
||||
}
|
||||
}else{
|
||||
// rally point removed
|
||||
system.removeClass( rallyClass );
|
||||
|
||||
if( !options.hideNotification ){
|
||||
Util.showNotify({title: 'Rally point removed', type: 'success'});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
system.data('rallyUpdated', rallyUpdated);
|
||||
system.data('rallyPoke', rallyPoke);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* get stored map data from client cache (IndexedDB)
|
||||
* @param mapId
|
||||
* @returns {*} promise
|
||||
*/
|
||||
var getMapData = function(mapId){
|
||||
if(mapId > 0){
|
||||
var mapStorageKey = config.mapLocalStoragePrefix + mapId;
|
||||
return Util.localforage.getItem(mapStorageKey);
|
||||
}else{
|
||||
console.error('Map local storage requires mapId > 0');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* store local map config to client cache (IndexedDB)
|
||||
* @param mapId
|
||||
* @param key
|
||||
* @param value
|
||||
*/
|
||||
var storeMapData = function(mapId, key, value){
|
||||
if(mapId > 0){
|
||||
// get current map config
|
||||
var mapStorageKey = config.mapLocalStoragePrefix + mapId;
|
||||
Util.localforage.getItem(mapStorageKey).then(function(data) {
|
||||
// This code runs once the value has been loaded
|
||||
// from the offline store.
|
||||
data = (data === null) ? {} : data;
|
||||
// set/update value
|
||||
data[this.key] = this.value;
|
||||
Util.localforage.setItem(this.mapStorageKey, data);
|
||||
}.bind({
|
||||
key: key,
|
||||
value: value,
|
||||
mapStorageKey: mapStorageKey
|
||||
})).catch(function(err) {
|
||||
// This code runs if there were any errors
|
||||
console.error('Map local storage can not be accessed!');
|
||||
});
|
||||
}else{
|
||||
console.error('storeMapData(): Local storage requires mapId > 0');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* delete local map configuration by key (IndexedDB)
|
||||
* @param mapId
|
||||
* @param key
|
||||
*/
|
||||
var deleteMapData = function(mapId, key){
|
||||
if(mapId > 0){
|
||||
// get current map config
|
||||
var mapStorageKey = config.mapLocalStoragePrefix + mapId;
|
||||
Util.localforage.getItem(mapStorageKey).then(function(data) {
|
||||
if(
|
||||
data &&
|
||||
data.hasOwnProperty(key)
|
||||
){
|
||||
delete data[key];
|
||||
Util.localforage.setItem(this.mapStorageKey, data);
|
||||
}
|
||||
}.bind({
|
||||
mapStorageKey: mapStorageKey
|
||||
}));
|
||||
}else{
|
||||
console.error('deleteMapData(): Local storage requires mapId > 0');
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
getMapTypes: getMapTypes,
|
||||
getMapScopes: getMapScopes,
|
||||
@@ -341,6 +511,9 @@ define([
|
||||
checkForConnection: checkForConnection,
|
||||
getDefaultConnectionTypeByScope: getDefaultConnectionTypeByScope,
|
||||
setConnectionWHStatus: setConnectionWHStatus,
|
||||
getScopeInfoForConnection: getScopeInfoForConnection
|
||||
getScopeInfoForConnection: getScopeInfoForConnection,
|
||||
getMapData: getMapData,
|
||||
storeMapData: storeMapData,
|
||||
deleteMapData: deleteMapData
|
||||
};
|
||||
});
|
||||
@@ -49,13 +49,10 @@ define([
|
||||
|
||||
/**
|
||||
* get all maps for a maps module
|
||||
* @param mapModule
|
||||
* @returns {*}
|
||||
*/
|
||||
$.fn.getMaps = function(){
|
||||
|
||||
var maps = $(this).find('.' + config.mapClass);
|
||||
|
||||
return maps;
|
||||
};
|
||||
|
||||
|
||||
@@ -17,31 +17,18 @@ define([
|
||||
text: '',
|
||||
type: '', // 'info', 'success', error, 'warning'
|
||||
icon: false,
|
||||
opacity: 0.8,
|
||||
styling: 'fontawesome', // 'fontawesome', 'bootstrap3', 'jqueryui'
|
||||
animate_speed: 200, // effect animation
|
||||
position_animate_speed: 100, // animation speed for notifications moving up/down
|
||||
animate_speed: 'fast', // animation speed for notifications moving up/down
|
||||
hide: true, // close after few seconds
|
||||
delay: 5000, // visible time for notification in browser
|
||||
mouse_reset: true, // Reset the hide timer if the mouse moves over the notice.
|
||||
shadow: true,
|
||||
addclass: 'stack-bottomright', // class for display, must changed on stack different stacks
|
||||
width: '250px',
|
||||
// animation settings
|
||||
animation: {
|
||||
'effect_in': 'fade',
|
||||
'options_in': {
|
||||
easing: 'linear'
|
||||
},
|
||||
'effect_out': 'fade',
|
||||
'options_out': {
|
||||
easing: 'linear'
|
||||
}
|
||||
},
|
||||
// nonblock extension parameter (click through notifications)
|
||||
nonblock: {
|
||||
nonblock: true,
|
||||
nonblock_opacity: 0.2
|
||||
nonblock: true, // change for enable
|
||||
nonblock_opacity: 0.9
|
||||
},
|
||||
// desktop extension "Web Notifications"
|
||||
desktop: {
|
||||
@@ -64,42 +51,28 @@ define([
|
||||
},
|
||||
addclass: 'stack-bottomright',
|
||||
width: '250px',
|
||||
opacity: 0.8
|
||||
},
|
||||
barTop: {
|
||||
stack: {
|
||||
dir1: 'down',
|
||||
dir2: 'right',
|
||||
push: 'top',
|
||||
spacing1: 0,
|
||||
spacing2: 0,
|
||||
|
||||
},
|
||||
addclass: 'stack-bar-top',
|
||||
width: '80%',
|
||||
opacity: 1
|
||||
},
|
||||
barBottom: {
|
||||
stack: {
|
||||
dir1: 'up',
|
||||
dir2: 'right',
|
||||
firstpos1: 30,
|
||||
// context: $('body'),
|
||||
spacing1: 0,
|
||||
spacing2: 0
|
||||
},
|
||||
addclass: 'stack-bar-bottom',
|
||||
width: '100%',
|
||||
opacity: 1
|
||||
width: '70%',
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* show a notification in browser and/or "Web Notifications" in OS
|
||||
* @param customConfig
|
||||
* @param settings
|
||||
*/
|
||||
var showNotify = function(customConfig, settings){
|
||||
|
||||
customConfig = $.extend({}, config, customConfig );
|
||||
customConfig = $.extend(true, {}, config, customConfig );
|
||||
|
||||
// desktop notification
|
||||
if(
|
||||
@@ -114,10 +87,6 @@ define([
|
||||
|
||||
// make browser tab blink
|
||||
startTabBlink(customConfig.title);
|
||||
|
||||
}else{
|
||||
customConfig.delay = 5000;
|
||||
customConfig.desktop.desktop = false;
|
||||
}
|
||||
|
||||
// set notification stack
|
||||
@@ -128,11 +97,9 @@ define([
|
||||
customConfig.stack = stack[settings.stack].stack;
|
||||
customConfig.addclass = stack[settings.stack].addclass;
|
||||
customConfig.width = stack[settings.stack].width;
|
||||
customConfig.opacity = stack[settings.stack].opacity;
|
||||
}else{
|
||||
customConfig.stack = stack.bottomRight.stack;
|
||||
customConfig.addclass = stack.bottomRight.addclass;
|
||||
customConfig.opacity = stack.bottomRight.opacity;
|
||||
}
|
||||
|
||||
switch(customConfig.type){
|
||||
@@ -168,7 +135,6 @@ define([
|
||||
* @param blinkTitle
|
||||
*/
|
||||
var startTabBlink = function(blinkTitle){
|
||||
|
||||
var initBlink = (function(blinkTitle){
|
||||
|
||||
var currentTitle = document.title;
|
||||
@@ -195,10 +161,8 @@ define([
|
||||
}( blinkTitle ));
|
||||
|
||||
initBlink();
|
||||
|
||||
};
|
||||
|
||||
|
||||
return {
|
||||
showNotify: showNotify,
|
||||
startTabBlink: startTabBlink
|
||||
|
||||
176
public/js/v1.1.3/lib/pnotify/pnotify.buttons.js
Normal file
176
public/js/v1.1.3/lib/pnotify/pnotify.buttons.js
Normal file
@@ -0,0 +1,176 @@
|
||||
// Buttons
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.buttons', ['jquery', 'pnotify'], factory);
|
||||
} else if (typeof exports === 'object' && typeof module !== 'undefined') {
|
||||
// CommonJS
|
||||
module.exports = factory(require('jquery'), require('./pnotify'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(root.jQuery, root.PNotify);
|
||||
}
|
||||
}(this, function($, PNotify){
|
||||
PNotify.prototype.options.buttons = {
|
||||
// Provide a button for the user to manually close the notice.
|
||||
closer: true,
|
||||
// Only show the closer button on hover.
|
||||
closer_hover: true,
|
||||
// Provide a button for the user to manually stick the notice.
|
||||
sticker: true,
|
||||
// Only show the sticker button on hover.
|
||||
sticker_hover: true,
|
||||
// Show the buttons even when the nonblock module is in use.
|
||||
show_on_nonblock: false,
|
||||
// The various displayed text, helps facilitating internationalization.
|
||||
labels: {
|
||||
close: "Close",
|
||||
stick: "Stick",
|
||||
unstick: "Unstick"
|
||||
},
|
||||
// The classes to use for button icons. Leave them null to use the classes from the styling you're using.
|
||||
classes: {
|
||||
closer: null,
|
||||
pin_up: null,
|
||||
pin_down: null
|
||||
}
|
||||
};
|
||||
PNotify.prototype.modules.buttons = {
|
||||
closer: null,
|
||||
sticker: null,
|
||||
|
||||
init: function(notice, options){
|
||||
var that = this;
|
||||
notice.elem.on({
|
||||
"mouseenter": function(e){
|
||||
// Show the buttons.
|
||||
if (that.options.sticker && (!(notice.options.nonblock && notice.options.nonblock.nonblock) || that.options.show_on_nonblock)) {
|
||||
that.sticker.trigger("pnotify:buttons:toggleStick").css("visibility", "visible");
|
||||
}
|
||||
if (that.options.closer && (!(notice.options.nonblock && notice.options.nonblock.nonblock) || that.options.show_on_nonblock)) {
|
||||
that.closer.css("visibility", "visible");
|
||||
}
|
||||
},
|
||||
"mouseleave": function(e){
|
||||
// Hide the buttons.
|
||||
if (that.options.sticker_hover) {
|
||||
that.sticker.css("visibility", "hidden");
|
||||
}
|
||||
if (that.options.closer_hover) {
|
||||
that.closer.css("visibility", "hidden");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Provide a button to stick the notice.
|
||||
this.sticker = $("<div />", {
|
||||
"class": "ui-pnotify-sticker",
|
||||
"aria-role": "button",
|
||||
"aria-pressed": notice.options.hide ? "false" : "true",
|
||||
"tabindex": "0",
|
||||
"title": notice.options.hide ? options.labels.stick : options.labels.unstick,
|
||||
"css": {
|
||||
"cursor": "pointer",
|
||||
"visibility": options.sticker_hover ? "hidden" : "visible"
|
||||
},
|
||||
"click": function(){
|
||||
notice.options.hide = !notice.options.hide;
|
||||
if (notice.options.hide) {
|
||||
notice.queueRemove();
|
||||
} else {
|
||||
notice.cancelRemove();
|
||||
}
|
||||
$(this).trigger("pnotify:buttons:toggleStick");
|
||||
}
|
||||
})
|
||||
.bind("pnotify:buttons:toggleStick", function(){
|
||||
var pin_up = that.options.classes.pin_up === null ? notice.styles.pin_up : that.options.classes.pin_up;
|
||||
var pin_down = that.options.classes.pin_down === null ? notice.styles.pin_down : that.options.classes.pin_down;
|
||||
$(this)
|
||||
.attr("title", notice.options.hide ? that.options.labels.stick : that.options.labels.unstick)
|
||||
.children()
|
||||
.attr("class", "")
|
||||
.addClass(notice.options.hide ? pin_up : pin_down)
|
||||
.attr("aria-pressed", notice.options.hide ? "false" : "true");
|
||||
})
|
||||
.append("<span />")
|
||||
.trigger("pnotify:buttons:toggleStick")
|
||||
.prependTo(notice.container);
|
||||
if (!options.sticker || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.sticker.css("display", "none");
|
||||
}
|
||||
|
||||
// Provide a button to close the notice.
|
||||
this.closer = $("<div />", {
|
||||
"class": "ui-pnotify-closer",
|
||||
"aria-role": "button",
|
||||
"tabindex": "0",
|
||||
"title": options.labels.close,
|
||||
"css": {"cursor": "pointer", "visibility": options.closer_hover ? "hidden" : "visible"},
|
||||
"click": function(){
|
||||
notice.remove(false);
|
||||
that.sticker.css("visibility", "hidden");
|
||||
that.closer.css("visibility", "hidden");
|
||||
}
|
||||
})
|
||||
.append($("<span />", {"class": options.classes.closer === null ? notice.styles.closer : options.classes.closer}))
|
||||
.prependTo(notice.container);
|
||||
if (!options.closer || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.closer.css("display", "none");
|
||||
}
|
||||
},
|
||||
update: function(notice, options){
|
||||
// Update the sticker and closer buttons.
|
||||
if (!options.closer || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.closer.css("display", "none");
|
||||
} else if (options.closer) {
|
||||
this.closer.css("display", "block");
|
||||
}
|
||||
if (!options.sticker || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.sticker.css("display", "none");
|
||||
} else if (options.sticker) {
|
||||
this.sticker.css("display", "block");
|
||||
}
|
||||
// Update the sticker icon.
|
||||
this.sticker.trigger("pnotify:buttons:toggleStick");
|
||||
// Update the close icon.
|
||||
this.closer.find("span").attr("class", "").addClass(options.classes.closer === null ? notice.styles.closer : options.classes.closer);
|
||||
// Update the hover status of the buttons.
|
||||
if (options.sticker_hover) {
|
||||
this.sticker.css("visibility", "hidden");
|
||||
} else if (!(notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.sticker.css("visibility", "visible");
|
||||
}
|
||||
if (options.closer_hover) {
|
||||
this.closer.css("visibility", "hidden");
|
||||
} else if (!(notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) {
|
||||
this.closer.css("visibility", "visible");
|
||||
}
|
||||
}
|
||||
};
|
||||
$.extend(PNotify.styling.brighttheme, {
|
||||
closer: "brighttheme-icon-closer",
|
||||
pin_up: "brighttheme-icon-sticker",
|
||||
pin_down: "brighttheme-icon-sticker brighttheme-icon-stuck"
|
||||
});
|
||||
$.extend(PNotify.styling.jqueryui, {
|
||||
closer: "ui-icon ui-icon-close",
|
||||
pin_up: "ui-icon ui-icon-pin-w",
|
||||
pin_down: "ui-icon ui-icon-pin-s"
|
||||
});
|
||||
$.extend(PNotify.styling.bootstrap2, {
|
||||
closer: "icon-remove",
|
||||
pin_up: "icon-pause",
|
||||
pin_down: "icon-play"
|
||||
});
|
||||
$.extend(PNotify.styling.bootstrap3, {
|
||||
closer: "glyphicon glyphicon-remove",
|
||||
pin_up: "glyphicon glyphicon-pause",
|
||||
pin_down: "glyphicon glyphicon-play"
|
||||
});
|
||||
$.extend(PNotify.styling.fontawesome, {
|
||||
closer: "fa fa-times",
|
||||
pin_up: "fa fa-pause",
|
||||
pin_down: "fa fa-play"
|
||||
});
|
||||
}));
|
||||
@@ -1,14 +1,16 @@
|
||||
// Callbacks
|
||||
// Uses AMD or browser globals for jQuery.
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.callbacks', ['jquery', 'pnotify'], factory);
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery, PNotify);
|
||||
}
|
||||
}(function($, PNotify){
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.callbacks', ['jquery', 'pnotify'], factory);
|
||||
} else if (typeof exports === 'object' && typeof module !== 'undefined') {
|
||||
// CommonJS
|
||||
module.exports = factory(require('jquery'), require('./pnotify'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(root.jQuery, root.PNotify);
|
||||
}
|
||||
}(this, function($, PNotify){
|
||||
var _init = PNotify.prototype.init,
|
||||
_open = PNotify.prototype.open,
|
||||
_remove = PNotify.prototype.remove;
|
||||
|
||||
@@ -1,778 +0,0 @@
|
||||
/*
|
||||
PNotify 2.0.1 sciactive.com/pnotify/
|
||||
(C) 2014 Hunter Perrin
|
||||
license GPL/LGPL/MPL
|
||||
*/
|
||||
/*
|
||||
* ====== PNotify ======
|
||||
*
|
||||
* http://sciactive.com/pnotify/
|
||||
*
|
||||
* Copyright 2009-2014 Hunter Perrin
|
||||
*
|
||||
* Triple licensed under the GPL, LGPL, and MPL.
|
||||
* http://gnu.org/licenses/gpl.html
|
||||
* http://gnu.org/licenses/lgpl.html
|
||||
* http://mozilla.org/MPL/MPL-1.1.html
|
||||
*/
|
||||
|
||||
// Uses AMD or browser globals for jQuery.
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify', ['jquery'], factory);
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function($){
|
||||
var default_stack = {
|
||||
dir1: "down",
|
||||
dir2: "left",
|
||||
push: "bottom",
|
||||
spacing1: 25,
|
||||
spacing2: 25,
|
||||
context: $("body")
|
||||
};
|
||||
var timer, // Position all timer.
|
||||
body,
|
||||
jwindow = $(window);
|
||||
// Set global variables.
|
||||
var do_when_ready = function(){
|
||||
body = $("body");
|
||||
PNotify.prototype.options.stack.context = body;
|
||||
jwindow = $(window);
|
||||
// Reposition the notices when the window resizes.
|
||||
jwindow.bind('resize', function(){
|
||||
if (timer)
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(function(){ PNotify.positionAll(true) }, 10);
|
||||
});
|
||||
};
|
||||
PNotify = function(options){
|
||||
this.parseOptions(options);
|
||||
this.init();
|
||||
};
|
||||
$.extend(PNotify.prototype, {
|
||||
// The current version of PNotify.
|
||||
version: "2.0.1",
|
||||
|
||||
// === Options ===
|
||||
|
||||
// Options defaults.
|
||||
options: {
|
||||
// The notice's title.
|
||||
title: false,
|
||||
// Whether to escape the content of the title. (Not allow HTML.)
|
||||
title_escape: false,
|
||||
// The notice's text.
|
||||
text: false,
|
||||
// Whether to escape the content of the text. (Not allow HTML.)
|
||||
text_escape: false,
|
||||
// What styling classes to use. (Can be either jqueryui or bootstrap.)
|
||||
styling: "bootstrap3",
|
||||
// Additional classes to be added to the notice. (For custom styling.)
|
||||
addclass: "",
|
||||
// Class to be added to the notice for corner styling.
|
||||
cornerclass: "",
|
||||
// Display the notice when it is created.
|
||||
auto_display: true,
|
||||
// Width of the notice.
|
||||
width: "300px",
|
||||
// Minimum height of the notice. It will expand to fit content.
|
||||
min_height: "16px",
|
||||
// Type of the notice. "notice", "info", "success", or "error".
|
||||
type: "notice",
|
||||
// Set icon to true to use the default icon for the selected
|
||||
// style/type, false for no icon, or a string for your own icon class.
|
||||
icon: true,
|
||||
// Opacity of the notice.
|
||||
opacity: 1,
|
||||
// The animation to use when displaying and hiding the notice. "none",
|
||||
// "show", "fade", and "slide" are built in to jQuery. Others require jQuery
|
||||
// UI. Use an object with effect_in and effect_out to use different effects.
|
||||
animation: "fade",
|
||||
// Speed at which the notice animates in and out. "slow", "def" or "normal",
|
||||
// "fast" or number of milliseconds.
|
||||
animate_speed: "slow",
|
||||
// Specify a specific duration of position animation
|
||||
position_animate_speed: 500,
|
||||
// Display a drop shadow.
|
||||
shadow: true,
|
||||
// After a delay, remove the notice.
|
||||
hide: true,
|
||||
// Delay in milliseconds before the notice is removed.
|
||||
delay: 8000,
|
||||
// Reset the hide timer if the mouse moves over the notice.
|
||||
mouse_reset: true,
|
||||
// Remove the notice's elements from the DOM after it is removed.
|
||||
remove: true,
|
||||
// Change new lines to br tags.
|
||||
insert_brs: true,
|
||||
// Whether to remove notices from the global array.
|
||||
destroy: true,
|
||||
// The stack on which the notices will be placed. Also controls the
|
||||
// direction the notices stack.
|
||||
stack: default_stack
|
||||
},
|
||||
|
||||
// === Modules ===
|
||||
|
||||
// This object holds all the PNotify modules. They are used to provide
|
||||
// additional functionality.
|
||||
modules: {},
|
||||
// This runs an event on all the modules.
|
||||
runModules: function(event, arg){
|
||||
var curArg;
|
||||
for (var module in this.modules) {
|
||||
curArg = ((typeof arg === "object" && module in arg) ? arg[module] : arg);
|
||||
if (typeof this.modules[module][event] === 'function')
|
||||
this.modules[module][event](this, typeof this.options[module] === 'object' ? this.options[module] : {}, curArg);
|
||||
}
|
||||
},
|
||||
|
||||
// === Class Variables ===
|
||||
|
||||
state: "initializing", // The state can be "initializing", "opening", "open", "closing", and "closed".
|
||||
timer: null, // Auto close timer.
|
||||
styles: null,
|
||||
elem: null,
|
||||
container: null,
|
||||
title_container: null,
|
||||
text_container: null,
|
||||
animating: false, // Stores what is currently being animated (in or out).
|
||||
timerHide: false, // Stores whether the notice was hidden by a timer.
|
||||
|
||||
// === Events ===
|
||||
|
||||
init: function(){
|
||||
var that = this;
|
||||
|
||||
// First and foremost, we don't want our module objects all referencing the prototype.
|
||||
this.modules = {};
|
||||
$.extend(true, this.modules, PNotify.prototype.modules);
|
||||
|
||||
// Get our styling object.
|
||||
if (typeof this.options.styling === "object") {
|
||||
this.styles = this.options.styling;
|
||||
} else {
|
||||
this.styles = PNotify.styling[this.options.styling];
|
||||
}
|
||||
|
||||
// Create our widget.
|
||||
// Stop animation, reset the removal timer when the user mouses over.
|
||||
this.elem = $("<div />", {
|
||||
"class": "ui-pnotify "+this.options.addclass,
|
||||
"css": {"display": "none"},
|
||||
"mouseenter": function(e){
|
||||
if (that.options.mouse_reset && that.animating === "out") {
|
||||
if (!that.timerHide)
|
||||
return;
|
||||
that.cancelRemove();
|
||||
}
|
||||
// Stop the close timer.
|
||||
if (that.options.hide && that.options.mouse_reset) that.cancelRemove();
|
||||
},
|
||||
"mouseleave": function(e){
|
||||
// Start the close timer.
|
||||
if (that.options.hide && that.options.mouse_reset) that.queueRemove();
|
||||
PNotify.positionAll();
|
||||
}
|
||||
});
|
||||
// Create a container for the notice contents.
|
||||
this.container = $("<div />", {"class": this.styles.container+" ui-pnotify-container "+(this.options.type === "error" ? this.styles.error : (this.options.type === "info" ? this.styles.info : (this.options.type === "success" ? this.styles.success : this.styles.notice)))})
|
||||
.appendTo(this.elem);
|
||||
if (this.options.cornerclass !== "")
|
||||
this.container.removeClass("ui-corner-all").addClass(this.options.cornerclass);
|
||||
// Create a drop shadow.
|
||||
if (this.options.shadow)
|
||||
this.container.addClass("ui-pnotify-shadow");
|
||||
|
||||
|
||||
// Add the appropriate icon.
|
||||
if (this.options.icon !== false) {
|
||||
$("<div />", {"class": "ui-pnotify-icon"})
|
||||
.append($("<span />", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon}))
|
||||
.prependTo(this.container);
|
||||
}
|
||||
|
||||
// Add a title.
|
||||
this.title_container = $("<h4 />", {
|
||||
"class": "ui-pnotify-title"
|
||||
})
|
||||
.appendTo(this.container);
|
||||
if (this.options.title === false)
|
||||
this.title_container.hide();
|
||||
else if (this.options.title_escape)
|
||||
this.title_container.text(this.options.title);
|
||||
else
|
||||
this.title_container.html(this.options.title);
|
||||
|
||||
// Add text.
|
||||
this.text_container = $("<div />", {
|
||||
"class": "ui-pnotify-text"
|
||||
})
|
||||
.appendTo(this.container);
|
||||
if (this.options.text === false)
|
||||
this.text_container.hide();
|
||||
else if (this.options.text_escape)
|
||||
this.text_container.text(this.options.text);
|
||||
else
|
||||
this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text);
|
||||
|
||||
// Set width and min height.
|
||||
if (typeof this.options.width === "string")
|
||||
this.elem.css("width", this.options.width);
|
||||
if (typeof this.options.min_height === "string")
|
||||
this.container.css("min-height", this.options.min_height);
|
||||
|
||||
|
||||
// Add the notice to the notice array.
|
||||
if (this.options.stack.push === "top")
|
||||
PNotify.notices = $.merge([this], PNotify.notices);
|
||||
else
|
||||
PNotify.notices = $.merge(PNotify.notices, [this]);
|
||||
// Now position all the notices if they are to push to the top.
|
||||
if (this.options.stack.push === "top")
|
||||
this.queuePosition(false, 1);
|
||||
|
||||
|
||||
|
||||
|
||||
// Mark the stack so it won't animate the new notice.
|
||||
this.options.stack.animation = false;
|
||||
|
||||
// Run the modules.
|
||||
this.runModules('init');
|
||||
|
||||
// Display the notice.
|
||||
if (this.options.auto_display)
|
||||
this.open();
|
||||
return this;
|
||||
},
|
||||
|
||||
// This function is for updating the notice.
|
||||
update: function(options){
|
||||
// Save old options.
|
||||
var oldOpts = this.options;
|
||||
// Then update to the new options.
|
||||
this.parseOptions(oldOpts, options);
|
||||
// Update the corner class.
|
||||
if (this.options.cornerclass !== oldOpts.cornerclass)
|
||||
this.container.removeClass("ui-corner-all "+oldOpts.cornerclass).addClass(this.options.cornerclass);
|
||||
// Update the shadow.
|
||||
if (this.options.shadow !== oldOpts.shadow) {
|
||||
if (this.options.shadow)
|
||||
this.container.addClass("ui-pnotify-shadow");
|
||||
else
|
||||
this.container.removeClass("ui-pnotify-shadow");
|
||||
}
|
||||
// Update the additional classes.
|
||||
if (this.options.addclass === false)
|
||||
this.elem.removeClass(oldOpts.addclass);
|
||||
else if (this.options.addclass !== oldOpts.addclass)
|
||||
this.elem.removeClass(oldOpts.addclass).addClass(this.options.addclass);
|
||||
// Update the title.
|
||||
if (this.options.title === false)
|
||||
this.title_container.slideUp("fast");
|
||||
else if (this.options.title !== oldOpts.title) {
|
||||
if (this.options.title_escape)
|
||||
this.title_container.text(this.options.title);
|
||||
else
|
||||
this.title_container.html(this.options.title);
|
||||
if (oldOpts.title === false)
|
||||
this.title_container.slideDown(200)
|
||||
}
|
||||
// Update the text.
|
||||
if (this.options.text === false) {
|
||||
this.text_container.slideUp("fast");
|
||||
} else if (this.options.text !== oldOpts.text) {
|
||||
if (this.options.text_escape)
|
||||
this.text_container.text(this.options.text);
|
||||
else
|
||||
this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text);
|
||||
if (oldOpts.text === false)
|
||||
this.text_container.slideDown(200)
|
||||
}
|
||||
// Change the notice type.
|
||||
if (this.options.type !== oldOpts.type)
|
||||
this.container.removeClass(
|
||||
this.styles.error+" "+this.styles.notice+" "+this.styles.success+" "+this.styles.info
|
||||
).addClass(this.options.type === "error" ?
|
||||
this.styles.error :
|
||||
(this.options.type === "info" ?
|
||||
this.styles.info :
|
||||
(this.options.type === "success" ?
|
||||
this.styles.success :
|
||||
this.styles.notice
|
||||
)
|
||||
)
|
||||
);
|
||||
if (this.options.icon !== oldOpts.icon || (this.options.icon === true && this.options.type !== oldOpts.type)) {
|
||||
// Remove any old icon.
|
||||
this.container.find("div.ui-pnotify-icon").remove();
|
||||
if (this.options.icon !== false) {
|
||||
// Build the new icon.
|
||||
$("<div />", {"class": "ui-pnotify-icon"})
|
||||
.append($("<span />", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon}))
|
||||
.prependTo(this.container);
|
||||
}
|
||||
}
|
||||
// Update the width.
|
||||
if (this.options.width !== oldOpts.width)
|
||||
this.elem.animate({width: this.options.width});
|
||||
// Update the minimum height.
|
||||
if (this.options.min_height !== oldOpts.min_height)
|
||||
this.container.animate({minHeight: this.options.min_height});
|
||||
// Update the opacity.
|
||||
if (this.options.opacity !== oldOpts.opacity)
|
||||
this.elem.fadeTo(this.options.animate_speed, this.options.opacity);
|
||||
// Update the timed hiding.
|
||||
if (!this.options.hide)
|
||||
this.cancelRemove();
|
||||
else if (!oldOpts.hide)
|
||||
this.queueRemove();
|
||||
this.queuePosition(true);
|
||||
|
||||
// Run the modules.
|
||||
this.runModules('update', oldOpts);
|
||||
return this;
|
||||
},
|
||||
|
||||
// Display the notice.
|
||||
open: function(){
|
||||
this.state = "opening";
|
||||
// Run the modules.
|
||||
this.runModules('beforeOpen');
|
||||
|
||||
var that = this;
|
||||
// If the notice is not in the DOM, append it.
|
||||
if (!this.elem.parent().length)
|
||||
this.elem.appendTo(this.options.stack.context ? this.options.stack.context : body);
|
||||
// Try to put it in the right position.
|
||||
if (this.options.stack.push !== "top")
|
||||
this.position(true);
|
||||
// First show it, then set its opacity, then hide it.
|
||||
if (this.options.animation === "fade" || this.options.animation.effect_in === "fade") {
|
||||
// If it's fading in, it should start at 0.
|
||||
this.elem.show().fadeTo(0, 0).hide();
|
||||
} else {
|
||||
// Or else it should be set to the opacity.
|
||||
if (this.options.opacity !== 1)
|
||||
this.elem.show().fadeTo(0, this.options.opacity).hide();
|
||||
}
|
||||
this.animateIn(function(){
|
||||
that.queuePosition(true);
|
||||
|
||||
// Now set it to hide.
|
||||
if (that.options.hide)
|
||||
that.queueRemove();
|
||||
|
||||
that.state = "open";
|
||||
|
||||
// Run the modules.
|
||||
that.runModules('afterOpen');
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
// Remove the notice.
|
||||
remove: function(timer_hide) {
|
||||
this.state = "closing";
|
||||
this.timerHide = !!timer_hide; // Make sure it's a boolean.
|
||||
// Run the modules.
|
||||
this.runModules('beforeClose');
|
||||
|
||||
var that = this;
|
||||
if (this.timer) {
|
||||
window.clearTimeout(this.timer);
|
||||
this.timer = null;
|
||||
}
|
||||
this.animateOut(function(){
|
||||
that.state = "closed";
|
||||
// Run the modules.
|
||||
that.runModules('afterClose');
|
||||
that.queuePosition(true);
|
||||
// If we're supposed to remove the notice from the DOM, do it.
|
||||
if (that.options.remove)
|
||||
that.elem.detach();
|
||||
// Run the modules.
|
||||
that.runModules('beforeDestroy');
|
||||
// Remove object from PNotify.notices to prevent memory leak (issue #49)
|
||||
// unless destroy is off
|
||||
if (that.options.destroy) {
|
||||
if (PNotify.notices !== null) {
|
||||
var idx = $.inArray(that,PNotify.notices);
|
||||
if (idx !== -1) {
|
||||
PNotify.notices.splice(idx,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Run the modules.
|
||||
that.runModules('afterDestroy');
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
// === Class Methods ===
|
||||
|
||||
// Get the DOM element.
|
||||
get: function(){ return this.elem; },
|
||||
|
||||
// Put all the options in the right places.
|
||||
parseOptions: function(options, moreOptions){
|
||||
this.options = $.extend(true, {}, PNotify.prototype.options);
|
||||
// This is the only thing that *should* be copied by reference.
|
||||
this.options.stack = PNotify.prototype.options.stack;
|
||||
var optArray = [options, moreOptions], curOpts;
|
||||
for (var curIndex in optArray) {
|
||||
curOpts = optArray[curIndex];
|
||||
if (typeof curOpts == "undefined")
|
||||
break;
|
||||
if (typeof curOpts !== 'object') {
|
||||
this.options.text = curOpts;
|
||||
} else {
|
||||
for (var option in curOpts) {
|
||||
if (this.modules[option]) {
|
||||
// Avoid overwriting module defaults.
|
||||
$.extend(true, this.options[option], curOpts[option]);
|
||||
} else {
|
||||
this.options[option] = curOpts[option];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Animate the notice in.
|
||||
animateIn: function(callback){
|
||||
// Declare that the notice is animating in. (Or has completed animating in.)
|
||||
this.animating = "in";
|
||||
var animation;
|
||||
if (typeof this.options.animation.effect_in !== "undefined")
|
||||
animation = this.options.animation.effect_in;
|
||||
else
|
||||
animation = this.options.animation;
|
||||
if (animation === "none") {
|
||||
this.elem.show();
|
||||
callback();
|
||||
} else if (animation === "show")
|
||||
this.elem.show(this.options.animate_speed, callback);
|
||||
else if (animation === "fade")
|
||||
this.elem.show().fadeTo(this.options.animate_speed, this.options.opacity, callback);
|
||||
else if (animation === "slide")
|
||||
this.elem.slideDown(this.options.animate_speed, callback);
|
||||
else if (typeof animation === "function")
|
||||
animation("in", callback, this.elem);
|
||||
else
|
||||
this.elem.show(animation, (typeof this.options.animation.options_in === "object" ? this.options.animation.options_in : {}), this.options.animate_speed, callback);
|
||||
if (this.elem.parent().hasClass('ui-effects-wrapper'))
|
||||
this.elem.parent().css({"position": "fixed", "overflow": "visible"});
|
||||
if (animation !== "slide")
|
||||
this.elem.css("overflow", "visible");
|
||||
this.container.css("overflow", "hidden");
|
||||
},
|
||||
|
||||
// Animate the notice out.
|
||||
animateOut: function(callback){
|
||||
// Declare that the notice is animating out. (Or has completed animating out.)
|
||||
this.animating = "out";
|
||||
var animation;
|
||||
if (typeof this.options.animation.effect_out !== "undefined")
|
||||
animation = this.options.animation.effect_out;
|
||||
else
|
||||
animation = this.options.animation;
|
||||
if (animation === "none") {
|
||||
this.elem.hide();
|
||||
callback();
|
||||
} else if (animation === "show")
|
||||
this.elem.hide(this.options.animate_speed, callback);
|
||||
else if (animation === "fade")
|
||||
this.elem.fadeOut(this.options.animate_speed, callback);
|
||||
else if (animation === "slide")
|
||||
this.elem.slideUp(this.options.animate_speed, callback);
|
||||
else if (typeof animation === "function")
|
||||
animation("out", callback, this.elem);
|
||||
else
|
||||
this.elem.hide(animation, (typeof this.options.animation.options_out === "object" ? this.options.animation.options_out : {}), this.options.animate_speed, callback);
|
||||
if (this.elem.parent().hasClass('ui-effects-wrapper'))
|
||||
this.elem.parent().css({"position": "fixed", "overflow": "visible"});
|
||||
if (animation !== "slide")
|
||||
this.elem.css("overflow", "visible");
|
||||
this.container.css("overflow", "hidden");
|
||||
},
|
||||
|
||||
// Position the notice. dont_skip_hidden causes the notice to
|
||||
// position even if it's not visible.
|
||||
position: function(dontSkipHidden){
|
||||
// Get the notice's stack.
|
||||
var s = this.options.stack,
|
||||
e = this.elem;
|
||||
if (e.parent().hasClass('ui-effects-wrapper'))
|
||||
e = this.elem.css({"left": "0", "top": "0", "right": "0", "bottom": "0"}).parent();
|
||||
if (typeof s.context === "undefined")
|
||||
s.context = body;
|
||||
if (!s) return;
|
||||
if (typeof s.nextpos1 !== "number")
|
||||
s.nextpos1 = s.firstpos1;
|
||||
if (typeof s.nextpos2 !== "number")
|
||||
s.nextpos2 = s.firstpos2;
|
||||
if (typeof s.addpos2 !== "number")
|
||||
s.addpos2 = 0;
|
||||
var hidden = e.css("display") === "none";
|
||||
// Skip this notice if it's not shown.
|
||||
if (!hidden || dontSkipHidden) {
|
||||
var curpos1, curpos2;
|
||||
// Store what will need to be animated.
|
||||
var animate = {};
|
||||
// Calculate the current pos1 value.
|
||||
var csspos1;
|
||||
switch (s.dir1) {
|
||||
case "down":
|
||||
csspos1 = "top";
|
||||
break;
|
||||
case "up":
|
||||
csspos1 = "bottom";
|
||||
break;
|
||||
case "left":
|
||||
csspos1 = "right";
|
||||
break;
|
||||
case "right":
|
||||
csspos1 = "left";
|
||||
break;
|
||||
}
|
||||
curpos1 = parseInt(e.css(csspos1).replace(/(?:\..*|[^0-9.])/g, ''));
|
||||
if (isNaN(curpos1))
|
||||
curpos1 = 0;
|
||||
// Remember the first pos1, so the first visible notice goes there.
|
||||
if (typeof s.firstpos1 === "undefined" && !hidden) {
|
||||
s.firstpos1 = curpos1;
|
||||
s.nextpos1 = s.firstpos1;
|
||||
}
|
||||
// Calculate the current pos2 value.
|
||||
var csspos2;
|
||||
switch (s.dir2) {
|
||||
case "down":
|
||||
csspos2 = "top";
|
||||
break;
|
||||
case "up":
|
||||
csspos2 = "bottom";
|
||||
break;
|
||||
case "left":
|
||||
csspos2 = "right";
|
||||
break;
|
||||
case "right":
|
||||
csspos2 = "left";
|
||||
break;
|
||||
}
|
||||
curpos2 = parseInt(e.css(csspos2).replace(/(?:\..*|[^0-9.])/g, ''));
|
||||
if (isNaN(curpos2))
|
||||
curpos2 = 0;
|
||||
// Remember the first pos2, so the first visible notice goes there.
|
||||
if (typeof s.firstpos2 === "undefined" && !hidden) {
|
||||
s.firstpos2 = curpos2;
|
||||
s.nextpos2 = s.firstpos2;
|
||||
}
|
||||
// Check that it's not beyond the viewport edge.
|
||||
if ((s.dir1 === "down" && s.nextpos1 + e.height() > (s.context.is(body) ? jwindow.height() : s.context.prop('scrollHeight')) ) ||
|
||||
(s.dir1 === "up" && s.nextpos1 + e.height() > (s.context.is(body) ? jwindow.height() : s.context.prop('scrollHeight')) ) ||
|
||||
(s.dir1 === "left" && s.nextpos1 + e.width() > (s.context.is(body) ? jwindow.width() : s.context.prop('scrollWidth')) ) ||
|
||||
(s.dir1 === "right" && s.nextpos1 + e.width() > (s.context.is(body) ? jwindow.width() : s.context.prop('scrollWidth')) ) ) {
|
||||
// If it is, it needs to go back to the first pos1, and over on pos2.
|
||||
s.nextpos1 = s.firstpos1;
|
||||
s.nextpos2 += s.addpos2 + (typeof s.spacing2 === "undefined" ? 25 : s.spacing2);
|
||||
s.addpos2 = 0;
|
||||
}
|
||||
// Animate if we're moving on dir2.
|
||||
if (s.animation && s.nextpos2 < curpos2) {
|
||||
switch (s.dir2) {
|
||||
case "down":
|
||||
animate.top = s.nextpos2+"px";
|
||||
break;
|
||||
case "up":
|
||||
animate.bottom = s.nextpos2+"px";
|
||||
break;
|
||||
case "left":
|
||||
animate.right = s.nextpos2+"px";
|
||||
break;
|
||||
case "right":
|
||||
animate.left = s.nextpos2+"px";
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if(typeof s.nextpos2 === "number")
|
||||
e.css(csspos2, s.nextpos2+"px");
|
||||
}
|
||||
// Keep track of the widest/tallest notice in the column/row, so we can push the next column/row.
|
||||
switch (s.dir2) {
|
||||
case "down":
|
||||
case "up":
|
||||
if (e.outerHeight(true) > s.addpos2)
|
||||
s.addpos2 = e.height();
|
||||
break;
|
||||
case "left":
|
||||
case "right":
|
||||
if (e.outerWidth(true) > s.addpos2)
|
||||
s.addpos2 = e.width();
|
||||
break;
|
||||
}
|
||||
// Move the notice on dir1.
|
||||
if (typeof s.nextpos1 === "number") {
|
||||
// Animate if we're moving toward the first pos.
|
||||
if (s.animation && (curpos1 > s.nextpos1 || animate.top || animate.bottom || animate.right || animate.left)) {
|
||||
switch (s.dir1) {
|
||||
case "down":
|
||||
animate.top = s.nextpos1+"px";
|
||||
break;
|
||||
case "up":
|
||||
animate.bottom = s.nextpos1+"px";
|
||||
break;
|
||||
case "left":
|
||||
animate.right = s.nextpos1+"px";
|
||||
break;
|
||||
case "right":
|
||||
animate.left = s.nextpos1+"px";
|
||||
break;
|
||||
}
|
||||
} else
|
||||
e.css(csspos1, s.nextpos1+"px");
|
||||
}
|
||||
// Run the animation.
|
||||
if (animate.top || animate.bottom || animate.right || animate.left)
|
||||
e.animate(animate, {duration: this.options.position_animate_speed, queue: false});
|
||||
// Calculate the next dir1 position.
|
||||
switch (s.dir1) {
|
||||
case "down":
|
||||
case "up":
|
||||
s.nextpos1 += e.height() + (typeof s.spacing1 === "undefined" ? 25 : s.spacing1);
|
||||
break;
|
||||
case "left":
|
||||
case "right":
|
||||
s.nextpos1 += e.width() + (typeof s.spacing1 === "undefined" ? 25 : s.spacing1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return this;
|
||||
},
|
||||
// Queue the position all function so it doesn't run repeatedly and
|
||||
// use up resources.
|
||||
queuePosition: function(animate, milliseconds){
|
||||
if (timer)
|
||||
clearTimeout(timer);
|
||||
if (!milliseconds)
|
||||
milliseconds = 10;
|
||||
timer = setTimeout(function(){ PNotify.positionAll(animate) }, milliseconds);
|
||||
return this;
|
||||
},
|
||||
|
||||
|
||||
// Cancel any pending removal timer.
|
||||
cancelRemove: function(){
|
||||
if (this.timer)
|
||||
window.clearTimeout(this.timer);
|
||||
if (this.state === "closing") {
|
||||
// If it's animating out, animate back in really quickly.
|
||||
this.elem.stop(true);
|
||||
this.state = "open";
|
||||
this.animating = "in";
|
||||
this.elem.css("height", "auto").animate({"width": this.options.width, "opacity": this.options.opacity}, "fast");
|
||||
}
|
||||
return this;
|
||||
},
|
||||
// Queue a removal timer.
|
||||
queueRemove: function(){
|
||||
var that = this;
|
||||
// Cancel any current removal timer.
|
||||
this.cancelRemove();
|
||||
this.timer = window.setTimeout(function(){
|
||||
that.remove(true);
|
||||
}, (isNaN(this.options.delay) ? 0 : this.options.delay));
|
||||
return this;
|
||||
}
|
||||
});
|
||||
// These functions affect all notices.
|
||||
$.extend(PNotify, {
|
||||
// This holds all the notices.
|
||||
notices: [],
|
||||
removeAll: function () {
|
||||
$.each(PNotify.notices, function(){
|
||||
if (this.remove)
|
||||
this.remove();
|
||||
});
|
||||
},
|
||||
positionAll: function (animate) {
|
||||
// This timer is used for queueing this function so it doesn't run
|
||||
// repeatedly.
|
||||
if (timer)
|
||||
clearTimeout(timer);
|
||||
timer = null;
|
||||
// Reset the next position data.
|
||||
$.each(PNotify.notices, function(){
|
||||
var s = this.options.stack;
|
||||
if (!s) return;
|
||||
s.nextpos1 = s.firstpos1;
|
||||
s.nextpos2 = s.firstpos2;
|
||||
s.addpos2 = 0;
|
||||
s.animation = animate;
|
||||
});
|
||||
$.each(PNotify.notices, function(){
|
||||
this.position();
|
||||
});
|
||||
},
|
||||
styling: {
|
||||
jqueryui: {
|
||||
container: "ui-widget ui-widget-content ui-corner-all",
|
||||
notice: "ui-state-highlight",
|
||||
// (The actual jQUI notice icon looks terrible.)
|
||||
notice_icon: "ui-icon ui-icon-info",
|
||||
info: "",
|
||||
info_icon: "ui-icon ui-icon-info",
|
||||
success: "ui-state-default",
|
||||
success_icon: "ui-icon ui-icon-circle-check",
|
||||
error: "ui-state-error",
|
||||
error_icon: "ui-icon ui-icon-alert"
|
||||
},
|
||||
bootstrap2: {
|
||||
container: "alert",
|
||||
notice: "",
|
||||
notice_icon: "icon-exclamation-sign",
|
||||
info: "alert-info",
|
||||
info_icon: "icon-info-sign",
|
||||
success: "alert-success",
|
||||
success_icon: "icon-ok-sign",
|
||||
error: "alert-error",
|
||||
error_icon: "icon-warning-sign"
|
||||
},
|
||||
bootstrap3: {
|
||||
container: "alert",
|
||||
notice: "alert-warning",
|
||||
notice_icon: "glyphicon glyphicon-exclamation-sign",
|
||||
info: "alert-info",
|
||||
info_icon: "glyphicon glyphicon-info-sign",
|
||||
success: "alert-success",
|
||||
success_icon: "glyphicon glyphicon-ok-sign",
|
||||
error: "alert-danger",
|
||||
error_icon: "glyphicon glyphicon-warning-sign"
|
||||
}
|
||||
}
|
||||
});
|
||||
/*
|
||||
* uses icons from http://fontawesome.io/
|
||||
* version 4.0.3
|
||||
*/
|
||||
PNotify.styling.fontawesome = $.extend({}, PNotify.styling.bootstrap3);
|
||||
$.extend(PNotify.styling.fontawesome, {
|
||||
notice_icon: "fa fa-exclamation-circle",
|
||||
info_icon: "fa fa-info",
|
||||
success_icon: "fa fa-check",
|
||||
error_icon: "fa fa-warning"
|
||||
});
|
||||
|
||||
if (document.body)
|
||||
do_when_ready();
|
||||
else
|
||||
$(do_when_ready);
|
||||
return PNotify;
|
||||
}));
|
||||
@@ -1,14 +1,16 @@
|
||||
// Desktop
|
||||
// Uses AMD or browser globals for jQuery.
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.desktop', ['jquery', 'pnotify'], factory);
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery, PNotify);
|
||||
}
|
||||
}(function($, PNotify){
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.desktop', ['jquery', 'pnotify'], factory);
|
||||
} else if (typeof exports === 'object' && typeof module !== 'undefined') {
|
||||
// CommonJS
|
||||
module.exports = factory(require('jquery'), require('./pnotify'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(root.jQuery, root.PNotify);
|
||||
}
|
||||
}(this, function($, PNotify){
|
||||
var permission;
|
||||
var notify = function(title, options){
|
||||
// Memoize based on feature detection.
|
||||
@@ -43,6 +45,8 @@
|
||||
PNotify.prototype.options.desktop = {
|
||||
// Display the notification as a desktop notification.
|
||||
desktop: false,
|
||||
// If desktop notifications are not supported or allowed, fall back to a regular notice.
|
||||
fallback: true,
|
||||
// The URL of the icon to display. If false, no icon will show. If null, a default icon will show.
|
||||
icon: null,
|
||||
// Using a tag lets you update an existing notice, or keep from duplicating notices between tabs.
|
||||
@@ -66,10 +70,10 @@
|
||||
}
|
||||
notice.desktop = notify(notice.options.title, {
|
||||
icon: this.icon,
|
||||
body: notice.options.text,
|
||||
body: options.text || notice.options.text,
|
||||
tag: this.tag
|
||||
});
|
||||
if (!("close" in notice.desktop)) {
|
||||
if (!("close" in notice.desktop) && ("cancel" in notice.desktop)) {
|
||||
notice.desktop.close = function(){
|
||||
notice.desktop.cancel();
|
||||
};
|
||||
@@ -87,38 +91,45 @@
|
||||
if (!options.desktop)
|
||||
return;
|
||||
permission = PNotify.desktop.checkPermission();
|
||||
if (permission != 0)
|
||||
if (permission !== 0) {
|
||||
// Keep the notice from opening if fallback is false.
|
||||
if (!options.fallback) {
|
||||
notice.options.auto_display = false;
|
||||
}
|
||||
return;
|
||||
}
|
||||
this.genNotice(notice, options);
|
||||
},
|
||||
update: function(notice, options, oldOpts){
|
||||
if (permission != 0 || !options.desktop)
|
||||
if ((permission !== 0 && options.fallback) || !options.desktop)
|
||||
return;
|
||||
this.genNotice(notice, options);
|
||||
},
|
||||
beforeOpen: function(notice, options){
|
||||
if (permission != 0 || !options.desktop)
|
||||
if ((permission !== 0 && options.fallback) || !options.desktop)
|
||||
return;
|
||||
notice.elem.css({'left': '-10000px', 'display': 'none'});
|
||||
notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in');
|
||||
},
|
||||
afterOpen: function(notice, options){
|
||||
if (permission != 0 || !options.desktop)
|
||||
if ((permission !== 0 && options.fallback) || !options.desktop)
|
||||
return;
|
||||
notice.elem.css({'left': '-10000px', 'display': 'none'});
|
||||
notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in');
|
||||
if ("show" in notice.desktop) {
|
||||
notice.desktop.show();
|
||||
}
|
||||
},
|
||||
beforeClose: function(notice, options){
|
||||
if (permission != 0 || !options.desktop)
|
||||
if ((permission !== 0 && options.fallback) || !options.desktop)
|
||||
return;
|
||||
notice.elem.css({'left': '-10000px', 'display': 'none'});
|
||||
notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in');
|
||||
},
|
||||
afterClose: function(notice, options){
|
||||
if (permission != 0 || !options.desktop)
|
||||
if ((permission !== 0 && options.fallback) || !options.desktop)
|
||||
return;
|
||||
notice.elem.css({'left': '-10000px', 'display': 'none'});
|
||||
notice.desktop.close();
|
||||
notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in');
|
||||
if ("close" in notice.desktop) {
|
||||
notice.desktop.close();
|
||||
}
|
||||
}
|
||||
};
|
||||
PNotify.desktop = {
|
||||
@@ -131,9 +142,9 @@
|
||||
},
|
||||
checkPermission: function(){
|
||||
if (typeof Notification !== "undefined" && "permission" in Notification) {
|
||||
return (Notification.permission == "granted" ? 0 : 1);
|
||||
return (Notification.permission === "granted" ? 0 : 1);
|
||||
} else if ("webkitNotifications" in window) {
|
||||
return window.webkitNotifications.checkPermission();
|
||||
return window.webkitNotifications.checkPermission() == 0 ? 0 : 1;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
|
||||
873
public/js/v1.1.3/lib/pnotify/pnotify.js
Normal file
873
public/js/v1.1.3/lib/pnotify/pnotify.js
Normal file
@@ -0,0 +1,873 @@
|
||||
/*
|
||||
PNotify 3.0.0 sciactive.com/pnotify/
|
||||
(C) 2015 Hunter Perrin; Google, Inc.
|
||||
license Apache-2.0
|
||||
*/
|
||||
/*
|
||||
* ====== PNotify ======
|
||||
*
|
||||
* http://sciactive.com/pnotify/
|
||||
*
|
||||
* Copyright 2009-2015 Hunter Perrin
|
||||
* Copyright 2015 Google, Inc.
|
||||
*
|
||||
* Licensed under Apache License, Version 2.0.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*/
|
||||
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify', ['jquery'], function($){
|
||||
return factory($, root);
|
||||
});
|
||||
} else if (typeof exports === 'object' && typeof module !== 'undefined') {
|
||||
// CommonJS
|
||||
module.exports = factory(require('jquery'), global || root);
|
||||
} else {
|
||||
// Browser globals
|
||||
root.PNotify = factory(root.jQuery, root);
|
||||
}
|
||||
}(this, function($, root){
|
||||
var init = function(root){
|
||||
var default_stack = {
|
||||
dir1: "down",
|
||||
dir2: "left",
|
||||
push: "bottom",
|
||||
spacing1: 36,
|
||||
spacing2: 36,
|
||||
context: $("body"),
|
||||
modal: false
|
||||
};
|
||||
var posTimer, // Position all timer.
|
||||
body,
|
||||
jwindow = $(root);
|
||||
// Set global variables.
|
||||
var do_when_ready = function(){
|
||||
body = $("body");
|
||||
PNotify.prototype.options.stack.context = body;
|
||||
jwindow = $(root);
|
||||
// Reposition the notices when the window resizes.
|
||||
jwindow.bind('resize', function(){
|
||||
if (posTimer) {
|
||||
clearTimeout(posTimer);
|
||||
}
|
||||
posTimer = setTimeout(function(){
|
||||
PNotify.positionAll(true);
|
||||
}, 10);
|
||||
});
|
||||
};
|
||||
var createStackOverlay = function(stack) {
|
||||
var overlay = $("<div />", {"class": "ui-pnotify-modal-overlay"});
|
||||
overlay.prependTo(stack.context);
|
||||
if (stack.overlay_close) {
|
||||
// Close the notices on overlay click.
|
||||
overlay.click(function(){
|
||||
PNotify.removeStack(stack);
|
||||
});
|
||||
}
|
||||
return overlay;
|
||||
};
|
||||
var PNotify = function(options){
|
||||
this.parseOptions(options);
|
||||
this.init();
|
||||
};
|
||||
$.extend(PNotify.prototype, {
|
||||
// The current version of PNotify.
|
||||
version: "3.0.0",
|
||||
|
||||
// === Options ===
|
||||
|
||||
// Options defaults.
|
||||
options: {
|
||||
// The notice's title.
|
||||
title: false,
|
||||
// Whether to escape the content of the title. (Not allow HTML.)
|
||||
title_escape: false,
|
||||
// The notice's text.
|
||||
text: false,
|
||||
// Whether to escape the content of the text. (Not allow HTML.)
|
||||
text_escape: false,
|
||||
// What styling classes to use. (Can be either "brighttheme", "jqueryui", "bootstrap2", "bootstrap3", or "fontawesome".)
|
||||
styling: "brighttheme",
|
||||
// Additional classes to be added to the notice. (For custom styling.)
|
||||
addclass: "",
|
||||
// Class to be added to the notice for corner styling.
|
||||
cornerclass: "",
|
||||
// Display the notice when it is created.
|
||||
auto_display: true,
|
||||
// Width of the notice.
|
||||
width: "300px",
|
||||
// Minimum height of the notice. It will expand to fit content.
|
||||
min_height: "16px",
|
||||
// Type of the notice. "notice", "info", "success", or "error".
|
||||
type: "notice",
|
||||
// Set icon to true to use the default icon for the selected
|
||||
// style/type, false for no icon, or a string for your own icon class.
|
||||
icon: true,
|
||||
// The animation to use when displaying and hiding the notice. "none"
|
||||
// and "fade" are supported through CSS. Others are supported
|
||||
// through the Animate module and Animate.css.
|
||||
animation: "fade",
|
||||
// Speed at which the notice animates in and out. "slow", "normal",
|
||||
// or "fast". Respectively, 600ms, 400ms, 200ms.
|
||||
animate_speed: "normal",
|
||||
// Display a drop shadow.
|
||||
shadow: true,
|
||||
// After a delay, remove the notice.
|
||||
hide: true,
|
||||
// Delay in milliseconds before the notice is removed.
|
||||
delay: 8000,
|
||||
// Reset the hide timer if the mouse moves over the notice.
|
||||
mouse_reset: true,
|
||||
// Remove the notice's elements from the DOM after it is removed.
|
||||
remove: true,
|
||||
// Change new lines to br tags.
|
||||
insert_brs: true,
|
||||
// Whether to remove notices from the global array.
|
||||
destroy: true,
|
||||
// The stack on which the notices will be placed. Also controls the
|
||||
// direction the notices stack.
|
||||
stack: default_stack
|
||||
},
|
||||
|
||||
// === Modules ===
|
||||
|
||||
// This object holds all the PNotify modules. They are used to provide
|
||||
// additional functionality.
|
||||
modules: {},
|
||||
// This runs an event on all the modules.
|
||||
runModules: function(event, arg){
|
||||
var curArg;
|
||||
for (var module in this.modules) {
|
||||
curArg = ((typeof arg === "object" && module in arg) ? arg[module] : arg);
|
||||
if (typeof this.modules[module][event] === 'function') {
|
||||
this.modules[module].notice = this;
|
||||
this.modules[module].options = typeof this.options[module] === 'object' ? this.options[module] : {};
|
||||
this.modules[module][event](this, typeof this.options[module] === 'object' ? this.options[module] : {}, curArg);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// === Class Variables ===
|
||||
|
||||
state: "initializing", // The state can be "initializing", "opening", "open", "closing", and "closed".
|
||||
timer: null, // Auto close timer.
|
||||
animTimer: null, // Animation timer.
|
||||
styles: null,
|
||||
elem: null,
|
||||
container: null,
|
||||
title_container: null,
|
||||
text_container: null,
|
||||
animating: false, // Stores what is currently being animated (in or out).
|
||||
timerHide: false, // Stores whether the notice was hidden by a timer.
|
||||
|
||||
// === Events ===
|
||||
|
||||
init: function(){
|
||||
var that = this;
|
||||
|
||||
// First and foremost, we don't want our module objects all referencing the prototype.
|
||||
this.modules = {};
|
||||
$.extend(true, this.modules, PNotify.prototype.modules);
|
||||
|
||||
// Get our styling object.
|
||||
if (typeof this.options.styling === "object") {
|
||||
this.styles = this.options.styling;
|
||||
} else {
|
||||
this.styles = PNotify.styling[this.options.styling];
|
||||
}
|
||||
|
||||
// Create our widget.
|
||||
// Stop animation, reset the removal timer when the user mouses over.
|
||||
this.elem = $("<div />", {
|
||||
"class": "ui-pnotify "+this.options.addclass,
|
||||
"css": {"display": "none"},
|
||||
"aria-live": "assertive",
|
||||
"aria-role": "alertdialog",
|
||||
"mouseenter": function(e){
|
||||
if (that.options.mouse_reset && that.animating === "out") {
|
||||
if (!that.timerHide) {
|
||||
return;
|
||||
}
|
||||
that.cancelRemove();
|
||||
}
|
||||
// Stop the close timer.
|
||||
if (that.options.hide && that.options.mouse_reset) {
|
||||
that.cancelRemove();
|
||||
}
|
||||
},
|
||||
"mouseleave": function(e){
|
||||
// Start the close timer.
|
||||
if (that.options.hide && that.options.mouse_reset && that.animating !== "out") {
|
||||
that.queueRemove();
|
||||
}
|
||||
PNotify.positionAll();
|
||||
}
|
||||
});
|
||||
// Maybe we need to fade in/out.
|
||||
if (this.options.animation === "fade") {
|
||||
this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed);
|
||||
}
|
||||
// Create a container for the notice contents.
|
||||
this.container = $("<div />", {
|
||||
"class": this.styles.container+" ui-pnotify-container "+(this.options.type === "error" ? this.styles.error : (this.options.type === "info" ? this.styles.info : (this.options.type === "success" ? this.styles.success : this.styles.notice))),
|
||||
"role": "alert"
|
||||
}).appendTo(this.elem);
|
||||
if (this.options.cornerclass !== "") {
|
||||
this.container.removeClass("ui-corner-all").addClass(this.options.cornerclass);
|
||||
}
|
||||
// Create a drop shadow.
|
||||
if (this.options.shadow) {
|
||||
this.container.addClass("ui-pnotify-shadow");
|
||||
}
|
||||
|
||||
|
||||
// Add the appropriate icon.
|
||||
if (this.options.icon !== false) {
|
||||
$("<div />", {"class": "ui-pnotify-icon"})
|
||||
.append($("<span />", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon}))
|
||||
.prependTo(this.container);
|
||||
}
|
||||
|
||||
// Add a title.
|
||||
this.title_container = $("<h4 />", {
|
||||
"class": "ui-pnotify-title"
|
||||
})
|
||||
.appendTo(this.container);
|
||||
if (this.options.title === false) {
|
||||
this.title_container.hide();
|
||||
} else if (this.options.title_escape) {
|
||||
this.title_container.text(this.options.title);
|
||||
} else {
|
||||
this.title_container.html(this.options.title);
|
||||
}
|
||||
|
||||
// Add text.
|
||||
this.text_container = $("<div />", {
|
||||
"class": "ui-pnotify-text",
|
||||
"aria-role": "alert"
|
||||
})
|
||||
.appendTo(this.container);
|
||||
if (this.options.text === false) {
|
||||
this.text_container.hide();
|
||||
} else if (this.options.text_escape) {
|
||||
this.text_container.text(this.options.text);
|
||||
} else {
|
||||
this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text);
|
||||
}
|
||||
|
||||
// Set width and min height.
|
||||
if (typeof this.options.width === "string") {
|
||||
this.elem.css("width", this.options.width);
|
||||
}
|
||||
if (typeof this.options.min_height === "string") {
|
||||
this.container.css("min-height", this.options.min_height);
|
||||
}
|
||||
|
||||
|
||||
// Add the notice to the notice array.
|
||||
if (this.options.stack.push === "top") {
|
||||
PNotify.notices = $.merge([this], PNotify.notices);
|
||||
} else {
|
||||
PNotify.notices = $.merge(PNotify.notices, [this]);
|
||||
}
|
||||
// Now position all the notices if they are to push to the top.
|
||||
if (this.options.stack.push === "top") {
|
||||
this.queuePosition(false, 1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Mark the stack so it won't animate the new notice.
|
||||
this.options.stack.animation = false;
|
||||
|
||||
// Run the modules.
|
||||
this.runModules('init');
|
||||
|
||||
// Display the notice.
|
||||
if (this.options.auto_display) {
|
||||
this.open();
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
// This function is for updating the notice.
|
||||
update: function(options){
|
||||
// Save old options.
|
||||
var oldOpts = this.options;
|
||||
// Then update to the new options.
|
||||
this.parseOptions(oldOpts, options);
|
||||
// Maybe we need to fade in/out.
|
||||
this.elem.removeClass("ui-pnotify-fade-slow ui-pnotify-fade-normal ui-pnotify-fade-fast");
|
||||
if (this.options.animation === "fade") {
|
||||
this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed);
|
||||
}
|
||||
// Update the corner class.
|
||||
if (this.options.cornerclass !== oldOpts.cornerclass) {
|
||||
this.container.removeClass("ui-corner-all "+oldOpts.cornerclass).addClass(this.options.cornerclass);
|
||||
}
|
||||
// Update the shadow.
|
||||
if (this.options.shadow !== oldOpts.shadow) {
|
||||
if (this.options.shadow) {
|
||||
this.container.addClass("ui-pnotify-shadow");
|
||||
} else {
|
||||
this.container.removeClass("ui-pnotify-shadow");
|
||||
}
|
||||
}
|
||||
// Update the additional classes.
|
||||
if (this.options.addclass === false) {
|
||||
this.elem.removeClass(oldOpts.addclass);
|
||||
} else if (this.options.addclass !== oldOpts.addclass) {
|
||||
this.elem.removeClass(oldOpts.addclass).addClass(this.options.addclass);
|
||||
}
|
||||
// Update the title.
|
||||
if (this.options.title === false) {
|
||||
this.title_container.slideUp("fast");
|
||||
} else if (this.options.title !== oldOpts.title) {
|
||||
if (this.options.title_escape) {
|
||||
this.title_container.text(this.options.title);
|
||||
} else {
|
||||
this.title_container.html(this.options.title);
|
||||
}
|
||||
if (oldOpts.title === false) {
|
||||
this.title_container.slideDown(200);
|
||||
}
|
||||
}
|
||||
// Update the text.
|
||||
if (this.options.text === false) {
|
||||
this.text_container.slideUp("fast");
|
||||
} else if (this.options.text !== oldOpts.text) {
|
||||
if (this.options.text_escape) {
|
||||
this.text_container.text(this.options.text);
|
||||
} else {
|
||||
this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text);
|
||||
}
|
||||
if (oldOpts.text === false) {
|
||||
this.text_container.slideDown(200);
|
||||
}
|
||||
}
|
||||
// Change the notice type.
|
||||
if (this.options.type !== oldOpts.type)
|
||||
this.container.removeClass(
|
||||
this.styles.error+" "+this.styles.notice+" "+this.styles.success+" "+this.styles.info
|
||||
).addClass(this.options.type === "error" ?
|
||||
this.styles.error :
|
||||
(this.options.type === "info" ?
|
||||
this.styles.info :
|
||||
(this.options.type === "success" ?
|
||||
this.styles.success :
|
||||
this.styles.notice
|
||||
)
|
||||
)
|
||||
);
|
||||
if (this.options.icon !== oldOpts.icon || (this.options.icon === true && this.options.type !== oldOpts.type)) {
|
||||
// Remove any old icon.
|
||||
this.container.find("div.ui-pnotify-icon").remove();
|
||||
if (this.options.icon !== false) {
|
||||
// Build the new icon.
|
||||
$("<div />", {"class": "ui-pnotify-icon"})
|
||||
.append($("<span />", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon}))
|
||||
.prependTo(this.container);
|
||||
}
|
||||
}
|
||||
// Update the width.
|
||||
if (this.options.width !== oldOpts.width) {
|
||||
this.elem.animate({width: this.options.width});
|
||||
}
|
||||
// Update the minimum height.
|
||||
if (this.options.min_height !== oldOpts.min_height) {
|
||||
this.container.animate({minHeight: this.options.min_height});
|
||||
}
|
||||
// Update the timed hiding.
|
||||
if (!this.options.hide) {
|
||||
this.cancelRemove();
|
||||
} else if (!oldOpts.hide) {
|
||||
this.queueRemove();
|
||||
}
|
||||
this.queuePosition(true);
|
||||
|
||||
// Run the modules.
|
||||
this.runModules('update', oldOpts);
|
||||
return this;
|
||||
},
|
||||
|
||||
// Display the notice.
|
||||
open: function(){
|
||||
this.state = "opening";
|
||||
// Run the modules.
|
||||
this.runModules('beforeOpen');
|
||||
|
||||
var that = this;
|
||||
// If the notice is not in the DOM, append it.
|
||||
if (!this.elem.parent().length) {
|
||||
this.elem.appendTo(this.options.stack.context ? this.options.stack.context : body);
|
||||
}
|
||||
// Try to put it in the right position.
|
||||
if (this.options.stack.push !== "top") {
|
||||
this.position(true);
|
||||
}
|
||||
this.animateIn(function(){
|
||||
that.queuePosition(true);
|
||||
|
||||
// Now set it to hide.
|
||||
if (that.options.hide) {
|
||||
that.queueRemove();
|
||||
}
|
||||
|
||||
that.state = "open";
|
||||
|
||||
// Run the modules.
|
||||
that.runModules('afterOpen');
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
// Remove the notice.
|
||||
remove: function(timer_hide) {
|
||||
this.state = "closing";
|
||||
this.timerHide = !!timer_hide; // Make sure it's a boolean.
|
||||
// Run the modules.
|
||||
this.runModules('beforeClose');
|
||||
|
||||
var that = this;
|
||||
if (this.timer) {
|
||||
root.clearTimeout(this.timer);
|
||||
this.timer = null;
|
||||
}
|
||||
this.animateOut(function(){
|
||||
that.state = "closed";
|
||||
// Run the modules.
|
||||
that.runModules('afterClose');
|
||||
that.queuePosition(true);
|
||||
// If we're supposed to remove the notice from the DOM, do it.
|
||||
if (that.options.remove) {
|
||||
that.elem.detach();
|
||||
}
|
||||
// Run the modules.
|
||||
that.runModules('beforeDestroy');
|
||||
// Remove object from PNotify.notices to prevent memory leak (issue #49)
|
||||
// unless destroy is off
|
||||
if (that.options.destroy) {
|
||||
if (PNotify.notices !== null) {
|
||||
var idx = $.inArray(that,PNotify.notices);
|
||||
if (idx !== -1) {
|
||||
PNotify.notices.splice(idx,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Run the modules.
|
||||
that.runModules('afterDestroy');
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
// === Class Methods ===
|
||||
|
||||
// Get the DOM element.
|
||||
get: function(){
|
||||
return this.elem;
|
||||
},
|
||||
|
||||
// Put all the options in the right places.
|
||||
parseOptions: function(options, moreOptions){
|
||||
this.options = $.extend(true, {}, PNotify.prototype.options);
|
||||
// This is the only thing that *should* be copied by reference.
|
||||
this.options.stack = PNotify.prototype.options.stack;
|
||||
var optArray = [options, moreOptions], curOpts;
|
||||
for (var curIndex=0; curIndex < optArray.length; curIndex++) {
|
||||
curOpts = optArray[curIndex];
|
||||
if (typeof curOpts === "undefined") {
|
||||
break;
|
||||
}
|
||||
if (typeof curOpts !== 'object') {
|
||||
this.options.text = curOpts;
|
||||
} else {
|
||||
for (var option in curOpts) {
|
||||
if (this.modules[option]) {
|
||||
// Avoid overwriting module defaults.
|
||||
$.extend(true, this.options[option], curOpts[option]);
|
||||
} else {
|
||||
this.options[option] = curOpts[option];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Animate the notice in.
|
||||
animateIn: function(callback){
|
||||
// Declare that the notice is animating in.
|
||||
this.animating = "in";
|
||||
var that = this;
|
||||
callback = (function(){
|
||||
if (that.animTimer) {
|
||||
clearTimeout(that.animTimer);
|
||||
}
|
||||
if (that.animating !== "in") {
|
||||
return;
|
||||
}
|
||||
if (that.elem.is(":visible")) {
|
||||
if (this) {
|
||||
this.call();
|
||||
}
|
||||
// Declare that the notice has completed animating.
|
||||
that.animating = false;
|
||||
} else {
|
||||
that.animTimer = setTimeout(callback, 40);
|
||||
}
|
||||
}).bind(callback);
|
||||
|
||||
if (this.options.animation === "fade") {
|
||||
this.elem.one('webkitTransitionEnd mozTransitionEnd MSTransitionEnd oTransitionEnd transitionend', callback).addClass("ui-pnotify-in");
|
||||
this.elem.css("opacity"); // This line is necessary for some reason. Some notices don't fade without it.
|
||||
this.elem.addClass("ui-pnotify-fade-in");
|
||||
// Just in case the event doesn't fire, call it after 650 ms.
|
||||
this.animTimer = setTimeout(callback, 650);
|
||||
} else {
|
||||
this.elem.addClass("ui-pnotify-in");
|
||||
callback();
|
||||
}
|
||||
},
|
||||
|
||||
// Animate the notice out.
|
||||
animateOut: function(callback){
|
||||
// Declare that the notice is animating out.
|
||||
this.animating = "out";
|
||||
var that = this;
|
||||
callback = (function(){
|
||||
if (that.animTimer) {
|
||||
clearTimeout(that.animTimer);
|
||||
}
|
||||
if (that.animating !== "out") {
|
||||
return;
|
||||
}
|
||||
if (that.elem.css("opacity") == "0" || !that.elem.is(":visible")) {
|
||||
that.elem.removeClass("ui-pnotify-in");
|
||||
if (this) {
|
||||
this.call();
|
||||
}
|
||||
// Declare that the notice has completed animating.
|
||||
that.animating = false;
|
||||
} else {
|
||||
// In case this was called before the notice finished animating.
|
||||
that.animTimer = setTimeout(callback, 40);
|
||||
}
|
||||
}).bind(callback);
|
||||
|
||||
if (this.options.animation === "fade") {
|
||||
this.elem.one('webkitTransitionEnd mozTransitionEnd MSTransitionEnd oTransitionEnd transitionend', callback).removeClass("ui-pnotify-fade-in");
|
||||
// Just in case the event doesn't fire, call it after 650 ms.
|
||||
this.animTimer = setTimeout(callback, 650);
|
||||
} else {
|
||||
this.elem.removeClass("ui-pnotify-in");
|
||||
callback();
|
||||
}
|
||||
},
|
||||
|
||||
// Position the notice. dont_skip_hidden causes the notice to
|
||||
// position even if it's not visible.
|
||||
position: function(dontSkipHidden){
|
||||
// Get the notice's stack.
|
||||
var stack = this.options.stack,
|
||||
elem = this.elem;
|
||||
if (typeof stack.context === "undefined") {
|
||||
stack.context = body;
|
||||
}
|
||||
if (!stack) {
|
||||
return;
|
||||
}
|
||||
if (typeof stack.nextpos1 !== "number") {
|
||||
stack.nextpos1 = stack.firstpos1;
|
||||
}
|
||||
if (typeof stack.nextpos2 !== "number") {
|
||||
stack.nextpos2 = stack.firstpos2;
|
||||
}
|
||||
if (typeof stack.addpos2 !== "number") {
|
||||
stack.addpos2 = 0;
|
||||
}
|
||||
var hidden = !elem.hasClass("ui-pnotify-in");
|
||||
// Skip this notice if it's not shown.
|
||||
if (!hidden || dontSkipHidden) {
|
||||
if (stack.modal) {
|
||||
if (stack.overlay) {
|
||||
stack.overlay.show();
|
||||
} else {
|
||||
stack.overlay = createStackOverlay(stack);
|
||||
}
|
||||
}
|
||||
// Add animate class by default.
|
||||
elem.addClass("ui-pnotify-move");
|
||||
var curpos1, curpos2;
|
||||
// Calculate the current pos1 value.
|
||||
var csspos1;
|
||||
switch (stack.dir1) {
|
||||
case "down":
|
||||
csspos1 = "top";
|
||||
break;
|
||||
case "up":
|
||||
csspos1 = "bottom";
|
||||
break;
|
||||
case "left":
|
||||
csspos1 = "right";
|
||||
break;
|
||||
case "right":
|
||||
csspos1 = "left";
|
||||
break;
|
||||
}
|
||||
curpos1 = parseInt(elem.css(csspos1).replace(/(?:\..*|[^0-9.])/g, ''));
|
||||
if (isNaN(curpos1)) {
|
||||
curpos1 = 0;
|
||||
}
|
||||
// Remember the first pos1, so the first visible notice goes there.
|
||||
if (typeof stack.firstpos1 === "undefined" && !hidden) {
|
||||
stack.firstpos1 = curpos1;
|
||||
stack.nextpos1 = stack.firstpos1;
|
||||
}
|
||||
// Calculate the current pos2 value.
|
||||
var csspos2;
|
||||
switch (stack.dir2) {
|
||||
case "down":
|
||||
csspos2 = "top";
|
||||
break;
|
||||
case "up":
|
||||
csspos2 = "bottom";
|
||||
break;
|
||||
case "left":
|
||||
csspos2 = "right";
|
||||
break;
|
||||
case "right":
|
||||
csspos2 = "left";
|
||||
break;
|
||||
}
|
||||
curpos2 = parseInt(elem.css(csspos2).replace(/(?:\..*|[^0-9.])/g, ''));
|
||||
if (isNaN(curpos2)) {
|
||||
curpos2 = 0;
|
||||
}
|
||||
// Remember the first pos2, so the first visible notice goes there.
|
||||
if (typeof stack.firstpos2 === "undefined" && !hidden) {
|
||||
stack.firstpos2 = curpos2;
|
||||
stack.nextpos2 = stack.firstpos2;
|
||||
}
|
||||
// Check that it's not beyond the viewport edge.
|
||||
if (
|
||||
(stack.dir1 === "down" && stack.nextpos1 + elem.height() > (stack.context.is(body) ? jwindow.height() : stack.context.prop('scrollHeight')) ) ||
|
||||
(stack.dir1 === "up" && stack.nextpos1 + elem.height() > (stack.context.is(body) ? jwindow.height() : stack.context.prop('scrollHeight')) ) ||
|
||||
(stack.dir1 === "left" && stack.nextpos1 + elem.width() > (stack.context.is(body) ? jwindow.width() : stack.context.prop('scrollWidth')) ) ||
|
||||
(stack.dir1 === "right" && stack.nextpos1 + elem.width() > (stack.context.is(body) ? jwindow.width() : stack.context.prop('scrollWidth')) )
|
||||
) {
|
||||
// If it is, it needs to go back to the first pos1, and over on pos2.
|
||||
stack.nextpos1 = stack.firstpos1;
|
||||
stack.nextpos2 += stack.addpos2 + (typeof stack.spacing2 === "undefined" ? 25 : stack.spacing2);
|
||||
stack.addpos2 = 0;
|
||||
}
|
||||
if (typeof stack.nextpos2 === "number") {
|
||||
if (!stack.animation) {
|
||||
elem.removeClass("ui-pnotify-move");
|
||||
elem.css(csspos2, stack.nextpos2+"px");
|
||||
elem.css(csspos2);
|
||||
elem.addClass("ui-pnotify-move");
|
||||
} else {
|
||||
elem.css(csspos2, stack.nextpos2+"px");
|
||||
}
|
||||
}
|
||||
// Keep track of the widest/tallest notice in the column/row, so we can push the next column/row.
|
||||
switch (stack.dir2) {
|
||||
case "down":
|
||||
case "up":
|
||||
if (elem.outerHeight(true) > stack.addpos2) {
|
||||
stack.addpos2 = elem.height();
|
||||
}
|
||||
break;
|
||||
case "left":
|
||||
case "right":
|
||||
if (elem.outerWidth(true) > stack.addpos2) {
|
||||
stack.addpos2 = elem.width();
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Move the notice on dir1.
|
||||
if (typeof stack.nextpos1 === "number") {
|
||||
if (!stack.animation) {
|
||||
elem.removeClass("ui-pnotify-move");
|
||||
elem.css(csspos1, stack.nextpos1+"px");
|
||||
elem.css(csspos1);
|
||||
elem.addClass("ui-pnotify-move");
|
||||
} else {
|
||||
elem.css(csspos1, stack.nextpos1+"px");
|
||||
}
|
||||
}
|
||||
// Calculate the next dir1 position.
|
||||
switch (stack.dir1) {
|
||||
case "down":
|
||||
case "up":
|
||||
stack.nextpos1 += elem.height() + (typeof stack.spacing1 === "undefined" ? 25 : stack.spacing1);
|
||||
break;
|
||||
case "left":
|
||||
case "right":
|
||||
stack.nextpos1 += elem.width() + (typeof stack.spacing1 === "undefined" ? 25 : stack.spacing1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return this;
|
||||
},
|
||||
// Queue the position all function so it doesn't run repeatedly and
|
||||
// use up resources.
|
||||
queuePosition: function(animate, milliseconds){
|
||||
if (posTimer) {
|
||||
clearTimeout(posTimer);
|
||||
}
|
||||
if (!milliseconds) {
|
||||
milliseconds = 10;
|
||||
}
|
||||
posTimer = setTimeout(function(){
|
||||
PNotify.positionAll(animate);
|
||||
}, milliseconds);
|
||||
return this;
|
||||
},
|
||||
|
||||
|
||||
// Cancel any pending removal timer.
|
||||
cancelRemove: function(){
|
||||
if (this.timer) {
|
||||
root.clearTimeout(this.timer);
|
||||
}
|
||||
if (this.animTimer) {
|
||||
root.clearTimeout(this.animTimer);
|
||||
}
|
||||
if (this.state === "closing") {
|
||||
// If it's animating out, stop it.
|
||||
this.state = "open";
|
||||
this.animating = false;
|
||||
this.elem.addClass("ui-pnotify-in");
|
||||
if (this.options.animation === "fade") {
|
||||
this.elem.addClass("ui-pnotify-fade-in");
|
||||
}
|
||||
}
|
||||
return this;
|
||||
},
|
||||
// Queue a removal timer.
|
||||
queueRemove: function(){
|
||||
var that = this;
|
||||
// Cancel any current removal timer.
|
||||
this.cancelRemove();
|
||||
this.timer = root.setTimeout(function(){
|
||||
that.remove(true);
|
||||
}, (isNaN(this.options.delay) ? 0 : this.options.delay));
|
||||
return this;
|
||||
}
|
||||
});
|
||||
// These functions affect all notices.
|
||||
$.extend(PNotify, {
|
||||
// This holds all the notices.
|
||||
notices: [],
|
||||
reload: init,
|
||||
removeAll: function(){
|
||||
$.each(PNotify.notices, function(){
|
||||
if (this.remove) {
|
||||
this.remove(false);
|
||||
}
|
||||
});
|
||||
},
|
||||
removeStack: function(stack){
|
||||
$.each(PNotify.notices, function(){
|
||||
if (this.remove && this.options.stack === stack) {
|
||||
this.remove(false);
|
||||
}
|
||||
});
|
||||
},
|
||||
positionAll: function(animate){
|
||||
// This timer is used for queueing this function so it doesn't run
|
||||
// repeatedly.
|
||||
if (posTimer) {
|
||||
clearTimeout(posTimer);
|
||||
}
|
||||
posTimer = null;
|
||||
// Reset the next position data.
|
||||
if (PNotify.notices && PNotify.notices.length) {
|
||||
$.each(PNotify.notices, function(){
|
||||
var s = this.options.stack;
|
||||
if (!s) {
|
||||
return;
|
||||
}
|
||||
if (s.overlay) {
|
||||
s.overlay.hide();
|
||||
}
|
||||
s.nextpos1 = s.firstpos1;
|
||||
s.nextpos2 = s.firstpos2;
|
||||
s.addpos2 = 0;
|
||||
s.animation = animate;
|
||||
});
|
||||
$.each(PNotify.notices, function(){
|
||||
this.position();
|
||||
});
|
||||
} else {
|
||||
var s = PNotify.prototype.options.stack;
|
||||
if (s) {
|
||||
delete s.nextpos1;
|
||||
delete s.nextpos2;
|
||||
}
|
||||
}
|
||||
},
|
||||
styling: {
|
||||
brighttheme: {
|
||||
// Bright Theme doesn't require any UI libraries.
|
||||
container: "brighttheme",
|
||||
notice: "brighttheme-notice",
|
||||
notice_icon: "brighttheme-icon-notice",
|
||||
info: "brighttheme-info",
|
||||
info_icon: "brighttheme-icon-info",
|
||||
success: "brighttheme-success",
|
||||
success_icon: "brighttheme-icon-success",
|
||||
error: "brighttheme-error",
|
||||
error_icon: "brighttheme-icon-error"
|
||||
},
|
||||
jqueryui: {
|
||||
container: "ui-widget ui-widget-content ui-corner-all",
|
||||
notice: "ui-state-highlight",
|
||||
// (The actual jQUI notice icon looks terrible.)
|
||||
notice_icon: "ui-icon ui-icon-info",
|
||||
info: "",
|
||||
info_icon: "ui-icon ui-icon-info",
|
||||
success: "ui-state-default",
|
||||
success_icon: "ui-icon ui-icon-circle-check",
|
||||
error: "ui-state-error",
|
||||
error_icon: "ui-icon ui-icon-alert"
|
||||
},
|
||||
bootstrap3: {
|
||||
container: "alert",
|
||||
notice: "alert-warning",
|
||||
notice_icon: "glyphicon glyphicon-exclamation-sign",
|
||||
info: "alert-info",
|
||||
info_icon: "glyphicon glyphicon-info-sign",
|
||||
success: "alert-success",
|
||||
success_icon: "glyphicon glyphicon-ok-sign",
|
||||
error: "alert-danger",
|
||||
error_icon: "glyphicon glyphicon-warning-sign"
|
||||
}
|
||||
}
|
||||
});
|
||||
/*
|
||||
* uses icons from http://fontawesome.io/
|
||||
* version 4.0.3
|
||||
*/
|
||||
PNotify.styling.fontawesome = $.extend({}, PNotify.styling.bootstrap3);
|
||||
$.extend(PNotify.styling.fontawesome, {
|
||||
notice_icon: "fa fa-exclamation-circle",
|
||||
info_icon: "fa fa-info",
|
||||
success_icon: "fa fa-check",
|
||||
error_icon: "fa fa-warning"
|
||||
});
|
||||
|
||||
if (root.document.body) {
|
||||
do_when_ready();
|
||||
} else {
|
||||
$(do_when_ready);
|
||||
}
|
||||
return PNotify;
|
||||
};
|
||||
return init(root);
|
||||
}));
|
||||
@@ -1,14 +1,16 @@
|
||||
// Nonblock
|
||||
// Uses AMD or browser globals for jQuery.
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.nonblock', ['jquery', 'pnotify'], factory);
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery, PNotify);
|
||||
}
|
||||
}(function($, PNotify){
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as a module.
|
||||
define('pnotify.nonblock', ['jquery', 'pnotify'], factory);
|
||||
} else if (typeof exports === 'object' && typeof module !== 'undefined') {
|
||||
// CommonJS
|
||||
module.exports = factory(require('jquery'), require('./pnotify'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(root.jQuery, root.PNotify);
|
||||
}
|
||||
}(this, function($, PNotify){
|
||||
// Some useful regexes.
|
||||
var re_on = /^on/,
|
||||
re_mouse_events = /^(dbl)?click$|^mouse(move|down|up|over|out|enter|leave)$|^contextmenu$/,
|
||||
@@ -54,11 +56,14 @@
|
||||
var nonblock_last_elem;
|
||||
// This is used to pass events through the notice if it is non-blocking.
|
||||
var nonblock_pass = function(notice, e, e_name){
|
||||
notice.elem.css("display", "none");
|
||||
notice.elem.addClass("ui-pnotify-nonblock-hide");
|
||||
var element_below = document.elementFromPoint(e.clientX, e.clientY);
|
||||
notice.elem.css("display", "block");
|
||||
notice.elem.removeClass("ui-pnotify-nonblock-hide");
|
||||
var jelement_below = $(element_below);
|
||||
var cursor_style = jelement_below.css("cursor");
|
||||
if (cursor_style === "auto" && element_below.tagName === "A") {
|
||||
cursor_style = "pointer";
|
||||
}
|
||||
notice.elem.css("cursor", cursor_style !== "auto" ? cursor_style : "default");
|
||||
// If the element changed, call mouseenter, mouseleave, etc.
|
||||
if (!nonblock_last_elem || nonblock_last_elem.get(0) != element_below) {
|
||||
@@ -77,75 +82,75 @@
|
||||
|
||||
PNotify.prototype.options.nonblock = {
|
||||
// Create a non-blocking notice. It lets the user click elements underneath it.
|
||||
nonblock: false,
|
||||
// The opacity of the notice (if it's non-blocking) when the mouse is over it.
|
||||
nonblock_opacity: .2
|
||||
nonblock: false
|
||||
};
|
||||
PNotify.prototype.modules.nonblock = {
|
||||
// This lets us update the options available in the closures.
|
||||
myOptions: null,
|
||||
|
||||
init: function(notice, options){
|
||||
var that = this;
|
||||
this.myOptions = options;
|
||||
notice.elem.on({
|
||||
"mouseenter": function(e){
|
||||
if (that.myOptions.nonblock) e.stopPropagation();
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
if (that.options.nonblock) {
|
||||
// If it's non-blocking, animate to the other opacity.
|
||||
notice.elem.stop().animate({"opacity": that.myOptions.nonblock_opacity}, "fast");
|
||||
notice.elem.addClass("ui-pnotify-nonblock-fade");
|
||||
}
|
||||
},
|
||||
"mouseleave": function(e){
|
||||
if (that.myOptions.nonblock) e.stopPropagation();
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
nonblock_last_elem = null;
|
||||
notice.elem.css("cursor", "auto");
|
||||
// Animate back to the normal opacity.
|
||||
if (that.myOptions.nonblock && notice.animating !== "out")
|
||||
notice.elem.stop().animate({"opacity": notice.options.opacity}, "fast");
|
||||
if (that.options.nonblock && notice.animating !== "out") {
|
||||
notice.elem.removeClass("ui-pnotify-nonblock-fade");
|
||||
}
|
||||
},
|
||||
"mouseover": function(e){
|
||||
if (that.myOptions.nonblock) e.stopPropagation();
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
},
|
||||
"mouseout": function(e){
|
||||
if (that.myOptions.nonblock) e.stopPropagation();
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
},
|
||||
"mousemove": function(e){
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
nonblock_pass(notice, e, "onmousemove");
|
||||
}
|
||||
},
|
||||
"mousedown": function(e){
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
nonblock_pass(notice, e, "onmousedown");
|
||||
}
|
||||
},
|
||||
"mouseup": function(e){
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
nonblock_pass(notice, e, "onmouseup");
|
||||
}
|
||||
},
|
||||
"click": function(e){
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
nonblock_pass(notice, e, "onclick");
|
||||
}
|
||||
},
|
||||
"dblclick": function(e){
|
||||
if (that.myOptions.nonblock) {
|
||||
if (that.options.nonblock) {
|
||||
e.stopPropagation();
|
||||
nonblock_pass(notice, e, "ondblclick");
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
update: function(notice, options){
|
||||
this.myOptions = options;
|
||||
}
|
||||
};
|
||||
}));
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
/*
|
||||
Author : Hunter Perrin
|
||||
Version : 2.0.1
|
||||
Link : http://sciactive.com/pnotify/
|
||||
*/
|
||||
/* -- Notice */
|
||||
.ui-pnotify {
|
||||
top: 25px;
|
||||
right: 25px;
|
||||
position: absolute;
|
||||
height: auto;
|
||||
/* Ensures notices are above everything */
|
||||
z-index: 9999;
|
||||
}
|
||||
/* Hides position: fixed from IE6 */
|
||||
html > body > .ui-pnotify {
|
||||
position: fixed;
|
||||
}
|
||||
.ui-pnotify .ui-pnotify-shadow {
|
||||
-webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2);
|
||||
-moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 0 5px 10px rgba(0,0,0,0.2);
|
||||
}
|
||||
.ui-pnotify-container {
|
||||
background-position: 0 0;
|
||||
padding: .8em;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
.ui-pnotify-sharp {
|
||||
-webkit-border-radius: 0;
|
||||
-moz-border-radius: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
.ui-pnotify-title {
|
||||
display: block;
|
||||
margin-bottom: .4em;
|
||||
margin-top: 0;
|
||||
}
|
||||
.ui-pnotify-text {
|
||||
display: block;
|
||||
font-family: $font-family-bold;
|
||||
}
|
||||
.ui-pnotify-icon, .ui-pnotify-icon span {
|
||||
display: block;
|
||||
float: left;
|
||||
margin-right: .2em;
|
||||
}
|
||||
/* Alternate stack initial positioning. */
|
||||
.ui-pnotify.stack-topleft, .ui-pnotify.stack-bottomleft {
|
||||
left: 25px;
|
||||
right: auto;
|
||||
}
|
||||
.ui-pnotify.stack-bottomright, .ui-pnotify.stack-bottomleft {
|
||||
bottom: 25px;
|
||||
top: auto;
|
||||
}
|
||||
.ui-pnotify.stack-bar-top {
|
||||
right: 0;
|
||||
top: 0;
|
||||
}
|
||||
.ui-pnotify.stack-bar-bottom {
|
||||
right: auto;
|
||||
bottom: 0;
|
||||
top: auto;
|
||||
left: auto;
|
||||
}
|
||||
11
sass/library/pnotify/_pnotify.custom.scss
Normal file
11
sass/library/pnotify/_pnotify.custom.scss
Normal file
@@ -0,0 +1,11 @@
|
||||
.ui-pnotify{
|
||||
|
||||
&.stack-bar-bottom{
|
||||
margin-left: 15%;
|
||||
margin-bottom: 25px;
|
||||
right: auto;
|
||||
bottom: 0;
|
||||
top: auto;
|
||||
left: auto;
|
||||
}
|
||||
}
|
||||
7
sass/library/pnotify/_pnotify.nonblock.scss
Normal file
7
sass/library/pnotify/_pnotify.nonblock.scss
Normal file
@@ -0,0 +1,7 @@
|
||||
.ui-pnotify.ui-pnotify-nonblock-fade {
|
||||
/*transition: opacity .3s ease;*/
|
||||
opacity: .2;
|
||||
}
|
||||
.ui-pnotify.ui-pnotify-nonblock-hide {
|
||||
display: none !important;
|
||||
}
|
||||
112
sass/library/pnotify/_pnotify.scss
Normal file
112
sass/library/pnotify/_pnotify.scss
Normal file
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
Author : Hunter Perrin
|
||||
Version : 3.0.0
|
||||
Link : http://sciactive.com/pnotify/
|
||||
*/
|
||||
/* -- Notice */
|
||||
.ui-pnotify {
|
||||
top: 36px;
|
||||
right: 36px;
|
||||
position: absolute;
|
||||
height: auto;
|
||||
z-index: 2;
|
||||
}
|
||||
body > .ui-pnotify {
|
||||
/* Notices in the body context should be fixed to the viewport. */
|
||||
position: fixed;
|
||||
/* Ensures notices are above everything */
|
||||
z-index: 100040;
|
||||
}
|
||||
.ui-pnotify-modal-overlay {
|
||||
background-color: rgba(0, 0, 0, .4);
|
||||
top: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
z-index: 1;
|
||||
}
|
||||
body > .ui-pnotify-modal-overlay {
|
||||
position: fixed;
|
||||
z-index: 100039;
|
||||
}
|
||||
.ui-pnotify.ui-pnotify-in {
|
||||
display: block !important;
|
||||
}
|
||||
.ui-pnotify.ui-pnotify-move {
|
||||
transition: left .5s ease, top .5s ease, right .5s ease, bottom .5s ease;
|
||||
}
|
||||
.ui-pnotify.ui-pnotify-fade-slow {
|
||||
transition: opacity .6s linear;
|
||||
opacity: 0;
|
||||
}
|
||||
.ui-pnotify.ui-pnotify-fade-slow.ui-pnotify.ui-pnotify-move {
|
||||
transition: opacity .6s linear, left .5s ease, top .5s ease, right .5s ease, bottom .5s ease;
|
||||
}
|
||||
.ui-pnotify.ui-pnotify-fade-normal {
|
||||
transition: opacity .4s linear;
|
||||
opacity: 0;
|
||||
}
|
||||
.ui-pnotify.ui-pnotify-fade-normal.ui-pnotify.ui-pnotify-move {
|
||||
transition: opacity .4s linear, left .5s ease, top .5s ease, right .5s ease, bottom .5s ease;
|
||||
}
|
||||
.ui-pnotify.ui-pnotify-fade-fast {
|
||||
transition: opacity .2s linear;
|
||||
opacity: 0;
|
||||
}
|
||||
.ui-pnotify.ui-pnotify-fade-fast.ui-pnotify.ui-pnotify-move {
|
||||
transition: opacity .2s linear, left .5s ease, top .5s ease, right .5s ease, bottom .5s ease;
|
||||
}
|
||||
.ui-pnotify.ui-pnotify-fade-in {
|
||||
opacity: 1;
|
||||
}
|
||||
.ui-pnotify .ui-pnotify-shadow {
|
||||
-webkit-box-shadow: 0px 6px 28px 0px rgba(0,0,0,0.1);
|
||||
-moz-box-shadow: 0px 6px 28px 0px rgba(0,0,0,0.1);
|
||||
box-shadow: 0px 6px 28px 0px rgba(0,0,0,0.1);
|
||||
}
|
||||
.ui-pnotify-container {
|
||||
background-position: 0 0;
|
||||
padding: .8em;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
.ui-pnotify-container:after {
|
||||
content: " "; /* Older browser do not support empty content */
|
||||
visibility: hidden;
|
||||
display: block;
|
||||
height: 0;
|
||||
clear: both;
|
||||
}
|
||||
.ui-pnotify-container.ui-pnotify-sharp {
|
||||
-webkit-border-radius: 0;
|
||||
-moz-border-radius: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
.ui-pnotify-title {
|
||||
display: block;
|
||||
margin-bottom: .4em;
|
||||
margin-top: 0;
|
||||
}
|
||||
.ui-pnotify-text {
|
||||
display: block;
|
||||
}
|
||||
.ui-pnotify-icon, .ui-pnotify-icon span {
|
||||
display: block;
|
||||
float: left;
|
||||
margin-right: .2em;
|
||||
}
|
||||
/* Alternate stack initial positioning. */
|
||||
.ui-pnotify.stack-topleft, .ui-pnotify.stack-bottomleft {
|
||||
left: 25px;
|
||||
right: auto;
|
||||
}
|
||||
.ui-pnotify.stack-bottomright, .ui-pnotify.stack-bottomleft {
|
||||
bottom: 25px;
|
||||
top: auto;
|
||||
}
|
||||
.ui-pnotify.stack-modal {
|
||||
left: 50%;
|
||||
right: auto;
|
||||
margin-left: -150px;
|
||||
}
|
||||
@@ -28,7 +28,9 @@
|
||||
@import "library/data-tables/_all"; // DataTables 1.10.12 + extensions
|
||||
|
||||
@import "library/x-editable/_bootstrap-editable"; // X-editable - v1.5.1
|
||||
@import "library/pnotify/_pnotify.core"; // PNotify styles
|
||||
@import "library/pnotify/_pnotify"; // PNotify styles - v3.0.0
|
||||
@import "library/pnotify/_pnotify.nonblock";
|
||||
@import "library/pnotify/_pnotify.custom"; // PNotify custom styles
|
||||
@import "library/slidebars/_slidebars"; // Slidebars Navigation
|
||||
@import "library/easy-pie-chart/_easyPieChart"; // Easy Pie Chart 2.1.6
|
||||
@import "library/drag-to-select/_dragToSelect"; // Drag to Select 1.1
|
||||
|
||||
Reference in New Issue
Block a user