# HG changeset patch # User Marcin Lulek # Date 2016-08-25 16:09:50 # Node ID 49c5028205c9e681f85e0611912c3d7affe92cdd # Parent 1fc29ce6de5eb43aef66058e402780708a18c478 notifications: use rhodecode-toast for notifications instead of toastr jquery plugin diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -39,7 +39,10 @@ syntax: regexp ^rcextensions/ ^result$ ^rhodecode/public/css/style.css$ +^rhodecode/public/css/style-polymer.css$ ^rhodecode/public/js/scripts.js$ +^rhodecode/public/js/rhodecode-components.html$ +^rhodecode/public/js/src/components/shared-styles.html$ ^rhodecode\.db$ ^rhodecode\.log$ ^rhodecode_dev\.log$ diff --git a/Gruntfile.js b/Gruntfile.js --- a/Gruntfile.js +++ b/Gruntfile.js @@ -17,6 +17,16 @@ module.exports = function(grunt) { }, }, concat: { + polymercss:{ + src: [ + // Base libraries + '<%= dirs.js.src %>/components/shared-styles-prefix.html', + '<%= dirs.css %>/style-polymer.css', + '<%= dirs.js.src %>/components/shared-styles-suffix.html' + ], + dest: '<%= dirs.js.dest %>/src/components/shared-styles.html', + nonull: true + }, dist: { src: [ // Base libraries @@ -39,7 +49,6 @@ module.exports = function(grunt) { '<%= dirs.js.src %>/plugins/jquery.mark.js', '<%= dirs.js.src %>/plugins/jquery.timeago.js', '<%= dirs.js.src %>/plugins/jquery.timeago-extension.js', - '<%= dirs.js.src %>/plugins/toastr.js', // Select2 '<%= dirs.js.src %>/select2/select2.js', @@ -106,7 +115,8 @@ module.exports = function(grunt) { optimization: 0 }, files: { - "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less" + "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less", + "<%= dirs.css %>/style-polymer.css": "<%= dirs.css %>/polymer.less" } }, production: { @@ -116,7 +126,8 @@ module.exports = function(grunt) { optimization: 2 }, files: { - "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less" + "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less", + "<%= dirs.css %>/style-polymer.css": "<%= dirs.css %>/polymer.less" } } }, @@ -124,11 +135,11 @@ module.exports = function(grunt) { watch: { less: { files: ["<%= dirs.css %>/*.less"], - tasks: ["less:production"] + tasks: ["less:development", 'concat:polymercss', "vulcanize"] }, js: { files: ["<%= dirs.js.src %>/**/*.js", "<%= dirs.js.src %>/components/*.*"], - tasks: ["concat:dist"] + tasks: ["vulcanize", "concat:dist"] } }, @@ -163,5 +174,5 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-crisper'); grunt.loadNpmTasks('grunt-contrib-copy'); - grunt.registerTask('default', ['copy','vulcanize', 'less:production', 'concat:dist']); + grunt.registerTask('default', ['less:production', 'concat:polymercss', 'copy','vulcanize', 'concat:dist']); }; diff --git a/rhodecode/public/css/main.less b/rhodecode/public/css/main.less --- a/rhodecode/public/css/main.less +++ b/rhodecode/public/css/main.less @@ -25,7 +25,6 @@ @import 'comments'; @import 'panels-bootstrap'; @import 'panels'; -@import 'toastr'; @import 'deform'; @@ -2103,3 +2102,8 @@ input[type=radio] { padding: 0; border: none; } + +.toggle-ajax-spinner{ + height: 16px; + width: 16px; +} diff --git a/rhodecode/public/css/polymer.less b/rhodecode/public/css/polymer.less new file mode 100644 --- /dev/null +++ b/rhodecode/public/css/polymer.less @@ -0,0 +1,33 @@ +//Primary CSS +//--- IMPORTS ------------------// +@import 'helpers'; +@import 'mixins'; +@import 'rcicons'; +@import 'fonts'; +@import 'variables'; +@import 'legacy_code_styles'; +@import 'type'; +@import 'alerts'; +@import 'buttons'; +@import 'tags'; +@import 'examples'; +@import 'login'; +@import 'comments'; + + +.toast-level { + display: inline-block; + min-width: 100px; + font-weight: bold; + text-transform: uppercase; + &.info, &.success { + color: #0ac878; + } + &.error, &.danger { + color: #e85e4d; + } + &.warning { + color: #ffc854; + } +} + diff --git a/rhodecode/public/css/toastr.less b/rhodecode/public/css/toastr.less deleted file mode 100644 --- a/rhodecode/public/css/toastr.less +++ /dev/null @@ -1,268 +0,0 @@ -// Mix-ins -.borderRadius(@radius) { - -moz-border-radius: @radius; - -webkit-border-radius: @radius; - border-radius: @radius; -} - -.boxShadow(@boxShadow) { - -moz-box-shadow: @boxShadow; - -webkit-box-shadow: @boxShadow; - box-shadow: @boxShadow; -} - -.opacity(@opacity) { - @opacityPercent: @opacity * 100; - opacity: @opacity; - -ms-filter: ~"progid:DXImageTransform.Microsoft.Alpha(Opacity=@{opacityPercent})"; - filter: ~"alpha(opacity=@{opacityPercent})"; -} - -.wordWrap(@wordWrap: break-word) { - -ms-word-wrap: @wordWrap; - word-wrap: @wordWrap; -} - -// Variables -@black: #000000; -@grey: #999999; -@light-grey: #CCCCCC; -@white: #FFFFFF; -@near-black: #030303; -@green: #51A351; -@red: #BD362F; -@blue: #2F96B4; -@orange: #F89406; -@default-container-opacity: .8; - -// Styles -.toast-title { - font-weight: bold; -} - -.toast-message { - .wordWrap(); - - a, - label { - color: @near-black; - } - - a:hover { - color: @light-grey; - text-decoration: none; - } -} - -.toast-close-button { - position: relative; - right: -0.3em; - top: -0.3em; - float: right; - font-size: 20px; - font-weight: bold; - color: @black; - -webkit-text-shadow: 0 1px 0 rgba(255,255,255,1); - text-shadow: 0 1px 0 rgba(255,255,255,1); - .opacity(0.8); - - &:hover, - &:focus { - color: @black; - text-decoration: none; - cursor: pointer; - .opacity(0.4); - } -} - -/*Additional properties for button version - iOS requires the button element instead of an anchor tag. - If you want the anchor version, it requires `href="#"`.*/ -button.toast-close-button { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -//#endregion - -.toast-top-center { - top: 0; - right: 0; - width: 100%; -} - -.toast-bottom-center { - bottom: 0; - right: 0; - width: 100%; -} - -.toast-top-full-width { - top: 0; - right: 0; - width: 100%; -} - -.toast-bottom-full-width { - bottom: 0; - right: 0; - width: 100%; -} - -.toast-top-left { - top: 12px; - left: 12px; -} - -.toast-top-right { - top: 12px; - right: 12px; -} - -.toast-bottom-right { - right: 12px; - bottom: 12px; -} - -.toast-bottom-left { - bottom: 12px; - left: 12px; -} - -#toast-container { - position: fixed; - z-index: 999999; - // The container should not be clickable. - pointer-events: none; - * { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - } - - > div { - position: relative; - // The toast itself should be clickable. - pointer-events: auto; - overflow: hidden; - margin: 0 0 6px; - padding: 15px; - width: 300px; - .borderRadius(1px 1px 1px 1px); - background-position: 15px center; - background-repeat: no-repeat; - color: @near-black; - .opacity(@default-container-opacity); - } - - > :hover { - .opacity(1); - cursor: pointer; - } - - > .toast-info { - //background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important; - } - - > .toast-error { - //background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important; - } - - > .toast-success { - //background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important; - } - - > .toast-warning { - //background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important; - } - - /*overrides*/ - &.toast-top-center > div, - &.toast-bottom-center > div { - width: 400px; - margin-left: auto; - margin-right: auto; - } - - &.toast-top-full-width > div, - &.toast-bottom-full-width > div { - width: 96%; - margin-left: auto; - margin-right: auto; - } -} - -.toast { - border-color: @near-black; - border-style: solid; - border-width: 2px 2px 2px 25px; - background-color: @white; -} - -.toast-success { - border-color: @green; -} - -.toast-error { - border-color: @red; -} - -.toast-info { - border-color: @blue; -} - -.toast-warning { - border-color: @orange; -} - -.toast-progress { - position: absolute; - left: 0; - bottom: 0; - height: 4px; - background-color: @black; - .opacity(0.4); -} - -/*Responsive Design*/ - -@media all and (max-width: 240px) { - #toast-container { - - > div { - padding: 8px; - width: 11em; - } - - & .toast-close-button { - right: -0.2em; - top: -0.2em; - } - } -} - -@media all and (min-width: 241px) and (max-width: 480px) { - #toast-container { - > div { - padding: 8px; - width: 18em; - } - - & .toast-close-button { - right: -0.2em; - top: -0.2em; - } - } -} - -@media all and (min-width: 481px) and (max-width: 768px) { - #toast-container { - > div { - padding: 15px; - width: 25em; - } - } -} diff --git a/rhodecode/public/js/src/components/rhodecode-toast.html b/rhodecode/public/js/src/components/rhodecode-toast.html new file mode 100644 --- /dev/null +++ b/rhodecode/public/js/src/components/rhodecode-toast.html @@ -0,0 +1,79 @@ + + + + + + + diff --git a/rhodecode/public/js/src/components/rhodecode-unsafe-html.html b/rhodecode/public/js/src/components/rhodecode-unsafe-html.html new file mode 100644 --- /dev/null +++ b/rhodecode/public/js/src/components/rhodecode-unsafe-html.html @@ -0,0 +1,22 @@ + + + + + + diff --git a/rhodecode/public/js/src/components/shared-components.html b/rhodecode/public/js/src/components/shared-components.html --- a/rhodecode/public/js/src/components/shared-components.html +++ b/rhodecode/public/js/src/components/shared-components.html @@ -4,3 +4,6 @@ + + + diff --git a/rhodecode/public/js/src/components/shared-styles-prefix.html b/rhodecode/public/js/src/components/shared-styles-prefix.html new file mode 100644 --- /dev/null +++ b/rhodecode/public/js/src/components/shared-styles-prefix.html @@ -0,0 +1,3 @@ + + + diff --git a/rhodecode/public/js/src/plugins/toastr.js b/rhodecode/public/js/src/plugins/toastr.js deleted file mode 100644 --- a/rhodecode/public/js/src/plugins/toastr.js +++ /dev/null @@ -1,435 +0,0 @@ -/* - * Toastr - * Copyright 2012-2015 - * Authors: John Papa, Hans FjÀllemark, and Tim Ferrell. - * All Rights Reserved. - * Use, reproduction, distribution, and modification of this code is subject to the terms and - * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php - * - * ARIA Support: Greta Krafsig - * - * Project: https://github.com/CodeSeven/toastr - */ -/* global define */ -(function (define) { - define(['jquery'], function ($) { - return (function () { - var $container; - var listener; - var toastId = 0; - var toastType = { - error: 'error', - info: 'info', - success: 'success', - warning: 'warning' - }; - - var toastr = { - clear: clear, - remove: remove, - error: error, - getContainer: getContainer, - info: info, - options: {}, - subscribe: subscribe, - success: success, - version: '2.1.2', - warning: warning - }; - - var previousToast; - - return toastr; - - //////////////// - - function error(message, title, optionsOverride) { - return notify({ - type: toastType.error, - iconClass: getOptions().iconClasses.error, - message: message, - optionsOverride: optionsOverride, - title: title - }); - } - - function getContainer(options, create) { - if (!options) { options = getOptions(); } - $container = $('#' + options.containerId); - if ($container.length) { - return $container; - } - if (create) { - $container = createContainer(options); - } - return $container; - } - - function info(message, title, optionsOverride) { - return notify({ - type: toastType.info, - iconClass: getOptions().iconClasses.info, - message: message, - optionsOverride: optionsOverride, - title: title - }); - } - - function subscribe(callback) { - listener = callback; - } - - function success(message, title, optionsOverride) { - return notify({ - type: toastType.success, - iconClass: getOptions().iconClasses.success, - message: message, - optionsOverride: optionsOverride, - title: title - }); - } - - function warning(message, title, optionsOverride) { - return notify({ - type: toastType.warning, - iconClass: getOptions().iconClasses.warning, - message: message, - optionsOverride: optionsOverride, - title: title - }); - } - - function clear($toastElement, clearOptions) { - var options = getOptions(); - if (!$container) { getContainer(options); } - if (!clearToast($toastElement, options, clearOptions)) { - clearContainer(options); - } - } - - function remove($toastElement) { - var options = getOptions(); - if (!$container) { getContainer(options); } - if ($toastElement && $(':focus', $toastElement).length === 0) { - removeToast($toastElement); - return; - } - if ($container.children().length) { - $container.remove(); - } - } - - // internal functions - - function clearContainer (options) { - var toastsToClear = $container.children(); - for (var i = toastsToClear.length - 1; i >= 0; i--) { - clearToast($(toastsToClear[i]), options); - } - } - - function clearToast ($toastElement, options, clearOptions) { - var force = clearOptions && clearOptions.force ? clearOptions.force : false; - if ($toastElement && (force || $(':focus', $toastElement).length === 0)) { - $toastElement[options.hideMethod]({ - duration: options.hideDuration, - easing: options.hideEasing, - complete: function () { removeToast($toastElement); } - }); - return true; - } - return false; - } - - function createContainer(options) { - $container = $('
') - .attr('id', options.containerId) - .addClass(options.positionClass) - .attr('aria-live', 'polite') - .attr('role', 'alert'); - - $container.appendTo($(options.target)); - return $container; - } - - function getDefaults() { - return { - tapToDismiss: true, - toastClass: 'toast', - containerId: 'toast-container', - debug: false, - - showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery - showDuration: 300, - showEasing: 'swing', //swing and linear are built into jQuery - onShown: undefined, - hideMethod: 'fadeOut', - hideDuration: 1000, - hideEasing: 'swing', - onHidden: undefined, - closeMethod: false, - closeDuration: false, - closeEasing: false, - - extendedTimeOut: 1000, - iconClasses: { - error: 'toast-error', - info: 'toast-info', - success: 'toast-success', - warning: 'toast-warning' - }, - iconClass: 'toast-info', - positionClass: 'toast-top-right', - timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky - titleClass: 'toast-title', - messageClass: 'toast-message', - escapeHtml: false, - target: 'body', - closeHtml: '', - newestOnTop: true, - preventDuplicates: false, - progressBar: false - }; - } - - function publish(args) { - if (!listener) { return; } - listener(args); - } - - function notify(map) { - var options = getOptions(); - var iconClass = map.iconClass || options.iconClass; - - if (typeof (map.optionsOverride) !== 'undefined') { - options = $.extend(options, map.optionsOverride); - iconClass = map.optionsOverride.iconClass || iconClass; - } - - if (shouldExit(options, map)) { return; } - - toastId++; - - $container = getContainer(options, true); - - var intervalId = null; - var $toastElement = $('
'); - var $titleElement = $('
'); - var $messageElement = $('
'); - var $progressElement = $('
'); - var $closeElement = $(options.closeHtml); - var progressBar = { - intervalId: null, - hideEta: null, - maxHideTime: null - }; - var response = { - toastId: toastId, - state: 'visible', - startTime: new Date(), - options: options, - map: map - }; - - personalizeToast(); - - displayToast(); - - handleEvents(); - - publish(response); - - if (options.debug && console) { - console.log(response); - } - - return $toastElement; - - function escapeHtml(source) { - if (source == null) - source = ""; - - return new String(source) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>'); - } - - function personalizeToast() { - setIcon(); - setTitle(); - setMessage(); - setCloseButton(); - setProgressBar(); - setSequence(); - } - - function handleEvents() { - $toastElement.hover(stickAround, delayedHideToast); - if (!options.onclick && options.tapToDismiss) { - $toastElement.click(hideToast); - } - - if (options.closeButton && $closeElement) { - $closeElement.click(function (event) { - if (event.stopPropagation) { - event.stopPropagation(); - } else if (event.cancelBubble !== undefined && event.cancelBubble !== true) { - event.cancelBubble = true; - } - hideToast(true); - }); - } - - if (options.onclick) { - $toastElement.click(function (event) { - options.onclick(event); - hideToast(); - }); - } - } - - function displayToast() { - $toastElement.hide(); - - $toastElement[options.showMethod]( - {duration: options.showDuration, easing: options.showEasing, complete: options.onShown} - ); - - if (options.timeOut > 0) { - intervalId = setTimeout(hideToast, options.timeOut); - progressBar.maxHideTime = parseFloat(options.timeOut); - progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime; - if (options.progressBar) { - progressBar.intervalId = setInterval(updateProgress, 10); - } - } - } - - function setIcon() { - if (map.iconClass) { - $toastElement.addClass(options.toastClass).addClass(iconClass); - } - } - - function setSequence() { - if (options.newestOnTop) { - $container.prepend($toastElement); - } else { - $container.append($toastElement); - } - } - - function setTitle() { - if (map.title) { - $titleElement.append(!options.escapeHtml ? map.title : escapeHtml(map.title)).addClass(options.titleClass); - $toastElement.append($titleElement); - } - } - - function setMessage() { - if (map.message) { - $messageElement.append(!options.escapeHtml ? map.message : escapeHtml(map.message)).addClass(options.messageClass); - $toastElement.append($messageElement); - } - } - - function setCloseButton() { - if (options.closeButton) { - $closeElement.addClass('toast-close-button').attr('role', 'button'); - $toastElement.prepend($closeElement); - } - } - - function setProgressBar() { - if (options.progressBar) { - $progressElement.addClass('toast-progress'); - $toastElement.prepend($progressElement); - } - } - - function shouldExit(options, map) { - if (options.preventDuplicates) { - if (map.message === previousToast) { - return true; - } else { - previousToast = map.message; - } - } - return false; - } - - function hideToast(override) { - var method = override && options.closeMethod !== false ? options.closeMethod : options.hideMethod; - var duration = override && options.closeDuration !== false ? - options.closeDuration : options.hideDuration; - var easing = override && options.closeEasing !== false ? options.closeEasing : options.hideEasing; - if ($(':focus', $toastElement).length && !override) { - return; - } - clearTimeout(progressBar.intervalId); - return $toastElement[method]({ - duration: duration, - easing: easing, - complete: function () { - removeToast($toastElement); - if (options.onHidden && response.state !== 'hidden') { - options.onHidden(); - } - response.state = 'hidden'; - response.endTime = new Date(); - publish(response); - } - }); - } - - function delayedHideToast() { - if (options.timeOut > 0 || options.extendedTimeOut > 0) { - intervalId = setTimeout(hideToast, options.extendedTimeOut); - progressBar.maxHideTime = parseFloat(options.extendedTimeOut); - progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime; - } - } - - function stickAround() { - clearTimeout(intervalId); - progressBar.hideEta = 0; - $toastElement.stop(true, true)[options.showMethod]( - {duration: options.showDuration, easing: options.showEasing} - ); - } - - function updateProgress() { - var percentage = ((progressBar.hideEta - (new Date().getTime())) / progressBar.maxHideTime) * 100; - $progressElement.width(percentage + '%'); - } - } - - function getOptions() { - return $.extend({}, getDefaults(), toastr.options); - } - - function removeToast($toastElement) { - if (!$container) { $container = getContainer(); } - if ($toastElement.is(':visible')) { - return; - } - $toastElement.remove(); - $toastElement = null; - if ($container.children().length === 0) { - $container.remove(); - previousToast = undefined; - } - } - - })(); - }); -}(typeof define === 'function' && define.amd ? define : function (deps, factory) { - if (typeof module !== 'undefined' && module.exports) { //Node - module.exports = factory(require('jquery')); - } else { - window.toastr = factory(window.jQuery); - } -})); diff --git a/rhodecode/public/js/src/rhodecode/utils/notifications.js b/rhodecode/public/js/src/rhodecode/utils/notifications.js --- a/rhodecode/public/js/src/rhodecode/utils/notifications.js +++ b/rhodecode/public/js/src/rhodecode/utils/notifications.js @@ -1,29 +1,17 @@ "use strict"; -toastr.options = { - "closeButton": true, - "debug": false, - "newestOnTop": false, - "progressBar": false, - "positionClass": "toast-top-center", - "preventDuplicates": false, - "onclick": null, - "showDuration": "300", - "hideDuration": "300", - "timeOut": "0", - "extendedTimeOut": "0", - "showEasing": "swing", - "hideEasing": "linear", - "showMethod": "fadeIn", - "hideMethod": "fadeOut" -}; function notifySystem(data) { var notification = new Notification(data.message.level + ': ' + data.message.message); }; function notifyToaster(data){ - toastr[data.message.level](data.message.message); + var notifications = document.getElementById('notifications'); + notifications.push('toasts', + { level: data.message.level, + message: data.message.message + }); + notifications.open(); } function handleNotifications(data) { diff --git a/rhodecode/templates/admin/my_account/my_account_notifications.html b/rhodecode/templates/admin/my_account/my_account_notifications.html --- a/rhodecode/templates/admin/my_account/my_account_notifications.html +++ b/rhodecode/templates/admin/my_account/my_account_notifications.html @@ -1,5 +1,5 @@