Move OC.Notification to the server bundle

Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
This commit is contained in:
Christoph Wurst 2019-01-31 18:01:45 +01:00
parent 2124ff65b6
commit 4fcadd27b0
No known key found for this signature in database
GPG Key ID: CC42AC2A7F0E56D8
5 changed files with 257 additions and 212 deletions

24
core/js/dist/main.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1065,215 +1065,6 @@ OC.msg = {
}
};
/**
* @todo Write documentation
* @namespace
*/
OC.Notification={
queuedNotifications: [],
getDefaultNotificationFunction: null,
/**
* @type Array<int>
* @description array of notification timers
*/
notificationTimers: [],
/**
* @param callback
* @todo Write documentation
*/
setDefault: function(callback) {
OC.Notification.getDefaultNotificationFunction = callback;
},
/**
* Hides a notification.
*
* If a row is given, only hide that one.
* If no row is given, hide all notifications.
*
* @param {jQuery} [$row] notification row
* @param {Function} [callback] callback
*/
hide: function($row, callback) {
var self = this;
var $notification = $('#notification');
if (_.isFunction($row)) {
// first arg is the callback
callback = $row;
$row = undefined;
}
if (!$row) {
console.warn('Missing argument $row in OC.Notification.hide() call, caller needs to be adjusted to only dismiss its own notification');
// assume that the row to be hidden is the first one
$row = $notification.find('.row:first');
}
if ($row && $notification.find('.row').length > 1) {
// remove the row directly
$row.remove();
if (callback) {
callback.call();
}
return;
}
_.defer(function() {
// fade out is supposed to only fade when there is a single row
// however, some code might call hide() and show() directly after,
// which results in more than one element
// in this case, simply delete that one element that was supposed to
// fade out
//
// FIXME: remove once all callers are adjusted to only hide their own notifications
if ($notification.find('.row').length > 1) {
$row.remove();
return;
}
// else, fade out whatever was present
$notification.fadeOut('400', function(){
if (self.isHidden()) {
if (self.getDefaultNotificationFunction) {
self.getDefaultNotificationFunction.call();
}
}
if (callback) {
callback.call();
}
$notification.empty();
});
});
},
/**
* Shows a notification as HTML without being sanitized before.
* If you pass unsanitized user input this may lead to a XSS vulnerability.
* Consider using show() instead of showHTML()
*
* @param {string} html Message to display
* @param {Object} [options] options
* @param {string} [options.type] notification type
* @param {int} [options.timeout=0] timeout value, defaults to 0 (permanent)
* @return {jQuery} jQuery element for notification row
*/
showHtml: function(html, options) {
options = options || {};
_.defaults(options, {
timeout: 0
});
var self = this;
var $notification = $('#notification');
if (this.isHidden()) {
$notification.fadeIn().css('display','inline-block');
}
var $row = $('<div class="row"></div>');
if (options.type) {
$row.addClass('type-' + options.type);
}
if (options.type === 'error') {
// add a close button
var $closeButton = $('<a class="action close icon-close" href="#"></a>');
$closeButton.attr('alt', t('core', 'Dismiss'));
$row.append($closeButton);
$closeButton.one('click', function() {
self.hide($row);
return false;
});
$row.addClass('closeable');
}
$row.prepend(html);
$notification.append($row);
if(options.timeout > 0) {
// register timeout to vanish notification
this.notificationTimers.push(setTimeout(function() {
self.hide($row);
}, (options.timeout * 1000)));
}
return $row;
},
/**
* Shows a sanitized notification
*
* @param {string} text Message to display
* @param {Object} [options] options
* @param {string} [options.type] notification type
* @param {int} [options.timeout=0] timeout value, defaults to 0 (permanent)
* @return {jQuery} jQuery element for notification row
*/
show: function(text, options) {
return this.showHtml($('<div/>').text(text).html(), options);
},
/**
* Updates (replaces) a sanitized notification.
*
* @param {string} text Message to display
* @return {jQuery} JQuery element for notificaiton row
*/
showUpdate: function(text) {
var $notification = $('#notification');
// sanitise
var $html = $('<div/>').text(text).html();
// new notification
if (text && $notification.find('.row').length == 0) {
return this.showHtml($html);
}
var $row = $('<div class="row"></div>').prepend($html);
// just update html in notification
$notification.html($row);
return $row;
},
/**
* Shows a notification that disappears after x seconds, default is
* 7 seconds
*
* @param {string} text Message to show
* @param {array} [options] options array
* @param {int} [options.timeout=7] timeout in seconds, if this is 0 it will show the message permanently
* @param {boolean} [options.isHTML=false] an indicator for HTML notifications (true) or text (false)
* @param {string} [options.type] notification type
*/
showTemporary: function(text, options) {
var defaults = {
isHTML: false,
timeout: 7
};
options = options || {};
// merge defaults with passed in options
_.defaults(options, defaults);
var $row;
if(options.isHTML) {
$row = this.showHtml(text, options);
} else {
$row = this.show(text, options);
}
return $row;
},
/**
* Returns whether a notification is hidden.
* @return {boolean}
*/
isHidden: function() {
return !$("#notification").find('.row').length;
}
};
/**
* Initializes core
*/

View File

