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 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{item.level}}
+
+
+
+
+
+
{{_gettext('Close now')}}
+
+
+
+
+
+
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 @@
-
+
Toggle your notifications on/off globally.
-
+
diff --git a/rhodecode/templates/base/root.html b/rhodecode/templates/base/root.html
--- a/rhodecode/templates/base/root.html
+++ b/rhodecode/templates/base/root.html
@@ -154,5 +154,6 @@ c.template_context['visual']['default_re
%if c.post_code:
${c.post_code|n}
%endif
+