##// END OF EJS Templates
notifications: use rhodecode-toast for notifications instead of toastr jquery plugin
ergo -
r699:49c50282 default
parent child Browse files
Show More
@@ -0,0 +1,33 b''
1 //Primary CSS
2 //--- IMPORTS ------------------//
3 @import 'helpers';
4 @import 'mixins';
5 @import 'rcicons';
6 @import 'fonts';
7 @import 'variables';
8 @import 'legacy_code_styles';
9 @import 'type';
10 @import 'alerts';
11 @import 'buttons';
12 @import 'tags';
13 @import 'examples';
14 @import 'login';
15 @import 'comments';
16
17
18 .toast-level {
19 display: inline-block;
20 min-width: 100px;
21 font-weight: bold;
22 text-transform: uppercase;
23 &.info, &.success {
24 color: #0ac878;
25 }
26 &.error, &.danger {
27 color: #e85e4d;
28 }
29 &.warning {
30 color: #ffc854;
31 }
32 }
33
@@ -0,0 +1,79 b''
1 <link rel="import" href="../../../../../bower_components/paper-button/paper-button.html">
2 <link rel="import" href="rhodecode-unsafe-html.html">
3 <dom-module id="rhodecode-toast">
4 <template>
5 <style include="shared-styles"></style>
6
7 <style>
8 paper-toast{
9 width: 100%;
10 min-width: 400px;
11 --paper-toast-background-color: #ffffff;
12 --paper-toast-color: #000000;
13 }
14 paper-toast a{
15 font-weight: bold
16 }
17
18 .toast-message-holder {
19 width: calc(100% - 150px);
20 display: inline-block;
21 }
22 .toast-close {
23 display: inline-block;
24 width: 145px;
25 text-align: right;
26 float: right;
27 }
28 .toast-notification {
29 padding: 10px 0 10px 0;
30 }
31
32 </style>
33 <paper-toast id="p-toast" duration="0" horizontal-offset="100" horizontal-align="auto" vertical-align="top" always-on-top>
34 <div class="toast-message-holder">
35 <template is="dom-repeat" items="{{toasts}}">
36 <div class="toast-notification">
37 <span class$="toast-level {{item.level}}">{{item.level}}</span>
38 <rhodecode-unsafe-html text="{{item.message}}"></rhodecode-unsafe-html>
39 </div>
40 </template>
41 </div>
42 <div class="toast-close">
43 <paper-button on-tap="dismissNotifications" class="btn btn-info">{{_gettext('Close now')}}</paper-button>
44 </div>
45 </paper-toast>
46 </template>
47
48 <script>
49 Polymer({
50 is: 'rhodecode-toast',
51 properties: {
52 toasts: {
53 type: Array,
54 value: function(){
55 return []
56 }
57 }
58 },
59 observers: [
60 '_changedToasts(toasts.splices)'
61 ],
62 ready: function(){
63
64 },
65
66 _changedToasts: function(newValue, oldValue){
67 this.$['p-toast'].notifyResize();
68 },
69 dismissNotifications: function(){
70 this.$['p-toast'].close();
71 this.splice('toasts', 0);
72 },
73 open: function(){
74 this.$['p-toast'].open();
75 },
76 _gettext: _gettext
77 });
78 </script>
79 </dom-module>
@@ -0,0 +1,22 b''
1 <link rel="import" href="../../../../../bower_components/polymer/polymer.html">
2
3 <dom-module id="rhodecode-unsafe-html">
4 <template>
5 <style include="shared-styles"></style>
6 <content></content>
7 </template>
8 <script>
9 Polymer({
10 is: 'rhodecode-unsafe-html',
11 properties: {
12 text: {
13 type: String,
14 observer: '_handleText'
15 }
16 },
17 _handleText: function(newVal, oldVal){
18 this.innerHTML = this.text;
19 }
20 })
21 </script>
22 </dom-module>
@@ -0,0 +1,3 b''
1 <dom-module id="shared-styles">
2 <template>
3 <style>
@@ -0,0 +1,3 b''
1 </style>
2 </template>
3 </dom-module>
@@ -1,60 +1,63 b''
1 1 syntax: glob
2 2 *.egg
3 3 *.egg-info
4 4 *.idea
5 5 *.orig
6 6 *.pyc
7 7 *.sqlite-journal
8 8 *.swp
9 9 *.tox
10 10 *.DS_Store*
11 11
12 12 syntax: regexp
13 13
14 14 #.filename
15 15 ^\.settings$
16 16 ^\.project$
17 17 ^\.pydevproject$
18 18 ^\.coverage$
19 19 ^\.cache.*$
20 20 ^\.rhodecode$
21 21
22 22 ^rcextensions
23 23 ^_dev
24 24 ^._dev
25 25 ^build/
26 26 ^bower_components/
27 27 ^coverage\.xml$
28 28 ^data$
29 29 ^\.eggs/
30 30 ^configs/data$
31 31 ^dev.ini$
32 32 ^acceptance_tests/dev.*\.ini$
33 33 ^dist/
34 34 ^fabfile.py
35 35 ^htmlcov
36 36 ^junit\.xml$
37 37 ^node_modules/
38 38 ^pylint.log$
39 39 ^rcextensions/
40 40 ^result$
41 41 ^rhodecode/public/css/style.css$
42 ^rhodecode/public/css/style-polymer.css$
42 43 ^rhodecode/public/js/scripts.js$
44 ^rhodecode/public/js/rhodecode-components.html$
45 ^rhodecode/public/js/src/components/shared-styles.html$
43 46 ^rhodecode\.db$
44 47 ^rhodecode\.log$
45 48 ^rhodecode_dev\.log$
46 49 ^test\.db$
47 50
48 51 # ac-tests
49 52 ^acceptance_tests/\.cache.*$
50 53 ^acceptance_tests/externals
51 54 ^acceptance_tests/ghostdriver.log$
52 55 ^acceptance_tests/local(_.+)?\.ini$
53 56
54 57 # docs
55 58 ^docs/_build$
56 59 ^docs/result$
57 60 ^docs-internal/_build$
58 61
59 62 # Cythonized things
60 63 ^rhodecode/.*\.(c|so)$
@@ -1,167 +1,178 b''
1 1 module.exports = function(grunt) {
2 2 grunt.initConfig({
3 3
4 4 dirs: {
5 5 css: "rhodecode/public/css",
6 6 js: {
7 7 "src": "rhodecode/public/js/src",
8 8 "dest": "rhodecode/public/js"
9 9 }
10 10 },
11 11 copy: {
12 12 main: {
13 13 expand: true,
14 14 cwd: 'bower_components',
15 15 src: 'webcomponentsjs/**',
16 16 dest: '<%= dirs.js.dest %>/vendors',
17 17 },
18 18 },
19 19 concat: {
20 polymercss:{
21 src: [
22 // Base libraries
23 '<%= dirs.js.src %>/components/shared-styles-prefix.html',
24 '<%= dirs.css %>/style-polymer.css',
25 '<%= dirs.js.src %>/components/shared-styles-suffix.html'
26 ],
27 dest: '<%= dirs.js.dest %>/src/components/shared-styles.html',
28 nonull: true
29 },
20 30 dist: {
21 31 src: [
22 32 // Base libraries
23 33 '<%= dirs.js.src %>/jquery-1.11.1.min.js',
24 34 '<%= dirs.js.src %>/logging.js',
25 35 '<%= dirs.js.src %>/bootstrap.js',
26 36 '<%= dirs.js.src %>/mousetrap.js',
27 37 '<%= dirs.js.src %>/moment.js',
28 38 '<%= dirs.js.src %>/appenlight-client-0.4.1.min.js',
29 39 '<%= dirs.js.src %>/i18n_utils.js',
30 40 '<%= dirs.js.src %>/deform.js',
31 41
32 42 // Plugins
33 43 '<%= dirs.js.src %>/plugins/jquery.pjax.js',
34 44 '<%= dirs.js.src %>/plugins/jquery.dataTables.js',
35 45 '<%= dirs.js.src %>/plugins/flavoured_checkbox.js',
36 46 '<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js',
37 47 '<%= dirs.js.src %>/plugins/jquery.autocomplete.js',
38 48 '<%= dirs.js.src %>/plugins/jquery.debounce.js',
39 49 '<%= dirs.js.src %>/plugins/jquery.mark.js',
40 50 '<%= dirs.js.src %>/plugins/jquery.timeago.js',
41 51 '<%= dirs.js.src %>/plugins/jquery.timeago-extension.js',
42 '<%= dirs.js.src %>/plugins/toastr.js',
43 52
44 53 // Select2
45 54 '<%= dirs.js.src %>/select2/select2.js',
46 55
47 56 // Code-mirror
48 57 '<%= dirs.js.src %>/codemirror/codemirror.js',
49 58 '<%= dirs.js.src %>/codemirror/codemirror_loadmode.js',
50 59 '<%= dirs.js.src %>/codemirror/codemirror_hint.js',
51 60 '<%= dirs.js.src %>/codemirror/codemirror_overlay.js',
52 61 '<%= dirs.js.src %>/codemirror/codemirror_placeholder.js',
53 62 // TODO: mikhail: this is an exception. Since the code mirror modes
54 63 // are loaded "on the fly", we need to keep them in a public folder
55 64 '<%= dirs.js.dest %>/mode/meta.js',
56 65 '<%= dirs.js.dest %>/mode/meta_ext.js',
57 66 '<%= dirs.js.dest %>/rhodecode/i18n/select2/translations.js',
58 67
59 68 // Rhodecode utilities
60 69 '<%= dirs.js.src %>/rhodecode/utils/array.js',
61 70 '<%= dirs.js.src %>/rhodecode/utils/string.js',
62 71 '<%= dirs.js.src %>/rhodecode/utils/pyroutes.js',
63 72 '<%= dirs.js.src %>/rhodecode/utils/ajax.js',
64 73 '<%= dirs.js.src %>/rhodecode/utils/autocomplete.js',
65 74 '<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js',
66 75 '<%= dirs.js.src %>/rhodecode/utils/ie.js',
67 76 '<%= dirs.js.src %>/rhodecode/utils/os.js',
68 77 '<%= dirs.js.src %>/rhodecode/utils/topics.js',
69 78
70 79 // Rhodecode widgets
71 80 '<%= dirs.js.src %>/rhodecode/widgets/multiselect.js',
72 81
73 82 // Rhodecode components
74 83 '<%= dirs.js.src %>/rhodecode/init.js',
75 84 '<%= dirs.js.src %>/rhodecode/connection_controller.js',
76 85 '<%= dirs.js.src %>/rhodecode/codemirror.js',
77 86 '<%= dirs.js.src %>/rhodecode/comments.js',
78 87 '<%= dirs.js.src %>/rhodecode/constants.js',
79 88 '<%= dirs.js.src %>/rhodecode/files.js',
80 89 '<%= dirs.js.src %>/rhodecode/followers.js',
81 90 '<%= dirs.js.src %>/rhodecode/menus.js',
82 91 '<%= dirs.js.src %>/rhodecode/notifications.js',
83 92 '<%= dirs.js.src %>/rhodecode/permissions.js',
84 93 '<%= dirs.js.src %>/rhodecode/pjax.js',
85 94 '<%= dirs.js.src %>/rhodecode/pullrequests.js',
86 95 '<%= dirs.js.src %>/rhodecode/settings.js',
87 96 '<%= dirs.js.src %>/rhodecode/select2_widgets.js',
88 97 '<%= dirs.js.src %>/rhodecode/tooltips.js',
89 98 '<%= dirs.js.src %>/rhodecode/users.js',
90 99 '<%= dirs.js.src %>/rhodecode/utils/notifications.js',
91 100 '<%= dirs.js.src %>/rhodecode/appenlight.js',
92 101
93 102 // Rhodecode main module
94 103 '<%= dirs.js.src %>/rhodecode.js'
95 104 ],
96 105 dest: '<%= dirs.js.dest %>/scripts.js',
97 106 nonull: true
98 107 }
99 108 },
100 109
101 110 less: {
102 111 development: {
103 112 options: {
104 113 compress: false,
105 114 yuicompress: false,
106 115 optimization: 0
107 116 },
108 117 files: {
109 "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less"
118 "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less",
119 "<%= dirs.css %>/style-polymer.css": "<%= dirs.css %>/polymer.less"
110 120 }
111 121 },
112 122 production: {
113 123 options: {
114 124 compress: true,
115 125 yuicompress: true,
116 126 optimization: 2
117 127 },
118 128 files: {
119 "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less"
129 "<%= dirs.css %>/style.css": "<%= dirs.css %>/main.less",
130 "<%= dirs.css %>/style-polymer.css": "<%= dirs.css %>/polymer.less"
120 131 }
121 132 }
122 133 },
123 134
124 135 watch: {
125 136 less: {
126 137 files: ["<%= dirs.css %>/*.less"],
127 tasks: ["less:production"]
138 tasks: ["less:development", 'concat:polymercss', "vulcanize"]
128 139 },
129 140 js: {
130 141 files: ["<%= dirs.js.src %>/**/*.js", "<%= dirs.js.src %>/components/*.*"],
131 tasks: ["concat:dist"]
142 tasks: ["vulcanize", "concat:dist"]
132 143 }
133 144 },
134 145
135 146 jshint: {
136 147 rhodecode: {
137 148 src: '<%= dirs.js.src %>/rhodecode/**/*.js',
138 149 options: {
139 150 jshintrc: '.jshintrc'
140 151 }
141 152 }
142 153 },
143 154 vulcanize: {
144 155 default: {
145 156 options: {
146 157 abspath: '',
147 158 inlineScripts: true,
148 159 inlineCss: true,
149 160 stripComments: true
150 161 },
151 162 files: {
152 163 '<%= dirs.js.dest %>/rhodecode-components.html': '<%= dirs.js.src %>/components/shared-components.html'
153 164 }
154 165 }
155 166 }
156 167 });
157 168
158 169 grunt.loadNpmTasks('grunt-contrib-less');
159 170 grunt.loadNpmTasks('grunt-contrib-concat');
160 171 grunt.loadNpmTasks('grunt-contrib-watch');
161 172 grunt.loadNpmTasks('grunt-contrib-jshint');
162 173 grunt.loadNpmTasks('grunt-vulcanize');
163 174 grunt.loadNpmTasks('grunt-crisper');
164 175 grunt.loadNpmTasks('grunt-contrib-copy');
165 176
166 grunt.registerTask('default', ['copy','vulcanize', 'less:production', 'concat:dist']);
177 grunt.registerTask('default', ['less:production', 'concat:polymercss', 'copy','vulcanize', 'concat:dist']);
167 178 };
@@ -1,2105 +1,2109 b''
1 1 //Primary CSS
2 2
3 3 //--- IMPORTS ------------------//
4 4
5 5 @import 'helpers';
6 6 @import 'mixins';
7 7 @import 'rcicons';
8 8 @import 'fonts';
9 9 @import 'variables';
10 10 @import 'bootstrap-variables';
11 11 @import 'form-bootstrap';
12 12 @import 'codemirror';
13 13 @import 'legacy_code_styles';
14 14 @import 'progress-bar';
15 15
16 16 @import 'type';
17 17 @import 'alerts';
18 18 @import 'buttons';
19 19 @import 'tags';
20 20 @import 'code-block';
21 21 @import 'examples';
22 22 @import 'login';
23 23 @import 'main-content';
24 24 @import 'select2';
25 25 @import 'comments';
26 26 @import 'panels-bootstrap';
27 27 @import 'panels';
28 @import 'toastr';
29 28 @import 'deform';
30 29
31 30
32 31 //--- BASE ------------------//
33 32 .noscript-error {
34 33 top: 0;
35 34 left: 0;
36 35 width: 100%;
37 36 z-index: 101;
38 37 text-align: center;
39 38 font-family: @text-semibold;
40 39 font-size: 120%;
41 40 color: white;
42 41 background-color: @alert2;
43 42 padding: 5px 0 5px 0;
44 43 }
45 44
46 45 html {
47 46 display: table;
48 47 height: 100%;
49 48 width: 100%;
50 49 }
51 50
52 51 body {
53 52 display: table-cell;
54 53 width: 100%;
55 54 }
56 55
57 56 //--- LAYOUT ------------------//
58 57
59 58 .hidden{
60 59 display: none !important;
61 60 }
62 61
63 62 .box{
64 63 float: left;
65 64 width: 100%;
66 65 }
67 66
68 67 .browser-header {
69 68 clear: both;
70 69 }
71 70 .main {
72 71 clear: both;
73 72 padding:0 0 @pagepadding;
74 73 height: auto;
75 74
76 75 &:after { //clearfix
77 76 content:"";
78 77 clear:both;
79 78 width:100%;
80 79 display:block;
81 80 }
82 81 }
83 82
84 83 .action-link{
85 84 margin-left: @padding;
86 85 padding-left: @padding;
87 86 border-left: @border-thickness solid @border-default-color;
88 87 }
89 88
90 89 input + .action-link, .action-link.first{
91 90 border-left: none;
92 91 }
93 92
94 93 .action-link.last{
95 94 margin-right: @padding;
96 95 padding-right: @padding;
97 96 }
98 97
99 98 .action-link.active,
100 99 .action-link.active a{
101 100 color: @grey4;
102 101 }
103 102
104 103 ul.simple-list{
105 104 list-style: none;
106 105 margin: 0;
107 106 padding: 0;
108 107 }
109 108
110 109 .main-content {
111 110 padding-bottom: @pagepadding;
112 111 }
113 112
114 113 .wrapper {
115 114 position: relative;
116 115 max-width: @wrapper-maxwidth;
117 116 margin: 0 auto;
118 117 }
119 118
120 119 #content {
121 120 clear: both;
122 121 padding: 0 @contentpadding;
123 122 }
124 123
125 124 .advanced-settings-fields{
126 125 input{
127 126 margin-left: @textmargin;
128 127 margin-right: @padding/2;
129 128 }
130 129 }
131 130
132 131 .cs_files_title {
133 132 margin: @pagepadding 0 0;
134 133 }
135 134
136 135 input.inline[type="file"] {
137 136 display: inline;
138 137 }
139 138
140 139 .error_page {
141 140 margin: 10% auto;
142 141
143 142 h1 {
144 143 color: @grey2;
145 144 }
146 145
147 146 .error-branding {
148 147 font-family: @text-semibold;
149 148 color: @grey4;
150 149 }
151 150
152 151 .error_message {
153 152 font-family: @text-regular;
154 153 }
155 154
156 155 .sidebar {
157 156 min-height: 275px;
158 157 margin: 0;
159 158 padding: 0 0 @sidebarpadding @sidebarpadding;
160 159 border: none;
161 160 }
162 161
163 162 .main-content {
164 163 position: relative;
165 164 margin: 0 @sidebarpadding @sidebarpadding;
166 165 padding: 0 0 0 @sidebarpadding;
167 166 border-left: @border-thickness solid @grey5;
168 167
169 168 @media (max-width:767px) {
170 169 clear: both;
171 170 width: 100%;
172 171 margin: 0;
173 172 border: none;
174 173 }
175 174 }
176 175
177 176 .inner-column {
178 177 float: left;
179 178 width: 29.75%;
180 179 min-height: 150px;
181 180 margin: @sidebarpadding 2% 0 0;
182 181 padding: 0 2% 0 0;
183 182 border-right: @border-thickness solid @grey5;
184 183
185 184 @media (max-width:767px) {
186 185 clear: both;
187 186 width: 100%;
188 187 border: none;
189 188 }
190 189
191 190 ul {
192 191 padding-left: 1.25em;
193 192 }
194 193
195 194 &:last-child {
196 195 margin: @sidebarpadding 0 0;
197 196 border: none;
198 197 }
199 198
200 199 h4 {
201 200 margin: 0 0 @padding;
202 201 font-family: @text-semibold;
203 202 }
204 203 }
205 204 }
206 205 .error-page-logo {
207 206 width: 130px;
208 207 height: 160px;
209 208 }
210 209
211 210 // HEADER
212 211 .header {
213 212
214 213 // TODO: johbo: Fix login pages, so that they work without a min-height
215 214 // for the header and then remove the min-height. I chose a smaller value
216 215 // intentionally here to avoid rendering issues in the main navigation.
217 216 min-height: 49px;
218 217
219 218 position: relative;
220 219 vertical-align: bottom;
221 220 padding: 0 @header-padding;
222 221 background-color: @grey2;
223 222 color: @grey5;
224 223
225 224 .title {
226 225 overflow: visible;
227 226 }
228 227
229 228 &:before,
230 229 &:after {
231 230 content: "";
232 231 clear: both;
233 232 width: 100%;
234 233 }
235 234
236 235 // TODO: johbo: Avoids breaking "Repositories" chooser
237 236 .select2-container .select2-choice .select2-arrow {
238 237 display: none;
239 238 }
240 239 }
241 240
242 241 #header-inner {
243 242 &.title {
244 243 margin: 0;
245 244 }
246 245 &:before,
247 246 &:after {
248 247 content: "";
249 248 clear: both;
250 249 }
251 250 }
252 251
253 252 // Gists
254 253 #files_data {
255 254 clear: both; //for firefox
256 255 }
257 256 #gistid {
258 257 margin-right: @padding;
259 258 }
260 259
261 260 // Global Settings Editor
262 261 .textarea.editor {
263 262 float: left;
264 263 position: relative;
265 264 max-width: @texteditor-width;
266 265
267 266 select {
268 267 position: absolute;
269 268 top:10px;
270 269 right:0;
271 270 }
272 271
273 272 .CodeMirror {
274 273 margin: 0;
275 274 }
276 275
277 276 .help-block {
278 277 margin: 0 0 @padding;
279 278 padding:.5em;
280 279 background-color: @grey6;
281 280 }
282 281 }
283 282
284 283 ul.auth_plugins {
285 284 margin: @padding 0 @padding @legend-width;
286 285 padding: 0;
287 286
288 287 li {
289 288 margin-bottom: @padding;
290 289 line-height: 1em;
291 290 list-style-type: none;
292 291
293 292 .auth_buttons .btn {
294 293 margin-right: @padding;
295 294 }
296 295
297 296 &:before { content: none; }
298 297 }
299 298 }
300 299
301 300
302 301 // My Account PR list
303 302
304 303 #show_closed {
305 304 margin: 0 1em 0 0;
306 305 }
307 306
308 307 .pullrequestlist {
309 308 .closed {
310 309 background-color: @grey6;
311 310 }
312 311 .td-status {
313 312 padding-left: .5em;
314 313 }
315 314 .log-container .truncate {
316 315 height: 2.75em;
317 316 white-space: pre-line;
318 317 }
319 318 table.rctable .user {
320 319 padding-left: 0;
321 320 }
322 321 table.rctable {
323 322 td.td-description,
324 323 .rc-user {
325 324 min-width: auto;
326 325 }
327 326 }
328 327 }
329 328
330 329 // Pull Requests
331 330
332 331 .pullrequests_section_head {
333 332 display: block;
334 333 clear: both;
335 334 margin: @padding 0;
336 335 font-family: @text-bold;
337 336 }
338 337
339 338 .pr-origininfo, .pr-targetinfo {
340 339 position: relative;
341 340
342 341 .tag {
343 342 display: inline-block;
344 343 margin: 0 1em .5em 0;
345 344 }
346 345
347 346 .clone-url {
348 347 display: inline-block;
349 348 margin: 0 0 .5em 0;
350 349 padding: 0;
351 350 line-height: 1.2em;
352 351 }
353 352 }
354 353
355 354 .pr-pullinfo {
356 355 clear: both;
357 356 margin: .5em 0;
358 357 }
359 358
360 359 #pr-title-input {
361 360 width: 72%;
362 361 font-size: 1em;
363 362 font-family: @text-bold;
364 363 margin: 0;
365 364 padding: 0 0 0 @padding/4;
366 365 line-height: 1.7em;
367 366 color: @text-color;
368 367 letter-spacing: .02em;
369 368 }
370 369
371 370 #pullrequest_title {
372 371 width: 100%;
373 372 box-sizing: border-box;
374 373 }
375 374
376 375 #pr_open_message {
377 376 border: @border-thickness solid #fff;
378 377 border-radius: @border-radius;
379 378 padding: @padding-large-vertical @padding-large-vertical @padding-large-vertical 0;
380 379 text-align: right;
381 380 overflow: hidden;
382 381 }
383 382
384 383 .pr-submit-button {
385 384 float: right;
386 385 margin: 0 0 0 5px;
387 386 }
388 387
389 388 .pr-spacing-container {
390 389 padding: 20px;
391 390 clear: both
392 391 }
393 392
394 393 #pr-description-input {
395 394 margin-bottom: 0;
396 395 }
397 396
398 397 .pr-description-label {
399 398 vertical-align: top;
400 399 }
401 400
402 401 .perms_section_head {
403 402 min-width: 625px;
404 403
405 404 h2 {
406 405 margin-bottom: 0;
407 406 }
408 407
409 408 .label-checkbox {
410 409 float: left;
411 410 }
412 411
413 412 &.field {
414 413 margin: @space 0 @padding;
415 414 }
416 415
417 416 &:first-child.field {
418 417 margin-top: 0;
419 418
420 419 .label {
421 420 margin-top: 0;
422 421 padding-top: 0;
423 422 }
424 423
425 424 .radios {
426 425 padding-top: 0;
427 426 }
428 427 }
429 428
430 429 .radios {
431 430 float: right;
432 431 position: relative;
433 432 width: 405px;
434 433 }
435 434 }
436 435
437 436 //--- MODULES ------------------//
438 437
439 438
440 439 // Fixed Sidebar Column
441 440 .sidebar-col-wrapper {
442 441 padding-left: @sidebar-all-width;
443 442
444 443 .sidebar {
445 444 width: @sidebar-width;
446 445 margin-left: -@sidebar-all-width;
447 446 }
448 447 }
449 448
450 449 .sidebar-col-wrapper.scw-small {
451 450 padding-left: @sidebar-small-all-width;
452 451
453 452 .sidebar {
454 453 width: @sidebar-small-width;
455 454 margin-left: -@sidebar-small-all-width;
456 455 }
457 456 }
458 457
459 458
460 459 // FOOTER
461 460 #footer {
462 461 padding: 0;
463 462 text-align: center;
464 463 vertical-align: middle;
465 464 color: @grey2;
466 465 background-color: @grey6;
467 466
468 467 p {
469 468 margin: 0;
470 469 padding: 1em;
471 470 line-height: 1em;
472 471 }
473 472
474 473 .server-instance { //server instance
475 474 display: none;
476 475 }
477 476
478 477 .title {
479 478 float: none;
480 479 margin: 0 auto;
481 480 }
482 481 }
483 482
484 483 button.close {
485 484 padding: 0;
486 485 cursor: pointer;
487 486 background: transparent;
488 487 border: 0;
489 488 .box-shadow(none);
490 489 -webkit-appearance: none;
491 490 }
492 491
493 492 .close {
494 493 float: right;
495 494 font-size: 21px;
496 495 font-family: @text-bootstrap;
497 496 line-height: 1em;
498 497 font-weight: bold;
499 498 color: @grey2;
500 499
501 500 &:hover,
502 501 &:focus {
503 502 color: @grey1;
504 503 text-decoration: none;
505 504 cursor: pointer;
506 505 }
507 506 }
508 507
509 508 // GRID
510 509 .sorting,
511 510 .sorting_desc,
512 511 .sorting_asc {
513 512 cursor: pointer;
514 513 }
515 514 .sorting_desc:after {
516 515 content: "\00A0\25B2";
517 516 font-size: .75em;
518 517 }
519 518 .sorting_asc:after {
520 519 content: "\00A0\25BC";
521 520 font-size: .68em;
522 521 }
523 522
524 523
525 524 .user_auth_tokens {
526 525
527 526 &.truncate {
528 527 white-space: nowrap;
529 528 overflow: hidden;
530 529 text-overflow: ellipsis;
531 530 }
532 531
533 532 .fields .field .input {
534 533 margin: 0;
535 534 }
536 535
537 536 input#description {
538 537 width: 100px;
539 538 margin: 0;
540 539 }
541 540
542 541 .drop-menu {
543 542 // TODO: johbo: Remove this, should work out of the box when
544 543 // having multiple inputs inline
545 544 margin: 0 0 0 5px;
546 545 }
547 546 }
548 547 #user_list_table {
549 548 .closed {
550 549 background-color: @grey6;
551 550 }
552 551 }
553 552
554 553
555 554 input {
556 555 &.disabled {
557 556 opacity: .5;
558 557 }
559 558 }
560 559
561 560 // remove extra padding in firefox
562 561 input::-moz-focus-inner { border:0; padding:0 }
563 562
564 563 .adjacent input {
565 564 margin-bottom: @padding;
566 565 }
567 566
568 567 .permissions_boxes {
569 568 display: block;
570 569 }
571 570
572 571 //TODO: lisa: this should be in tables
573 572 .show_more_col {
574 573 width: 20px;
575 574 }
576 575
577 576 //FORMS
578 577
579 578 .medium-inline,
580 579 input#description.medium-inline {
581 580 display: inline;
582 581 width: @medium-inline-input-width;
583 582 min-width: 100px;
584 583 }
585 584
586 585 select {
587 586 //reset
588 587 -webkit-appearance: none;
589 588 -moz-appearance: none;
590 589
591 590 display: inline-block;
592 591 height: 28px;
593 592 width: auto;
594 593 margin: 0 @padding @padding 0;
595 594 padding: 0 18px 0 8px;
596 595 line-height:1em;
597 596 font-size: @basefontsize;
598 597 border: @border-thickness solid @rcblue;
599 598 background:white url("../images/dt-arrow-dn.png") no-repeat 100% 50%;
600 599 color: @rcblue;
601 600
602 601 &:after {
603 602 content: "\00A0\25BE";
604 603 }
605 604
606 605 &:focus {
607 606 outline: none;
608 607 }
609 608 }
610 609
611 610 option {
612 611 &:focus {
613 612 outline: none;
614 613 }
615 614 }
616 615
617 616 input,
618 617 textarea {
619 618 padding: @input-padding;
620 619 border: @input-border-thickness solid @border-highlight-color;
621 620 .border-radius (@border-radius);
622 621 font-family: @text-light;
623 622 font-size: @basefontsize;
624 623
625 624 &.input-sm {
626 625 padding: 5px;
627 626 }
628 627
629 628 &#description {
630 629 min-width: @input-description-minwidth;
631 630 min-height: 1em;
632 631 padding: 10px;
633 632 }
634 633 }
635 634
636 635 .field-sm {
637 636 input,
638 637 textarea {
639 638 padding: 5px;
640 639 }
641 640 }
642 641
643 642 textarea {
644 643 display: block;
645 644 clear: both;
646 645 width: 100%;
647 646 min-height: 100px;
648 647 margin-bottom: @padding;
649 648 .box-sizing(border-box);
650 649 overflow: auto;
651 650 }
652 651
653 652 label {
654 653 font-family: @text-light;
655 654 }
656 655
657 656 // GRAVATARS
658 657 // centers gravatar on username to the right
659 658
660 659 .gravatar {
661 660 display: inline;
662 661 min-width: 16px;
663 662 min-height: 16px;
664 663 margin: -5px 0;
665 664 padding: 0;
666 665 line-height: 1em;
667 666 border: 1px solid @grey4;
668 667
669 668 &.gravatar-large {
670 669 margin: -0.5em .25em -0.5em 0;
671 670 }
672 671
673 672 & + .user {
674 673 display: inline;
675 674 margin: 0;
676 675 padding: 0 0 0 .17em;
677 676 line-height: 1em;
678 677 }
679 678 }
680 679
681 680 .user-inline-data {
682 681 display: inline-block;
683 682 float: left;
684 683 padding-left: .5em;
685 684 line-height: 1.3em;
686 685 }
687 686
688 687 .rc-user { // gravatar + user wrapper
689 688 float: left;
690 689 position: relative;
691 690 min-width: 100px;
692 691 max-width: 200px;
693 692 min-height: (@gravatar-size + @border-thickness * 2); // account for border
694 693 display: block;
695 694 padding: 0 0 0 (@gravatar-size + @basefontsize/2 + @border-thickness * 2);
696 695
697 696
698 697 .gravatar {
699 698 display: block;
700 699 position: absolute;
701 700 top: 0;
702 701 left: 0;
703 702 min-width: @gravatar-size;
704 703 min-height: @gravatar-size;
705 704 margin: 0;
706 705 }
707 706
708 707 .user {
709 708 display: block;
710 709 max-width: 175px;
711 710 padding-top: 2px;
712 711 overflow: hidden;
713 712 text-overflow: ellipsis;
714 713 }
715 714 }
716 715
717 716 .gist-gravatar,
718 717 .journal_container {
719 718 .gravatar-large {
720 719 margin: 0 .5em -10px 0;
721 720 }
722 721 }
723 722
724 723
725 724 // ADMIN SETTINGS
726 725
727 726 // Tag Patterns
728 727 .tag_patterns {
729 728 .tag_input {
730 729 margin-bottom: @padding;
731 730 }
732 731 }
733 732
734 733 .locked_input {
735 734 position: relative;
736 735
737 736 input {
738 737 display: inline;
739 738 margin-top: 3px;
740 739 }
741 740
742 741 br {
743 742 display: none;
744 743 }
745 744
746 745 .error-message {
747 746 float: left;
748 747 width: 100%;
749 748 }
750 749
751 750 .lock_input_button {
752 751 display: inline;
753 752 }
754 753
755 754 .help-block {
756 755 clear: both;
757 756 }
758 757 }
759 758
760 759 // Notifications
761 760
762 761 .notifications_buttons {
763 762 margin: 0 0 @space 0;
764 763 padding: 0;
765 764
766 765 .btn {
767 766 display: inline-block;
768 767 }
769 768 }
770 769
771 770 .notification-list {
772 771
773 772 div {
774 773 display: inline-block;
775 774 vertical-align: middle;
776 775 }
777 776
778 777 .container {
779 778 display: block;
780 779 margin: 0 0 @padding 0;
781 780 }
782 781
783 782 .delete-notifications {
784 783 margin-left: @padding;
785 784 text-align: right;
786 785 cursor: pointer;
787 786 }
788 787
789 788 .read-notifications {
790 789 margin-left: @padding/2;
791 790 text-align: right;
792 791 width: 35px;
793 792 cursor: pointer;
794 793 }
795 794
796 795 .icon-minus-sign {
797 796 color: @alert2;
798 797 }
799 798
800 799 .icon-ok-sign {
801 800 color: @alert1;
802 801 }
803 802 }
804 803
805 804 .user_settings {
806 805 float: left;
807 806 clear: both;
808 807 display: block;
809 808 width: 100%;
810 809
811 810 .gravatar_box {
812 811 margin-bottom: @padding;
813 812
814 813 &:after {
815 814 content: " ";
816 815 clear: both;
817 816 width: 100%;
818 817 }
819 818 }
820 819
821 820 .fields .field {
822 821 clear: both;
823 822 }
824 823 }
825 824
826 825 .advanced_settings {
827 826 margin-bottom: @space;
828 827
829 828 .help-block {
830 829 margin-left: 0;
831 830 }
832 831
833 832 button + .help-block {
834 833 margin-top: @padding;
835 834 }
836 835 }
837 836
838 837 // admin settings radio buttons and labels
839 838 .label-2 {
840 839 float: left;
841 840 width: @label2-width;
842 841
843 842 label {
844 843 color: @grey1;
845 844 }
846 845 }
847 846 .checkboxes {
848 847 float: left;
849 848 width: @checkboxes-width;
850 849 margin-bottom: @padding;
851 850
852 851 .checkbox {
853 852 width: 100%;
854 853
855 854 label {
856 855 margin: 0;
857 856 padding: 0;
858 857 }
859 858 }
860 859
861 860 .checkbox + .checkbox {
862 861 display: inline-block;
863 862 }
864 863
865 864 label {
866 865 margin-right: 1em;
867 866 }
868 867 }
869 868
870 869 // CHANGELOG
871 870 .container_header {
872 871 float: left;
873 872 display: block;
874 873 width: 100%;
875 874 margin: @padding 0 @padding;
876 875
877 876 #filter_changelog {
878 877 float: left;
879 878 margin-right: @padding;
880 879 }
881 880
882 881 .breadcrumbs_light {
883 882 display: inline-block;
884 883 }
885 884 }
886 885
887 886 .info_box {
888 887 float: right;
889 888 }
890 889
891 890
892 891 #graph_nodes {
893 892 padding-top: 43px;
894 893 }
895 894
896 895 #graph_content{
897 896
898 897 // adjust for table headers so that graph renders properly
899 898 // #graph_nodes padding - table cell padding
900 899 padding-top: (@space - (@basefontsize * 2.4));
901 900
902 901 &.graph_full_width {
903 902 width: 100%;
904 903 max-width: 100%;
905 904 }
906 905 }
907 906
908 907 #graph {
909 908 .flag_status {
910 909 margin: 0;
911 910 }
912 911
913 912 .pagination-left {
914 913 float: left;
915 914 clear: both;
916 915 }
917 916
918 917 .log-container {
919 918 max-width: 345px;
920 919
921 920 .message{
922 921 max-width: 340px;
923 922 }
924 923 }
925 924
926 925 .graph-col-wrapper {
927 926 padding-left: 110px;
928 927
929 928 #graph_nodes {
930 929 width: 100px;
931 930 margin-left: -110px;
932 931 float: left;
933 932 clear: left;
934 933 }
935 934 }
936 935 }
937 936
938 937 #filter_changelog {
939 938 float: left;
940 939 }
941 940
942 941
943 942 //--- THEME ------------------//
944 943
945 944 #logo {
946 945 float: left;
947 946 margin: 9px 0 0 0;
948 947
949 948 .header {
950 949 background-color: transparent;
951 950 }
952 951
953 952 a {
954 953 display: inline-block;
955 954 }
956 955
957 956 img {
958 957 height:30px;
959 958 }
960 959 }
961 960
962 961 .logo-wrapper {
963 962 float:left;
964 963 }
965 964
966 965 .branding{
967 966 float: left;
968 967 padding: 9px 2px;
969 968 line-height: 1em;
970 969 font-size: @navigation-fontsize;
971 970 }
972 971
973 972 img {
974 973 border: none;
975 974 outline: none;
976 975 }
977 976 user-profile-header
978 977 label {
979 978
980 979 input[type="checkbox"] {
981 980 margin-right: 1em;
982 981 }
983 982 input[type="radio"] {
984 983 margin-right: 1em;
985 984 }
986 985 }
987 986
988 987 .flag_status {
989 988 margin: 2px 8px 6px 2px;
990 989 &.under_review {
991 990 .circle(5px, @alert3);
992 991 }
993 992 &.approved {
994 993 .circle(5px, @alert1);
995 994 }
996 995 &.rejected,
997 996 &.forced_closed{
998 997 .circle(5px, @alert2);
999 998 }
1000 999 &.not_reviewed {
1001 1000 .circle(5px, @grey5);
1002 1001 }
1003 1002 }
1004 1003
1005 1004 .flag_status_comment_box {
1006 1005 margin: 5px 6px 0px 2px;
1007 1006 }
1008 1007 .test_pattern_preview {
1009 1008 margin: @space 0;
1010 1009
1011 1010 p {
1012 1011 margin-bottom: 0;
1013 1012 border-bottom: @border-thickness solid @border-default-color;
1014 1013 color: @grey3;
1015 1014 }
1016 1015
1017 1016 .btn {
1018 1017 margin-bottom: @padding;
1019 1018 }
1020 1019 }
1021 1020 #test_pattern_result {
1022 1021 display: none;
1023 1022 &:extend(pre);
1024 1023 padding: .9em;
1025 1024 color: @grey3;
1026 1025 background-color: @grey7;
1027 1026 border-right: @border-thickness solid @border-default-color;
1028 1027 border-bottom: @border-thickness solid @border-default-color;
1029 1028 border-left: @border-thickness solid @border-default-color;
1030 1029 }
1031 1030
1032 1031 #repo_vcs_settings {
1033 1032 #inherit_overlay_vcs_default {
1034 1033 display: none;
1035 1034 }
1036 1035 #inherit_overlay_vcs_custom {
1037 1036 display: custom;
1038 1037 }
1039 1038 &.inherited {
1040 1039 #inherit_overlay_vcs_default {
1041 1040 display: block;
1042 1041 }
1043 1042 #inherit_overlay_vcs_custom {
1044 1043 display: none;
1045 1044 }
1046 1045 }
1047 1046 }
1048 1047
1049 1048 .issue-tracker-link {
1050 1049 color: @rcblue;
1051 1050 }
1052 1051
1053 1052 // Issue Tracker Table Show/Hide
1054 1053 #repo_issue_tracker {
1055 1054 #inherit_overlay {
1056 1055 display: none;
1057 1056 }
1058 1057 #custom_overlay {
1059 1058 display: custom;
1060 1059 }
1061 1060 &.inherited {
1062 1061 #inherit_overlay {
1063 1062 display: block;
1064 1063 }
1065 1064 #custom_overlay {
1066 1065 display: none;
1067 1066 }
1068 1067 }
1069 1068 }
1070 1069 table.issuetracker {
1071 1070 &.readonly {
1072 1071 tr, td {
1073 1072 color: @grey3;
1074 1073 }
1075 1074 }
1076 1075 .edit {
1077 1076 display: none;
1078 1077 }
1079 1078 .editopen {
1080 1079 .edit {
1081 1080 display: inline;
1082 1081 }
1083 1082 .entry {
1084 1083 display: none;
1085 1084 }
1086 1085 }
1087 1086 tr td.td-action {
1088 1087 min-width: 117px;
1089 1088 }
1090 1089 td input {
1091 1090 max-width: none;
1092 1091 min-width: 30px;
1093 1092 width: 80%;
1094 1093 }
1095 1094 .issuetracker_pref input {
1096 1095 width: 40%;
1097 1096 }
1098 1097 input.edit_issuetracker_update {
1099 1098 margin-right: 0;
1100 1099 width: auto;
1101 1100 }
1102 1101 }
1103 1102
1104 1103
1105 1104 //Permissions Settings
1106 1105 #add_perm {
1107 1106 margin: 0 0 @padding;
1108 1107 cursor: pointer;
1109 1108 }
1110 1109
1111 1110 .perm_ac {
1112 1111 input {
1113 1112 width: 95%;
1114 1113 }
1115 1114 }
1116 1115
1117 1116 .autocomplete-suggestions {
1118 1117 width: auto !important; // overrides autocomplete.js
1119 1118 margin: 0;
1120 1119 border: @border-thickness solid @rcblue;
1121 1120 border-radius: @border-radius;
1122 1121 color: @rcblue;
1123 1122 background-color: white;
1124 1123 }
1125 1124 .autocomplete-selected {
1126 1125 background: #F0F0F0;
1127 1126 }
1128 1127 .ac-container-wrap {
1129 1128 margin: 0;
1130 1129 padding: 8px;
1131 1130 border-bottom: @border-thickness solid @rclightblue;
1132 1131 list-style-type: none;
1133 1132 cursor: pointer;
1134 1133
1135 1134 &:hover {
1136 1135 background-color: @rclightblue;
1137 1136 }
1138 1137
1139 1138 img {
1140 1139 margin-right: 1em;
1141 1140 }
1142 1141
1143 1142 strong {
1144 1143 font-weight: normal;
1145 1144 }
1146 1145 }
1147 1146
1148 1147 // Settings Dropdown
1149 1148 .user-menu .container {
1150 1149 padding: 0 4px;
1151 1150 margin: 0;
1152 1151 }
1153 1152
1154 1153 .user-menu .gravatar {
1155 1154 cursor: pointer;
1156 1155 }
1157 1156
1158 1157 .codeblock {
1159 1158 margin-bottom: @padding;
1160 1159 clear: both;
1161 1160
1162 1161 .stats{
1163 1162 overflow: hidden;
1164 1163 }
1165 1164
1166 1165 .message{
1167 1166 textarea{
1168 1167 margin: 0;
1169 1168 }
1170 1169 }
1171 1170
1172 1171 .code-header {
1173 1172 .stats {
1174 1173 line-height: 2em;
1175 1174
1176 1175 .revision_id {
1177 1176 margin-left: 0;
1178 1177 }
1179 1178 .buttons {
1180 1179 padding-right: 0;
1181 1180 }
1182 1181 }
1183 1182
1184 1183 .item{
1185 1184 margin-right: 0.5em;
1186 1185 }
1187 1186 }
1188 1187
1189 1188 #editor_container{
1190 1189 position: relative;
1191 1190 margin: @padding;
1192 1191 }
1193 1192 }
1194 1193
1195 1194 #file_history_container {
1196 1195 display: none;
1197 1196 }
1198 1197
1199 1198 .file-history-inner {
1200 1199 margin-bottom: 10px;
1201 1200 }
1202 1201
1203 1202 // Pull Requests
1204 1203 .summary-details {
1205 1204 width: 72%;
1206 1205 }
1207 1206 .pr-summary {
1208 1207 border-bottom: @border-thickness solid @grey5;
1209 1208 margin-bottom: @space;
1210 1209 }
1211 1210 .reviewers-title {
1212 1211 width: 25%;
1213 1212 min-width: 200px;
1214 1213 }
1215 1214 .reviewers {
1216 1215 width: 25%;
1217 1216 min-width: 200px;
1218 1217 }
1219 1218 .reviewers ul li {
1220 1219 position: relative;
1221 1220 width: 100%;
1222 1221 margin-bottom: 8px;
1223 1222 }
1224 1223 .reviewers_member {
1225 1224 width: 100%;
1226 1225 overflow: auto;
1227 1226 }
1228 1227 .reviewer_status {
1229 1228 display: inline-block;
1230 1229 vertical-align: top;
1231 1230 width: 7%;
1232 1231 min-width: 20px;
1233 1232 height: 1.2em;
1234 1233 margin-top: 3px;
1235 1234 line-height: 1em;
1236 1235 }
1237 1236
1238 1237 .reviewer_name {
1239 1238 display: inline-block;
1240 1239 max-width: 83%;
1241 1240 padding-right: 20px;
1242 1241 vertical-align: middle;
1243 1242 line-height: 1;
1244 1243
1245 1244 .rc-user {
1246 1245 min-width: 0;
1247 1246 margin: -2px 1em 0 0;
1248 1247 }
1249 1248
1250 1249 .reviewer {
1251 1250 float: left;
1252 1251 }
1253 1252
1254 1253 &.to-delete {
1255 1254 .user,
1256 1255 .reviewer {
1257 1256 text-decoration: line-through;
1258 1257 }
1259 1258 }
1260 1259 }
1261 1260
1262 1261 .reviewer_member_remove {
1263 1262 position: absolute;
1264 1263 right: 0;
1265 1264 top: 0;
1266 1265 width: 16px;
1267 1266 margin-bottom: 10px;
1268 1267 padding: 0;
1269 1268 color: black;
1270 1269 }
1271 1270 .reviewer_member_status {
1272 1271 margin-top: 5px;
1273 1272 }
1274 1273 .pr-summary #summary{
1275 1274 width: 100%;
1276 1275 }
1277 1276 .pr-summary .action_button:hover {
1278 1277 border: 0;
1279 1278 cursor: pointer;
1280 1279 }
1281 1280 .pr-details-title {
1282 1281 padding-bottom: 8px;
1283 1282 border-bottom: @border-thickness solid @grey5;
1284 1283 .action_button {
1285 1284 color: @rcblue;
1286 1285 }
1287 1286 }
1288 1287 .pr-details-content {
1289 1288 margin-top: @textmargin;
1290 1289 margin-bottom: @textmargin;
1291 1290 }
1292 1291 .pr-description {
1293 1292 white-space:pre-wrap;
1294 1293 }
1295 1294 .group_members {
1296 1295 margin-top: 0;
1297 1296 padding: 0;
1298 1297 list-style: outside none none;
1299 1298 }
1300 1299 .reviewer_ac .ac-input {
1301 1300 width: 92%;
1302 1301 margin-bottom: 1em;
1303 1302 }
1304 1303 #update_commits {
1305 1304 float: right;
1306 1305 }
1307 1306 .compare_view_commits tr{
1308 1307 height: 20px;
1309 1308 }
1310 1309 .compare_view_commits td {
1311 1310 vertical-align: top;
1312 1311 padding-top: 10px;
1313 1312 }
1314 1313 .compare_view_commits .author {
1315 1314 margin-left: 5px;
1316 1315 }
1317 1316
1318 1317 .compare_view_files {
1319 1318 width: 100%;
1320 1319
1321 1320 td {
1322 1321 vertical-align: middle;
1323 1322 }
1324 1323 }
1325 1324
1326 1325 .compare_view_filepath {
1327 1326 color: @grey1;
1328 1327 }
1329 1328
1330 1329 .show_more {
1331 1330 display: inline-block;
1332 1331 position: relative;
1333 1332 vertical-align: middle;
1334 1333 width: 4px;
1335 1334 height: @basefontsize;
1336 1335
1337 1336 &:after {
1338 1337 content: "\00A0\25BE";
1339 1338 display: inline-block;
1340 1339 width:10px;
1341 1340 line-height: 5px;
1342 1341 font-size: 12px;
1343 1342 cursor: pointer;
1344 1343 }
1345 1344 }
1346 1345
1347 1346 .journal_more .show_more {
1348 1347 display: inline;
1349 1348
1350 1349 &:after {
1351 1350 content: none;
1352 1351 }
1353 1352 }
1354 1353
1355 1354 .open .show_more:after,
1356 1355 .select2-dropdown-open .show_more:after {
1357 1356 .rotate(180deg);
1358 1357 margin-left: 4px;
1359 1358 }
1360 1359
1361 1360
1362 1361 .compare_view_commits .collapse_commit:after {
1363 1362 cursor: pointer;
1364 1363 content: "\00A0\25B4";
1365 1364 margin-left: -3px;
1366 1365 font-size: 17px;
1367 1366 color: @grey4;
1368 1367 }
1369 1368
1370 1369 .diff_links {
1371 1370 margin-left: 8px;
1372 1371 }
1373 1372
1374 1373 p.ancestor {
1375 1374 margin: @padding 0;
1376 1375 }
1377 1376
1378 1377 .cs_icon_td input[type="checkbox"] {
1379 1378 display: none;
1380 1379 }
1381 1380
1382 1381 .cs_icon_td .expand_file_icon:after {
1383 1382 cursor: pointer;
1384 1383 content: "\00A0\25B6";
1385 1384 font-size: 12px;
1386 1385 color: @grey4;
1387 1386 }
1388 1387
1389 1388 .cs_icon_td .collapse_file_icon:after {
1390 1389 cursor: pointer;
1391 1390 content: "\00A0\25BC";
1392 1391 font-size: 12px;
1393 1392 color: @grey4;
1394 1393 }
1395 1394
1396 1395 /*new binary
1397 1396 NEW_FILENODE = 1
1398 1397 DEL_FILENODE = 2
1399 1398 MOD_FILENODE = 3
1400 1399 RENAMED_FILENODE = 4
1401 1400 COPIED_FILENODE = 5
1402 1401 CHMOD_FILENODE = 6
1403 1402 BIN_FILENODE = 7
1404 1403 */
1405 1404 .cs_files_expand {
1406 1405 font-size: @basefontsize + 5px;
1407 1406 line-height: 1.8em;
1408 1407 float: right;
1409 1408 }
1410 1409
1411 1410 .cs_files_expand span{
1412 1411 color: @rcblue;
1413 1412 cursor: pointer;
1414 1413 }
1415 1414 .cs_files {
1416 1415 clear: both;
1417 1416 padding-bottom: @padding;
1418 1417
1419 1418 .cur_cs {
1420 1419 margin: 10px 2px;
1421 1420 font-weight: bold;
1422 1421 }
1423 1422
1424 1423 .node {
1425 1424 float: left;
1426 1425 }
1427 1426
1428 1427 .changes {
1429 1428 float: right;
1430 1429 color: white;
1431 1430 font-size: @basefontsize - 4px;
1432 1431 margin-top: 4px;
1433 1432 opacity: 0.6;
1434 1433 filter: Alpha(opacity=60); /* IE8 and earlier */
1435 1434
1436 1435 .added {
1437 1436 background-color: @alert1;
1438 1437 float: left;
1439 1438 text-align: center;
1440 1439 }
1441 1440
1442 1441 .deleted {
1443 1442 background-color: @alert2;
1444 1443 float: left;
1445 1444 text-align: center;
1446 1445 }
1447 1446
1448 1447 .bin {
1449 1448 background-color: @alert1;
1450 1449 text-align: center;
1451 1450 }
1452 1451
1453 1452 /*new binary*/
1454 1453 .bin.bin1 {
1455 1454 background-color: @alert1;
1456 1455 text-align: center;
1457 1456 }
1458 1457
1459 1458 /*deleted binary*/
1460 1459 .bin.bin2 {
1461 1460 background-color: @alert2;
1462 1461 text-align: center;
1463 1462 }
1464 1463
1465 1464 /*mod binary*/
1466 1465 .bin.bin3 {
1467 1466 background-color: @grey2;
1468 1467 text-align: center;
1469 1468 }
1470 1469
1471 1470 /*rename file*/
1472 1471 .bin.bin4 {
1473 1472 background-color: @alert4;
1474 1473 text-align: center;
1475 1474 }
1476 1475
1477 1476 /*copied file*/
1478 1477 .bin.bin5 {
1479 1478 background-color: @alert4;
1480 1479 text-align: center;
1481 1480 }
1482 1481
1483 1482 /*chmod file*/
1484 1483 .bin.bin6 {
1485 1484 background-color: @grey2;
1486 1485 text-align: center;
1487 1486 }
1488 1487 }
1489 1488 }
1490 1489
1491 1490 .cs_files .cs_added, .cs_files .cs_A,
1492 1491 .cs_files .cs_added, .cs_files .cs_M,
1493 1492 .cs_files .cs_added, .cs_files .cs_D {
1494 1493 height: 16px;
1495 1494 padding-right: 10px;
1496 1495 margin-top: 7px;
1497 1496 text-align: left;
1498 1497 }
1499 1498
1500 1499 .cs_icon_td {
1501 1500 min-width: 16px;
1502 1501 width: 16px;
1503 1502 }
1504 1503
1505 1504 .pull-request-merge {
1506 1505 padding: 10px 0;
1507 1506 margin-top: 10px;
1508 1507 margin-bottom: 20px;
1509 1508 }
1510 1509
1511 1510 .pull-request-merge .pull-request-wrap {
1512 1511 height: 25px;
1513 1512 padding: 5px 0;
1514 1513 }
1515 1514
1516 1515 .pull-request-merge span {
1517 1516 margin-right: 10px;
1518 1517 }
1519 1518 #close_pull_request {
1520 1519 margin-right: 0px;
1521 1520 }
1522 1521
1523 1522 .empty_data {
1524 1523 color: @grey4;
1525 1524 }
1526 1525
1527 1526 #changeset_compare_view_content {
1528 1527 margin-bottom: @space;
1529 1528 clear: both;
1530 1529 width: 100%;
1531 1530 box-sizing: border-box;
1532 1531 .border-radius(@border-radius);
1533 1532
1534 1533 .help-block {
1535 1534 margin: @padding 0;
1536 1535 color: @text-color;
1537 1536 }
1538 1537
1539 1538 .empty_data {
1540 1539 margin: @padding 0;
1541 1540 }
1542 1541
1543 1542 .alert {
1544 1543 margin-bottom: @space;
1545 1544 }
1546 1545 }
1547 1546
1548 1547 .table_disp {
1549 1548 .status {
1550 1549 width: auto;
1551 1550
1552 1551 .flag_status {
1553 1552 float: left;
1554 1553 }
1555 1554 }
1556 1555 }
1557 1556
1558 1557 .status_box_menu {
1559 1558 margin: 0;
1560 1559 }
1561 1560
1562 1561 .notification-table{
1563 1562 margin-bottom: @space;
1564 1563 display: table;
1565 1564 width: 100%;
1566 1565
1567 1566 .container{
1568 1567 display: table-row;
1569 1568
1570 1569 .notification-header{
1571 1570 border-bottom: @border-thickness solid @border-default-color;
1572 1571 }
1573 1572
1574 1573 .notification-subject{
1575 1574 display: table-cell;
1576 1575 }
1577 1576 }
1578 1577 }
1579 1578
1580 1579 // Notifications
1581 1580 .notification-header{
1582 1581 display: table;
1583 1582 width: 100%;
1584 1583 padding: floor(@basefontsize/2) 0;
1585 1584 line-height: 1em;
1586 1585
1587 1586 .desc, .delete-notifications, .read-notifications{
1588 1587 display: table-cell;
1589 1588 text-align: left;
1590 1589 }
1591 1590
1592 1591 .desc{
1593 1592 width: 1163px;
1594 1593 }
1595 1594
1596 1595 .delete-notifications, .read-notifications{
1597 1596 width: 35px;
1598 1597 min-width: 35px; //fixes when only one button is displayed
1599 1598 }
1600 1599 }
1601 1600
1602 1601 .notification-body {
1603 1602 .markdown-block,
1604 1603 .rst-block {
1605 1604 padding: @padding 0;
1606 1605 }
1607 1606
1608 1607 .notification-subject {
1609 1608 padding: @textmargin 0;
1610 1609 border-bottom: @border-thickness solid @border-default-color;
1611 1610 }
1612 1611 }
1613 1612
1614 1613
1615 1614 .notifications_buttons{
1616 1615 float: right;
1617 1616 }
1618 1617
1619 1618 #notification-status{
1620 1619 display: inline;
1621 1620 }
1622 1621
1623 1622 // Repositories
1624 1623
1625 1624 #summary.fields{
1626 1625 display: table;
1627 1626
1628 1627 .field{
1629 1628 display: table-row;
1630 1629
1631 1630 .label-summary{
1632 1631 display: table-cell;
1633 1632 min-width: @label-summary-minwidth;
1634 1633 padding-top: @padding/2;
1635 1634 padding-bottom: @padding/2;
1636 1635 padding-right: @padding/2;
1637 1636 }
1638 1637
1639 1638 .input{
1640 1639 display: table-cell;
1641 1640 padding: @padding/2;
1642 1641
1643 1642 input{
1644 1643 min-width: 29em;
1645 1644 padding: @padding/4;
1646 1645 }
1647 1646 }
1648 1647 .statistics, .downloads{
1649 1648 .disabled{
1650 1649 color: @grey4;
1651 1650 }
1652 1651 }
1653 1652 }
1654 1653 }
1655 1654
1656 1655 #summary{
1657 1656 width: 70%;
1658 1657 }
1659 1658
1660 1659
1661 1660 // Journal
1662 1661 .journal.title {
1663 1662 h5 {
1664 1663 float: left;
1665 1664 margin: 0;
1666 1665 width: 70%;
1667 1666 }
1668 1667
1669 1668 ul {
1670 1669 float: right;
1671 1670 display: inline-block;
1672 1671 margin: 0;
1673 1672 width: 30%;
1674 1673 text-align: right;
1675 1674
1676 1675 li {
1677 1676 display: inline;
1678 1677 font-size: @journal-fontsize;
1679 1678 line-height: 1em;
1680 1679
1681 1680 &:before { content: none; }
1682 1681 }
1683 1682 }
1684 1683 }
1685 1684
1686 1685 .filterexample {
1687 1686 position: absolute;
1688 1687 top: 95px;
1689 1688 left: @contentpadding;
1690 1689 color: @rcblue;
1691 1690 font-size: 11px;
1692 1691 font-family: @text-regular;
1693 1692 cursor: help;
1694 1693
1695 1694 &:hover {
1696 1695 color: @rcdarkblue;
1697 1696 }
1698 1697
1699 1698 @media (max-width:768px) {
1700 1699 position: relative;
1701 1700 top: auto;
1702 1701 left: auto;
1703 1702 display: block;
1704 1703 }
1705 1704 }
1706 1705
1707 1706
1708 1707 #journal{
1709 1708 margin-bottom: @space;
1710 1709
1711 1710 .journal_day{
1712 1711 margin-bottom: @textmargin/2;
1713 1712 padding-bottom: @textmargin/2;
1714 1713 font-size: @journal-fontsize;
1715 1714 border-bottom: @border-thickness solid @border-default-color;
1716 1715 }
1717 1716
1718 1717 .journal_container{
1719 1718 margin-bottom: @space;
1720 1719
1721 1720 .journal_user{
1722 1721 display: inline-block;
1723 1722 }
1724 1723 .journal_action_container{
1725 1724 display: block;
1726 1725 margin-top: @textmargin;
1727 1726
1728 1727 div{
1729 1728 display: inline;
1730 1729 }
1731 1730
1732 1731 div.journal_action_params{
1733 1732 display: block;
1734 1733 }
1735 1734
1736 1735 div.journal_repo:after{
1737 1736 content: "\A";
1738 1737 white-space: pre;
1739 1738 }
1740 1739
1741 1740 div.date{
1742 1741 display: block;
1743 1742 margin-bottom: @textmargin;
1744 1743 }
1745 1744 }
1746 1745 }
1747 1746 }
1748 1747
1749 1748 // Files
1750 1749 .edit-file-title {
1751 1750 border-bottom: @border-thickness solid @border-default-color;
1752 1751
1753 1752 .breadcrumbs {
1754 1753 margin-bottom: 0;
1755 1754 }
1756 1755 }
1757 1756
1758 1757 .edit-file-fieldset {
1759 1758 margin-top: @sidebarpadding;
1760 1759
1761 1760 .fieldset {
1762 1761 .left-label {
1763 1762 width: 13%;
1764 1763 }
1765 1764 .right-content {
1766 1765 width: 87%;
1767 1766 max-width: 100%;
1768 1767 }
1769 1768 .filename-label {
1770 1769 margin-top: 13px;
1771 1770 }
1772 1771 .commit-message-label {
1773 1772 margin-top: 4px;
1774 1773 }
1775 1774 .file-upload-input {
1776 1775 input {
1777 1776 display: none;
1778 1777 }
1779 1778 }
1780 1779 p {
1781 1780 margin-top: 5px;
1782 1781 }
1783 1782
1784 1783 }
1785 1784 .custom-path-link {
1786 1785 margin-left: 5px;
1787 1786 }
1788 1787 #commit {
1789 1788 resize: vertical;
1790 1789 }
1791 1790 }
1792 1791
1793 1792 .delete-file-preview {
1794 1793 max-height: 250px;
1795 1794 }
1796 1795
1797 1796 .new-file,
1798 1797 #filter_activate,
1799 1798 #filter_deactivate {
1800 1799 float: left;
1801 1800 margin: 0 0 0 15px;
1802 1801 }
1803 1802
1804 1803 h3.files_location{
1805 1804 line-height: 2.4em;
1806 1805 }
1807 1806
1808 1807 .browser-nav {
1809 1808 display: table;
1810 1809 margin-bottom: @space;
1811 1810
1812 1811
1813 1812 .info_box {
1814 1813 display: inline-table;
1815 1814 height: 2.5em;
1816 1815
1817 1816 .browser-cur-rev, .info_box_elem {
1818 1817 display: table-cell;
1819 1818 vertical-align: middle;
1820 1819 }
1821 1820
1822 1821 .info_box_elem {
1823 1822 border-top: @border-thickness solid @rcblue;
1824 1823 border-bottom: @border-thickness solid @rcblue;
1825 1824
1826 1825 #at_rev, a {
1827 1826 padding: 0.6em 0.9em;
1828 1827 margin: 0;
1829 1828 .box-shadow(none);
1830 1829 border: 0;
1831 1830 height: 12px;
1832 1831 }
1833 1832
1834 1833 input#at_rev {
1835 1834 max-width: 50px;
1836 1835 text-align: right;
1837 1836 }
1838 1837
1839 1838 &.previous {
1840 1839 border: @border-thickness solid @rcblue;
1841 1840 .disabled {
1842 1841 color: @grey4;
1843 1842 cursor: not-allowed;
1844 1843 }
1845 1844 }
1846 1845
1847 1846 &.next {
1848 1847 border: @border-thickness solid @rcblue;
1849 1848 .disabled {
1850 1849 color: @grey4;
1851 1850 cursor: not-allowed;
1852 1851 }
1853 1852 }
1854 1853 }
1855 1854
1856 1855 .browser-cur-rev {
1857 1856
1858 1857 span{
1859 1858 margin: 0;
1860 1859 color: @rcblue;
1861 1860 height: 12px;
1862 1861 display: inline-block;
1863 1862 padding: 0.7em 1em ;
1864 1863 border: @border-thickness solid @rcblue;
1865 1864 margin-right: @padding;
1866 1865 }
1867 1866 }
1868 1867 }
1869 1868
1870 1869 .search_activate {
1871 1870 display: table-cell;
1872 1871 vertical-align: middle;
1873 1872
1874 1873 input, label{
1875 1874 margin: 0;
1876 1875 padding: 0;
1877 1876 }
1878 1877
1879 1878 input{
1880 1879 margin-left: @textmargin;
1881 1880 }
1882 1881
1883 1882 }
1884 1883 }
1885 1884
1886 1885 .browser-cur-rev{
1887 1886 margin-bottom: @textmargin;
1888 1887 }
1889 1888
1890 1889 #node_filter_box_loading{
1891 1890 .info_text;
1892 1891 }
1893 1892
1894 1893 .browser-search {
1895 1894 margin: -25px 0px 5px 0px;
1896 1895 }
1897 1896
1898 1897 .node-filter {
1899 1898 font-size: @repo-title-fontsize;
1900 1899 padding: 4px 0px 0px 0px;
1901 1900
1902 1901 .node-filter-path {
1903 1902 float: left;
1904 1903 color: @grey4;
1905 1904 }
1906 1905 .node-filter-input {
1907 1906 float: left;
1908 1907 margin: -2px 0px 0px 2px;
1909 1908 input {
1910 1909 padding: 2px;
1911 1910 border: none;
1912 1911 font-size: @repo-title-fontsize;
1913 1912 }
1914 1913 }
1915 1914 }
1916 1915
1917 1916
1918 1917 .browser-result{
1919 1918 td a{
1920 1919 margin-left: 0.5em;
1921 1920 display: inline-block;
1922 1921
1923 1922 em{
1924 1923 font-family: @text-bold;
1925 1924 }
1926 1925 }
1927 1926 }
1928 1927
1929 1928 .browser-highlight{
1930 1929 background-color: @grey5-alpha;
1931 1930 }
1932 1931
1933 1932
1934 1933 // Search
1935 1934
1936 1935 .search-form{
1937 1936 #q {
1938 1937 width: @search-form-width;
1939 1938 }
1940 1939 .fields{
1941 1940 margin: 0 0 @space;
1942 1941 }
1943 1942
1944 1943 label{
1945 1944 display: inline-block;
1946 1945 margin-right: @textmargin;
1947 1946 padding-top: 0.25em;
1948 1947 }
1949 1948
1950 1949
1951 1950 .results{
1952 1951 clear: both;
1953 1952 margin: 0 0 @padding;
1954 1953 }
1955 1954 }
1956 1955
1957 1956 div.search-feedback-items {
1958 1957 display: inline-block;
1959 1958 padding:0px 0px 0px 96px;
1960 1959 }
1961 1960
1962 1961 div.search-code-body {
1963 1962 background-color: #ffffff; padding: 5px 0 5px 10px;
1964 1963 pre {
1965 1964 .match { background-color: #faffa6;}
1966 1965 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
1967 1966 }
1968 1967 }
1969 1968
1970 1969 .expand_commit.search {
1971 1970 .show_more.open {
1972 1971 height: auto;
1973 1972 max-height: none;
1974 1973 }
1975 1974 }
1976 1975
1977 1976 .search-results {
1978 1977
1979 1978 h2 {
1980 1979 margin-bottom: 0;
1981 1980 }
1982 1981 .codeblock {
1983 1982 border: none;
1984 1983 background: transparent;
1985 1984 }
1986 1985
1987 1986 .codeblock-header {
1988 1987 border: none;
1989 1988 background: transparent;
1990 1989 }
1991 1990
1992 1991 .code-body {
1993 1992 border: @border-thickness solid @border-default-color;
1994 1993 .border-radius(@border-radius);
1995 1994 }
1996 1995
1997 1996 .td-commit {
1998 1997 &:extend(pre);
1999 1998 border-bottom: @border-thickness solid @border-default-color;
2000 1999 }
2001 2000
2002 2001 .message {
2003 2002 height: auto;
2004 2003 max-width: 350px;
2005 2004 white-space: normal;
2006 2005 text-overflow: initial;
2007 2006 overflow: visible;
2008 2007
2009 2008 .match { background-color: #faffa6;}
2010 2009 .break { background-color: #DDE7EF; width: 100%; color: #747474; display: block; }
2011 2010 }
2012 2011
2013 2012 }
2014 2013
2015 2014 table.rctable td.td-search-results div {
2016 2015 max-width: 100%;
2017 2016 }
2018 2017
2019 2018 #tip-box, .tip-box{
2020 2019 padding: @menupadding/2;
2021 2020 display: block;
2022 2021 border: @border-thickness solid @border-highlight-color;
2023 2022 .border-radius(@border-radius);
2024 2023 background-color: white;
2025 2024 z-index: 99;
2026 2025 white-space: pre-wrap;
2027 2026 }
2028 2027
2029 2028 #linktt {
2030 2029 width: 79px;
2031 2030 }
2032 2031
2033 2032 #help_kb .modal-content{
2034 2033 max-width: 750px;
2035 2034 margin: 10% auto;
2036 2035
2037 2036 table{
2038 2037 td,th{
2039 2038 border-bottom: none;
2040 2039 line-height: 2.5em;
2041 2040 }
2042 2041 th{
2043 2042 padding-bottom: @textmargin/2;
2044 2043 }
2045 2044 td.keys{
2046 2045 text-align: center;
2047 2046 }
2048 2047 }
2049 2048
2050 2049 .block-left{
2051 2050 width: 45%;
2052 2051 margin-right: 5%;
2053 2052 }
2054 2053 .modal-footer{
2055 2054 clear: both;
2056 2055 }
2057 2056 .key.tag{
2058 2057 padding: 0.5em;
2059 2058 background-color: @rcblue;
2060 2059 color: white;
2061 2060 border-color: @rcblue;
2062 2061 .box-shadow(none);
2063 2062 }
2064 2063 }
2065 2064
2066 2065
2067 2066
2068 2067 //--- IMPORTS FOR REFACTORED STYLES ------------------//
2069 2068
2070 2069 @import 'statistics-graph';
2071 2070 @import 'tables';
2072 2071 @import 'forms';
2073 2072 @import 'diff';
2074 2073 @import 'summary';
2075 2074 @import 'navigation';
2076 2075
2077 2076 //--- SHOW/HIDE SECTIONS --//
2078 2077
2079 2078 .btn-collapse {
2080 2079 float: right;
2081 2080 text-align: right;
2082 2081 font-family: @text-light;
2083 2082 font-size: @basefontsize;
2084 2083 cursor: pointer;
2085 2084 border: none;
2086 2085 color: @rcblue;
2087 2086 }
2088 2087
2089 2088 table.rctable,
2090 2089 table.dataTable {
2091 2090 .btn-collapse {
2092 2091 float: right;
2093 2092 text-align: right;
2094 2093 }
2095 2094 }
2096 2095
2097 2096
2098 2097 // TODO: johbo: Fix for IE10, this avoids that we see a border
2099 2098 // and padding around checkboxes and radio boxes. Move to the right place,
2100 2099 // or better: Remove this once we did the form refactoring.
2101 2100 input[type=checkbox],
2102 2101 input[type=radio] {
2103 2102 padding: 0;
2104 2103 border: none;
2105 2104 }
2105
2106 .toggle-ajax-spinner{
2107 height: 16px;
2108 width: 16px;
2109 }
@@ -1,6 +1,9 b''
1 1 <link rel="import" href="../../../../../bower_components/paper-toggle-button/paper-toggle-button.html">
2 2 <link rel="import" href="../../../../../bower_components/paper-toast/paper-toast.html">
3 3 <link rel="import" href="../../../../../bower_components/paper-tooltip/paper-tooltip.html">
4 4 <link rel="import" href="../../../../../bower_components/paper-button/paper-button.html">
5 5 <link rel="import" href="../../../../../bower_components/paper-spinner/paper-spinner.html">
6 6 <link rel="import" href="../../../../../bower_components/iron-ajax/iron-ajax.html">
7 <link rel="import" href="shared-styles.html">
8 <link rel="import" href="rhodecode-toast.html">
9 <link rel="import" href="rhodecode-unsafe-html.html">
@@ -1,59 +1,47 b''
1 1 "use strict";
2 2
3 toastr.options = {
4 "closeButton": true,
5 "debug": false,
6 "newestOnTop": false,
7 "progressBar": false,
8 "positionClass": "toast-top-center",
9 "preventDuplicates": false,
10 "onclick": null,
11 "showDuration": "300",
12 "hideDuration": "300",
13 "timeOut": "0",
14 "extendedTimeOut": "0",
15 "showEasing": "swing",
16 "hideEasing": "linear",
17 "showMethod": "fadeIn",
18 "hideMethod": "fadeOut"
19 };
20 3
21 4 function notifySystem(data) {
22 5 var notification = new Notification(data.message.level + ': ' + data.message.message);
23 6 };
24 7
25 8 function notifyToaster(data){
26 toastr[data.message.level](data.message.message);
9 var notifications = document.getElementById('notifications');
10 notifications.push('toasts',
11 { level: data.message.level,
12 message: data.message.message
13 });
14 notifications.open();
27 15 }
28 16
29 17 function handleNotifications(data) {
30 18 if (!templateContext.rhodecode_user.notification_status && !data.message.testMessage) {
31 19 // do not act if notifications are disabled
32 20 return
33 21 }
34 22 // use only js notifications for now
35 23 var onlyJS = true;
36 24 if (!("Notification" in window) || onlyJS) {
37 25 // use legacy notificartion
38 26 notifyToaster(data);
39 27 }
40 28 else {
41 29 // Let's check whether notification permissions have already been granted
42 30 if (Notification.permission === "granted") {
43 31 notifySystem(data);
44 32 }
45 33 // Otherwise, we need to ask the user for permission
46 34 else if (Notification.permission !== 'denied') {
47 35 Notification.requestPermission(function (permission) {
48 36 if (permission === "granted") {
49 37 notifySystem(data);
50 38 }
51 39 });
52 40 }
53 41 else{
54 42 notifyToaster(data);
55 43 }
56 44 }
57 45 };
58 46
59 47 $.Topic('/notifications').subscribe(handleNotifications);
@@ -1,96 +1,96 b''
1 1 <template is="dom-bind" id="notificationsPage">
2
2 <style include="shared-styles"></style>
3 3 <iron-ajax id="toggleNotifications"
4 4 method="post"
5 5 url="${url('my_account_notifications_toggle_visibility')}"
6 6 content-type="application/json"
7 7 loading="{{changeNotificationsLoading}}"
8 8 on-response="handleNotifications"
9 9 handle-as="json"></iron-ajax>
10 10
11 11 <div class="panel panel-default">
12 12 <div class="panel-heading">
13 13 <h3 class="panel-title">${_('Your live notification settings')}</h3>
14 14 </div>
15 15 <div class="panel-body">
16 16
17 17 <p><strong>IMPORTANT:</strong> This feature requires enabled channelstream websocket server to function correctly.</p>
18 18
19 19 <p class="hidden">Status of browser notifications permission: <strong id="browser-notification-status"></strong></p>
20 20
21 21 <div class="form">
22 22 <!-- fields -->
23 23 <div class="fields">
24 24 <div class="field">
25 25 <div class="label">
26 26 <label for="new_email">${_('Notifications status')}:</label>
27 27 </div>
28 28 <div class="checkboxes">
29 29 <div style="display: inline-block">
30 30 <paper-toggle-button on-change="toggleNotifications" ${'checked' if c.rhodecode_user.get_instance().user_data.get('notification_status') else ''}></paper-toggle-button>
31 31 <paper-tooltip>Toggle your notifications on/off globally.</paper-tooltip>
32 32 </div>
33 33 <template is="dom-if" if="{{changeNotificationsLoading}}">
34 <paper-spinner active style="height: 22px; width: 22px"></paper-spinner>
34 <paper-spinner active class="toggle-ajax-spinner"></paper-spinner>
35 35 </template>
36 36 </div>
37 37 </div>
38 38 <div class="buttons">
39 39 <a class="btn btn-info" id="test-notification">Test notification</a>
40 40 </div>
41 41 </div>
42 42 </div>
43 43
44 44 </div>
45 45 </div>
46 46
47 47 <script type="application/javascript">
48 48 /** because im not creating a custom element for this page
49 49 * we need to push the function onto the dom-template
50 50 * ideally we turn this into notification-settings elements
51 51 * then it will be cleaner
52 52 */
53 53 var ctrlr = $('#notificationsPage')[0];
54 54 ctrlr.toggleNotifications = function(event){
55 55 var ajax = $('#toggleNotifications')[0];
56 56 ajax.headers = {"X-CSRF-Token": CSRF_TOKEN}
57 57 ajax.body = {notification_status:event.target.active};
58 58 ajax.generateRequest();
59 59 };
60 60 ctrlr.handleNotifications = function(event){
61 61 $('paper-toggle-button')[0].active = event.detail.response;
62 62 };
63 63
64 64 function checkBrowserStatus(){
65 65 var browserStatus = 'Unknown';
66 66
67 67 if (!("Notification" in window)) {
68 68 browserStatus = 'Not supported'
69 69 }
70 70 else if(Notification.permission === 'denied'){
71 71 browserStatus = 'Denied';
72 72 $('.flash_msg').append('<div class="alert alert-error">Notifications are blocked on browser level - you need to enable them in your browser settings.</div>')
73 73 }
74 74 else if(Notification.permission === 'granted'){
75 75 browserStatus = 'Allowed';
76 76 }
77 77
78 78 $('#browser-notification-status').text(browserStatus);
79 79 };
80 80
81 81 checkBrowserStatus();
82 82
83 83 $('#test-notification').on('click', function(e){
84 84 var levels = ['info', 'error', 'warning', 'success'];
85 85 var level = levels[Math.floor(Math.random()*levels.length)];
86 86 var payload = {
87 87 message: {
88 88 message: 'This is a test notification.',
89 89 level: level,
90 90 testMessage: true
91 91 }
92 92 };
93 93 $.Topic('/notifications').publish(payload);
94 94 })
95 95 </script>
96 96 </template>
@@ -1,158 +1,159 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <!DOCTYPE html>
3 3
4 4 <%
5 5 c.template_context['repo_name'] = getattr(c, 'repo_name', '')
6 6
7 7 if hasattr(c, 'rhodecode_db_repo'):
8 8 c.template_context['repo_type'] = c.rhodecode_db_repo.repo_type
9 9 c.template_context['repo_landing_commit'] = c.rhodecode_db_repo.landing_rev[1]
10 10
11 11 if getattr(c, 'rhodecode_user', None) and c.rhodecode_user.user_id:
12 12 c.template_context['rhodecode_user']['username'] = c.rhodecode_user.username
13 13 c.template_context['rhodecode_user']['email'] = c.rhodecode_user.email
14 14 c.template_context['rhodecode_user']['notification_status'] = c.rhodecode_user.get_instance().user_data.get('notification_status', True)
15 15
16 16 c.template_context['visual']['default_renderer'] = h.get_visual_attr(c, 'default_renderer')
17 17 %>
18 18 <html xmlns="http://www.w3.org/1999/xhtml">
19 19 <head>
20 20 <title>${self.title()}</title>
21 21 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
22 22 <%def name="robots()">
23 23 <meta name="robots" content="index, nofollow"/>
24 24 </%def>
25 25 ${self.robots()}
26 26 <link rel="icon" href="${h.asset('images/favicon.ico', ver=c.rhodecode_version_hash)}" sizes="16x16 32x32" type="image/png" />
27 27
28 28 ## CSS definitions
29 29 <%def name="css()">
30 30 <link rel="stylesheet" type="text/css" href="${h.asset('css/style.css', ver=c.rhodecode_version_hash)}" media="screen"/>
31 31 <!--[if lt IE 9]>
32 32 <link rel="stylesheet" type="text/css" href="${h.asset('css/ie.css', ver=c.rhodecode_version_hash)}" media="screen"/>
33 33 <![endif]-->
34 34 ## EXTRA FOR CSS
35 35 ${self.css_extra()}
36 36 </%def>
37 37 ## CSS EXTRA - optionally inject some extra CSS stuff needed for specific websites
38 38 <%def name="css_extra()">
39 39 </%def>
40 40
41 41 ${self.css()}
42 42
43 43 ## JAVASCRIPT
44 44 <%def name="js()">
45 45 <script>
46 46 // setup Polymer options
47 47 window.Polymer = {lazyRegister: true, dom: 'shadow'};
48 48
49 49 // load webcomponents polyfills
50 50 (function() {
51 51 if ('registerElement' in document
52 52 && 'import' in document.createElement('link')
53 53 && 'content' in document.createElement('template')) {
54 54 // browser has web components
55 55 } else {
56 56 // polyfill web components
57 57 var e = document.createElement('script');
58 58 e.src = '${h.asset('js/vendors/webcomponentsjs/webcomponents-lite.min.js', ver=c.rhodecode_version_hash)}';
59 59 document.head.appendChild(e);
60 60 }
61 61 })();
62 62 </script>
63 63 <link rel="import" href="${h.asset('js/rhodecode-components.html', ver=c.rhodecode_version_hash)}" async>
64 64
65 65 <script src="${h.asset('js/rhodecode/i18n/%s.js' % c.language, ver=c.rhodecode_version_hash)}"></script>
66 66 <script type="text/javascript">
67 67 // register templateContext to pass template variables to JS
68 68 var templateContext = ${h.json.dumps(c.template_context)|n};
69 69
70 70 var REPO_NAME = "${getattr(c, 'repo_name', '')}";
71 71 %if hasattr(c, 'rhodecode_db_repo'):
72 72 var REPO_LANDING_REV = '${c.rhodecode_db_repo.landing_rev[1]}';
73 73 var REPO_TYPE = '${c.rhodecode_db_repo.repo_type}';
74 74 %else:
75 75 var REPO_LANDING_REV = '';
76 76 var REPO_TYPE = '';
77 77 %endif
78 78 var APPLICATION_URL = "${h.url('home').rstrip('/')}";
79 79 var ASSET_URL = "${h.asset('')}";
80 80 var DEFAULT_RENDERER = "${h.get_visual_attr(c, 'default_renderer')}";
81 81 var CSRF_TOKEN = "${getattr(c, 'csrf_token', '')}";
82 82 % if getattr(c, 'rhodecode_user', None):
83 83 var USER = {name:'${c.rhodecode_user.username}'};
84 84 % else:
85 85 var USER = {name:null};
86 86 % endif
87 87
88 88 var APPENLIGHT = {
89 89 enabled: ${'true' if getattr(c, 'appenlight_enabled', False) else 'false'},
90 90 key: '${getattr(c, "appenlight_api_public_key", "")}',
91 91 % if getattr(c, 'appenlight_server_url', None):
92 92 serverUrl: '${getattr(c, "appenlight_server_url", "")}',
93 93 % endif
94 94 requestInfo: {
95 95 % if getattr(c, 'rhodecode_user', None):
96 96 ip: '${c.rhodecode_user.ip_addr}',
97 97 username: '${c.rhodecode_user.username}'
98 98 % endif
99 99 }
100 100 };
101 101 </script>
102 102 <!--[if lt IE 9]>
103 103 <script language="javascript" type="text/javascript" src="${h.asset('js/excanvas.min.js')}"></script>
104 104 <![endif]-->
105 105 <script language="javascript" type="text/javascript" src="${h.asset('js/rhodecode/routes.js', ver=c.rhodecode_version_hash)}"></script>
106 106 <script language="javascript" type="text/javascript" src="${h.asset('js/scripts.js', ver=c.rhodecode_version_hash)}"></script>
107 107 ## avoide escaping the %N
108 108 <script>CodeMirror.modeURL = "${h.asset('') + 'js/mode/%N/%N.js?ver='+c.rhodecode_version_hash}";</script>
109 109
110 110
111 111 ## JAVASCRIPT EXTRA - optionally inject some extra JS for specificed templates
112 112 ${self.js_extra()}
113 113
114 114 <script type="text/javascript">
115 115 $(document).ready(function(){
116 116 show_more_event();
117 117 timeagoActivate();
118 118 })
119 119 </script>
120 120
121 121 </%def>
122 122
123 123 ## JAVASCRIPT EXTRA - optionally inject some extra JS for specificed templates
124 124 <%def name="js_extra()"></%def>
125 125 ${self.js()}
126 126
127 127 <%def name="head_extra()"></%def>
128 128 ${self.head_extra()}
129 129 <%include file="/base/plugins_base.html"/>
130 130
131 131 ## extra stuff
132 132 %if c.pre_code:
133 133 ${c.pre_code|n}
134 134 %endif
135 135 </head>
136 136 <body id="body">
137 137 <noscript>
138 138 <div class="noscript-error">
139 139 ${_('Please enable JavaScript to use RhodeCode Enterprise')}
140 140 </div>
141 141 </noscript>
142 142 ## IE hacks
143 143 <!--[if IE 7]>
144 144 <script>$(document.body).addClass('ie7')</script>
145 145 <![endif]-->
146 146 <!--[if IE 8]>
147 147 <script>$(document.body).addClass('ie8')</script>
148 148 <![endif]-->
149 149 <!--[if IE 9]>
150 150 <script>$(document.body).addClass('ie9')</script>
151 151 <![endif]-->
152 152
153 153 ${next.body()}
154 154 %if c.post_code:
155 155 ${c.post_code|n}
156 156 %endif
157 <rhodecode-toast id="notifications"></rhodecode-toast>
157 158 </body>
158 159 </html>
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now