@ -25,6 +25,7 @@ import Backbone from './backbone'
import ContactsMenu from './contactsmenu'
import EventSource from './eventsource'
import L10N from './l10n'
import Notification from './notification'
/** @namespace OC */
export default {
@ -34,4 +35,5 @@ export default {
ContactsMenu,
EventSource,
L10N,
Notification,
}

232
core/src/OC/notification.js Normal file
View File

@ -0,0 +1,232 @@
/*
* @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
*
* @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import _ from 'underscore'
import $ from 'jquery'
/**
* @todo Write documentation
* @namespace OC.Notification
*/
export default {
queuedNotifications: [],
getDefaultNotificationFunction: null,
/**
* @type Array<int>
* @description array of notification timers
*/
notificationTimers: [],
/**
* @param callback
* @todo Write documentation
*/
setDefault: function (callback) {
this.getDefaultNotificationFunction = callback;
},
/**
* Hides a notification.
*
* If a row is given, only hide that one.
* If no row is given, hide all notifications.
*
* @param {jQuery} [$row] notification row
* @param {Function} [callback] callback
*/
hide: function ($row, callback) {
var self = this;
var $notification = $('#notification');
if (_.isFunction($row)) {
// first arg is the callback
callback = $row;
$row = undefined;
}
if (!$row) {
console.warn('Missing argument $row in OC.Notification.hide() call, caller needs to be adjusted to only dismiss its own notification');
// assume that the row to be hidden is the first one
$row = $notification.find('.row:first');
}
if ($row && $notification.find('.row').length > 1) {
// remove the row directly
$row.remove();
if (callback) {
callback.call();
}
return;
}
_.defer(function () {
// fade out is supposed to only fade when there is a single row
// however, some code might call hide() and show() directly after,
// which results in more than one element
// in this case, simply delete that one element that was supposed to
// fade out
//
// FIXME: remove once all callers are adjusted to only hide their own notifications
if ($notification.find('.row').length > 1) {
$row.remove();
return;
}
// else, fade out whatever was present
$notification.fadeOut('400', function () {
if (self.isHidden()) {
if (self.getDefaultNotificationFunction) {
self.getDefaultNotificationFunction.call();
}
}
if (callback) {
callback.call();
}
$notification.empty();
});
});
},
/**
* Shows a notification as HTML without being sanitized before.
* If you pass unsanitized user input this may lead to a XSS vulnerability.
* Consider using show() instead of showHTML()
*
* @param {string} html Message to display
* @param {Object} [options] options
* @param {string} [options.type] notification type
* @param {int} [options.timeout=0] timeout value, defaults to 0 (permanent)
* @return {jQuery} jQuery element for notification row
*/
showHtml: function (html, options) {
options = options || {};
_.defaults(options, {
timeout: 0
});
var self = this;
var $notification = $('#notification');
if (this.isHidden()) {
$notification.fadeIn().css('display', 'inline-block');
}
var $row = $('<div class="row"></div>');
if (options.type) {
$row.addClass('type-' + options.type);
}
if (options.type === 'error') {
// add a close button
var $closeButton = $('<a class="action close icon-close" href="#"></a>');
$closeButton.attr('alt', t('core', 'Dismiss'));
$row.append($closeButton);
$closeButton.one('click', function () {
self.hide($row);
return false;
});
$row.addClass('closeable');
}
$row.prepend(html);
$notification.append($row);
if (options.timeout > 0) {
// register timeout to vanish notification
this.notificationTimers.push(setTimeout(function () {
self.hide($row);
}, (options.timeout * 1000)));
}
return $row;
},
/**
* Shows a sanitized notification
*
* @param {string} text Message to display
* @param {Object} [options] options
* @param {string} [options.type] notification type
* @param {int} [options.timeout=0] timeout value, defaults to 0 (permanent)
* @return {jQuery} jQuery element for notification row
*/
show: function (text, options) {
return this.showHtml($('<div/>').text(text).html(), options);
},
/**
* Updates (replaces) a sanitized notification.
*
* @param {string} text Message to display
* @return {jQuery} JQuery element for notificaiton row
*/
showUpdate: function (text) {
var $notification = $('#notification');
// sanitise
var $html = $('<div/>').text(text).html();
// new notification
if (text && $notification.find('.row').length == 0) {
return this.showHtml($html);
}
var $row = $('<div class="row"></div>').prepend($html);
// just update html in notification
$notification.html($row);
return $row;
},
/**
* Shows a notification that disappears after x seconds, default is
* 7 seconds
*
* @param {string} text Message to show
* @param {array} [options] options array
* @param {int} [options.timeout=7] timeout in seconds, if this is 0 it will show the message permanently
* @param {boolean} [options.isHTML=false] an indicator for HTML notifications (true) or text (false)
* @param {string} [options.type] notification type
*/
showTemporary: function (text, options) {
var defaults = {
isHTML: false,
timeout: 7
};
options = options || {};
// merge defaults with passed in options
_.defaults(options, defaults);
var $row;
if (options.isHTML) {
$row = this.showHtml(text, options);
} else {
$row = this.show(text, options);
}
return $row;
},
/**
* Returns whether a notification is hidden.
* @return {boolean}
*/
isHidden: function () {
return !$("#notification").find('.row').length;
}
}