diff --git a/frappe/public/build.json b/frappe/public/build.json index 9f31095371..78afbbdf9a 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -59,7 +59,6 @@ "public/js/lib/jquery/jquery-ui.min.js", "public/js/lib/Sortable.min.js", "public/js/lib/tag-it.min.js", - "public/js/lib/notify.js", "public/js/lib/bootstrap.min.js", "public/js/lib/moment/moment-with-locales.min.js", "public/js/lib/moment/moment-timezone-with-data.min.js", diff --git a/frappe/public/js/frappe/desk.js b/frappe/public/js/frappe/desk.js index 26ca555e49..bf56407ae5 100644 --- a/frappe/public/js/frappe/desk.js +++ b/frappe/public/js/frappe/desk.js @@ -62,9 +62,6 @@ frappe.Application = Class.extend({ this.show_notes(); } - // ask to allow notifications - frappe.utils.if_notify_permitted(); - // listen to csrf_update frappe.realtime.on("csrf_generated", function(data) { // handles the case when a user logs in again from another tab diff --git a/frappe/public/js/frappe/misc/utils.js b/frappe/public/js/frappe/misc/utils.js index a785a6eb99..6144f8e9e8 100644 --- a/frappe/public/js/frappe/misc/utils.js +++ b/frappe/public/js/frappe/misc/utils.js @@ -185,20 +185,21 @@ frappe.utils = { me.intro_area = null; } }, - set_footnote: function(me, wrapper, txt) { - if(!me.footnote_area) { - me.footnote_area = $('
') + set_footnote: function(footnote_area, wrapper, txt) { + if(!footnote_area) { + footnote_area = $('
') .appendTo(wrapper); } if(txt) { - if(txt.search(/

/)==-1) txt = '

' + txt + '

'; - me.footnote_area.html(txt); + if(!txt.includes('

')) + txt = '

' + txt + '

'; + footnote_area.html(txt); } else { - me.footnote_area.remove(); - me.footnote_area = null; + footnote_area.remove(); + footnote_area = null; } - return me.footnote_area; + return footnote_area; }, get_args_dict_from_url: function(txt) { var args = {}; @@ -517,27 +518,8 @@ frappe.utils = { frappe.msgprint("Note: Changing the Page Name will break previous URL to this page."); }, - if_notify_permitted: function(callback) { - if (Notify.needsPermission) { - Notify.requestPermission(callback); - } else { - callback && callback(); - } - }, - notify: function(subject, body, route, onclick) { - if(!route) route = "messages"; - if(!onclick) onclick = function() { - frappe.set_route(route); - } - - frappe.utils.if_notify_permitted(function() { - var notify = new Notify(subject, { - body: body.replace(/<[^>]*>/g, ""), - notifyClick: onclick - }); - notify.show(); - }); + console.log('push notifications are evil and deprecated'); }, set_title: function(title) { @@ -593,3 +575,56 @@ frappe.utils = { return email_list; } }; + +// String.prototype.includes polyfill +// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/includes +if (!String.prototype.includes) { + String.prototype.includes = function(search, start) { + 'use strict'; + if (typeof start !== 'number') { + start = 0; + } + if (start + search.length > this.length) { + return false; + } else { + return this.indexOf(search, start) !== -1; + } + }; +} +// Array.prototype.includes polyfill +// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/includes +if (!Array.prototype.includes) { + Object.defineProperty(Array.prototype, 'includes', { + value: function(searchElement, fromIndex) { + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + var o = Object(this); + var len = o.length >>> 0; + if (len === 0) { + return false; + } + var n = fromIndex | 0; + var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + while (k < len) { + if (o[k] === searchElement) { + return true; + } + k++; + } + return false; + } + }); +} +// Array de duplicate +if (!Array.prototype.uniqBy) { + Object.defineProperty(Array.prototype, 'uniqBy', { + value: function (key) { + var seen = {}; + return this.filter(function (item) { + var k = key(item); + return seen.hasOwnProperty(k) ? false : (seen[k] = true); + }) + } + }) +} \ No newline at end of file diff --git a/frappe/public/js/lib/notify.js b/frappe/public/js/lib/notify.js deleted file mode 100644 index a45c6d3822..0000000000 --- a/frappe/public/js/lib/notify.js +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Author: Alex Gibson - * https://github.com/alexgibson/notify.js - * License: MIT license - */ - -(function(global, factory) { - if (typeof define === 'function' && define.amd) { - // AMD environment - define(function() { - return factory(global, global.document); - }); - } else if (typeof module !== 'undefined' && module.exports) { - // CommonJS environment - module.exports = factory(global, global.document); - } else { - // Browser environment - global.Notify = factory(global, global.document); - } -} (typeof window !== 'undefined' ? window : this, function (w, d) { - - 'use strict'; - - function isFunction (item) { - return typeof item === 'function'; - } - - function Notify(title, options) { - - if (typeof title !== 'string') { - throw new Error('Notify(): first arg (title) must be a string.'); - } - - this.title = title; - - this.options = { - icon: '', - body: '', - tag: '', - notifyShow: null, - notifyClose: null, - notifyClick: null, - notifyError: null, - timeout: null - }; - - this.permission = null; - - if (!Notify.isSupported) { - return; - } - - //User defined options for notification content - if (typeof options === 'object') { - - for (var i in options) { - if (options.hasOwnProperty(i)) { - this.options[i] = options[i]; - } - } - - //callback when notification is displayed - if (isFunction(this.options.notifyShow)) { - this.onShowCallback = this.options.notifyShow; - } - - //callback when notification is closed - if (isFunction(this.options.notifyClose)) { - this.onCloseCallback = this.options.notifyClose; - } - - //callback when notification is clicked - if (isFunction(this.options.notifyClick)) { - this.onClickCallback = this.options.notifyClick; - } - - //callback when notification throws error - if (isFunction(this.options.notifyError)) { - this.onErrorCallback = this.options.notifyError; - } - } - } - - // true if the browser supports HTML5 Notification - Notify.isSupported = 'Notification' in w; - - // true if the permission is not granted - Notify.needsPermission = !(Notify.isSupported && Notification.permission === 'granted'); - - // returns current permission level ('granted', 'default', 'denied' or null) - Notify.permissionLevel = (Notify.isSupported ? Notification.permission : null); - - // asks the user for permission to display notifications. Then calls the callback functions is supplied. - Notify.requestPermission = function (onPermissionGrantedCallback, onPermissionDeniedCallback) { - if (!Notify.isSupported) { - return; - } - w.Notification.requestPermission(function (perm) { - switch (perm) { - case 'granted': - Notify.needsPermission = false; - if (isFunction(onPermissionGrantedCallback)) { - onPermissionGrantedCallback(); - } - break; - case 'denied': - if (isFunction(onPermissionDeniedCallback)) { - onPermissionDeniedCallback(); - } - break; - } - }); - }; - - - Notify.prototype.show = function () { - - if (!Notify.isSupported) { - return; - } - - this.myNotify = new Notification(this.title, { - 'body': this.options.body, - 'tag' : this.options.tag, - 'icon' : this.options.icon - }); - - if (this.options.timeout && !isNaN(this.options.timeout)) { - setTimeout(this.close.bind(this), this.options.timeout * 1000); - } - - this.myNotify.addEventListener('show', this, false); - this.myNotify.addEventListener('error', this, false); - this.myNotify.addEventListener('close', this, false); - this.myNotify.addEventListener('click', this, false); - }; - - Notify.prototype.onShowNotification = function (e) { - if (this.onShowCallback) { - this.onShowCallback(e); - } - }; - - Notify.prototype.onCloseNotification = function (e) { - if (this.onCloseCallback) { - this.onCloseCallback(e); - } - this.destroy(); - }; - - Notify.prototype.onClickNotification = function (e) { - if (this.onClickCallback) { - this.onClickCallback(e); - } - }; - - Notify.prototype.onErrorNotification = function (e) { - if (this.onErrorCallback) { - this.onErrorCallback(e); - } - this.destroy(); - }; - - Notify.prototype.destroy = function () { - this.myNotify.removeEventListener('show', this, false); - this.myNotify.removeEventListener('error', this, false); - this.myNotify.removeEventListener('close', this, false); - this.myNotify.removeEventListener('click', this, false); - }; - - Notify.prototype.close = function () { - this.myNotify.close(); - }; - - Notify.prototype.handleEvent = function (e) { - switch (e.type) { - case 'show': - this.onShowNotification(e); - break; - case 'close': - this.onCloseNotification(e); - break; - case 'click': - this.onClickNotification(e); - break; - case 'error': - this.onErrorNotification(e); - break; - } - }; - - return Notify; - -}));