##// END OF EJS Templates
Merge pull request #2192 from Carreau/notification...
Bussonnier Matthias -
r8290:f4616c97 merge
parent child Browse files
Show More
@@ -0,0 +1,141 b''
1 //----------------------------------------------------------------------------
2 // Copyright (C) 2012 The IPython Development Team
3 //
4 // Distributed under the terms of the BSD License. The full license is in
5 // the file COPYING, distributed as part of this software.
6 //----------------------------------------------------------------------------
7
8 //============================================================================
9 // Notification widget
10 //============================================================================
11
12 var IPython = (function (IPython) {
13 "use strict";
14 var utils = IPython.utils;
15
16
17 var NotificationArea = function (selector) {
18 this.selector = selector;
19 if (this.selector !== undefined) {
20 this.element = $(selector);
21 }
22 this.widget_dict = {};
23 };
24
25 NotificationArea.prototype.temp_message = function (msg, timeout, css_class) {
26 var uuid = utils.uuid();
27 if( css_class == 'danger') {css_class = 'ui-state-error';}
28 if( css_class == 'warning') {css_class = 'ui-state-highlight';}
29 var tdiv = $('<div>')
30 .attr('id',uuid)
31 .addClass('notification_widget ui-widget ui-widget-content ui-corner-all')
32 .addClass('border-box-sizing')
33 .addClass(css_class)
34 .hide()
35 .text(msg);
36
37 $(this.selector).append(tdiv);
38 var tmout = Math.max(1500,(timeout||1500));
39 tdiv.fadeIn(100);
40
41 setTimeout(function () {
42 tdiv.fadeOut(100, function () {tdiv.remove();});
43 }, tmout);
44 };
45
46 NotificationArea.prototype.widget = function(name) {
47 if(this.widget_dict[name] == undefined) {
48 return this.new_notification_widget(name);
49 }
50 return this.get_widget(name);
51 };
52
53 NotificationArea.prototype.get_widget = function(name) {
54 if(this.widget_dict[name] == undefined) {
55 throw('no widgets with this name');
56 }
57 return this.widget_dict[name];
58 };
59
60 NotificationArea.prototype.new_notification_widget = function(name) {
61 if(this.widget_dict[name] != undefined) {
62 throw('widget with that name already exists ! ');
63 }
64 var div = $('<div/>').attr('id','notification_'+name);
65 $(this.selector).append(div);
66 this.widget_dict[name] = new IPython.NotificationWidget('#notification_'+name);
67 return this.widget_dict[name];
68 };
69
70 NotificationArea.prototype.init_notification_widgets = function() {
71 var knw = this.new_notification_widget('kernel');
72
73 // Kernel events
74 $([IPython.events]).on('status_idle.Kernel',function () {
75 IPython.save_widget.update_document_title();
76 knw.set_message('Kernel Idle',200);
77 }
78 );
79
80 $([IPython.events]).on('status_busy.Kernel',function () {
81 window.document.title='(Busy) '+window.document.title;
82 knw.set_message("Kernel busy");
83 });
84
85 $([IPython.events]).on('status_restarting.Kernel',function () {
86 IPython.save_widget.update_document_title();
87 knw.set_message("Restarting kernel",1000);
88 });
89
90 $([IPython.events]).on('status_interrupting.Kernel',function () {
91 knw.set_message("Interrupting kernel");
92 });
93
94 $([IPython.events]).on('status_dead.Kernel',function () {
95 var dialog = $('<div/>');
96 dialog.html('The kernel has died, would you like to restart it? If you do not restart the kernel, you will be able to save the notebook, but running code will not work until the notebook is reopened.');
97 $(document).append(dialog);
98 dialog.dialog({
99 resizable: false,
100 modal: true,
101 title: "Dead kernel",
102 buttons : {
103 "Restart": function () {
104 $([IPython.events]).trigger('status_restarting.Kernel');
105 IPython.notebook.start_kernel();
106 $(this).dialog('close');
107 },
108 "Continue running": function () {
109 $(this).dialog('close');
110 }
111 }
112 });
113 });
114
115 var nnw = this.new_notification_widget('notebook');
116
117 // Notebook events
118 $([IPython.events]).on('notebook_loading.Notebook', function () {
119 nnw.set_message("Loading notebook",500);
120 });
121 $([IPython.events]).on('notebook_loaded.Notebook', function () {
122 nnw.set_message("Notebook loaded",500);
123 });
124 $([IPython.events]).on('notebook_saving.Notebook', function () {
125 nnw.set_message("Saving notebook",500);
126 });
127 $([IPython.events]).on('notebook_saved.Notebook', function () {
128 nnw.set_message("Notebook saved",2000);
129 });
130 $([IPython.events]).on('notebook_save_failed.Notebook', function () {
131 nnw.set_message("Notebook save failed");
132 });
133
134 };
135
136 IPython.NotificationArea = NotificationArea;
137
138 return IPython;
139
140 }(IPython));
141
@@ -51,10 +51,20 b' span#notebook_name {'
51 position: relative;
51 position: relative;
52 }
52 }
53
53
54 #notification {
54 #notification_area {
55 position: absolute;
55 position: absolute;
56 right: 3px;
56 right: 0px;
57 top: 3px;
57 top: 0px;
58 height: 25px;
59 padding: 3px 0px;
60 padding-right: 3px;
61 z-index: 10;
62 }
63
64 .notification_widget{
65 float : right;
66 right: 0px;
67 top: 1px;
58 height: 25px;
68 height: 25px;
59 padding: 3px 6px;
69 padding: 3px 6px;
60 z-index: 10;
70 z-index: 10;
@@ -391,4 +401,4 b' pre, code, kbd, samp { white-space: pre-wrap; }'
391
401
392 .js-error {
402 .js-error {
393 color: darkred;
403 color: darkred;
394 } No newline at end of file
404 }
@@ -99,7 +99,7 b' var IPython = (function (IPython) {'
99 " or if the url does not look right, there could be an error in the" +
99 " or if the url does not look right, there could be an error in the" +
100 " server's configuration.";
100 " server's configuration.";
101 } else {
101 } else {
102 IPython.notification_widget.set_message('Reconnecting Websockets', 1000);
102 IPython.notification_area.widget('kernel').set_message('Reconnecting Websockets', 1000);
103 this.start_channels();
103 this.start_channels();
104 return;
104 return;
105 }
105 }
@@ -31,7 +31,8 b' $(document).ready(function () {'
31 IPython.menubar = new IPython.MenuBar('#menubar')
31 IPython.menubar = new IPython.MenuBar('#menubar')
32 IPython.toolbar = new IPython.ToolBar('#toolbar')
32 IPython.toolbar = new IPython.ToolBar('#toolbar')
33 IPython.tooltip = new IPython.Tooltip()
33 IPython.tooltip = new IPython.Tooltip()
34 IPython.notification_widget = new IPython.NotificationWidget('#notification')
34 IPython.notification_area = new IPython.NotificationArea('#notification_area')
35 IPython.notification_area.init_notification_widgets();
35
36
36 IPython.layout_manager.do_resize();
37 IPython.layout_manager.do_resize();
37
38
@@ -10,7 +10,7 b''
10 //============================================================================
10 //============================================================================
11
11
12 var IPython = (function (IPython) {
12 var IPython = (function (IPython) {
13
13 "use strict";
14 var utils = IPython.utils;
14 var utils = IPython.utils;
15
15
16
16
@@ -21,92 +21,51 b' var IPython = (function (IPython) {'
21 if (this.selector !== undefined) {
21 if (this.selector !== undefined) {
22 this.element = $(selector);
22 this.element = $(selector);
23 this.style();
23 this.style();
24 this.bind_events();
25 }
24 }
25 this.element.button();
26 this.element.hide();
27 var that = this;
28
26 };
29 };
27
30
28
31
29 NotificationWidget.prototype.style = function () {
32 NotificationWidget.prototype.style = function () {
30 this.element.addClass('ui-widget ui-widget-content ui-corner-all');
33 this.element.addClass('notification_widget ui-widget ui-widget-content ui-corner-all');
31 this.element.addClass('border-box-sizing');
34 this.element.addClass('border-box-sizing');
32 };
35 };
33
36
34
37 // msg : message to display
35 NotificationWidget.prototype.bind_events = function () {
38 // timeout : time in ms before diseapearing
36 var that = this;
39 //
37 // Kernel events
40 // if timeout <= 0
38 $([IPython.events]).on('status_idle.Kernel',function () {
41 // click_callback : function called if user click on notification
39 IPython.save_widget.update_document_title();
42 // could return false to prevent the notification to be dismissed
40 if (that.get_message() === 'Kernel busy') {
43 NotificationWidget.prototype.set_message = function (msg, timeout, click_callback) {
41 that.element.fadeOut(100, function () {
44 var callback = click_callback || function() {return false;};
42 that.element.html('');
43 });
44 };
45 });
46 $([IPython.events]).on('status_busy.Kernel',function () {
47 window.document.title='(Busy) '+window.document.title;
48 that.set_message("Kernel busy");
49 });
50 $([IPython.events]).on('status_restarting.Kernel',function () {
51 IPython.save_widget.update_document_title();
52 that.set_message("Restarting kernel",500);
53 });
54 $([IPython.events]).on('status_interrupting.Kernel',function () {
55 that.set_message("Interrupting kernel",500);
56 });
57 $([IPython.events]).on('status_dead.Kernel',function () {
58 var dialog = $('<div/>');
59 dialog.html('The kernel has died, would you like to restart it? If you do not restart the kernel, you will be able to save the notebook, but running code will not work until the notebook is reopened.');
60 $(document).append(dialog);
61 dialog.dialog({
62 resizable: false,
63 modal: true,
64 title: "Dead kernel",
65 buttons : {
66 "Restart": function () {
67 $([IPython.events]).trigger('status_restarting.Kernel');
68 IPython.notebook.start_kernel();
69 $(this).dialog('close');
70 },
71 "Continue running": function () {
72 $(this).dialog('close');
73 }
74 }
75 });
76 });
77 // Notebook events
78 $([IPython.events]).on('notebook_loading.Notebook', function () {
79 that.set_message("Loading notebook",500);
80 });
81 $([IPython.events]).on('notebook_loaded.Notebook', function () {
82 that.set_message("Notebook loaded",500);
83 });
84 $([IPython.events]).on('notebook_saving.Notebook', function () {
85 that.set_message("Saving notebook",500);
86 });
87 $([IPython.events]).on('notebook_saved.Notebook', function () {
88 that.set_message("Notebook saved",2000);
89 });
90 $([IPython.events]).on('notebook_save_failed.Notebook', function () {
91 that.set_message("Notebook save failed",2000);
92 });
93 };
94
95
96 NotificationWidget.prototype.set_message = function (msg, timeout) {
97 var that = this;
45 var that = this;
98 this.element.html(msg);
46 this.element.html(msg);
99 this.element.fadeIn(100);
47 this.element.fadeIn(100);
100 if (this.timeout !== null) {
48 if (this.timeout !== null) {
101 clearTimeout(this.timeout);
49 clearTimeout(this.timeout);
102 this.timeout = null;
50 this.timeout = null;
103 };
51 }
104 if (timeout !== undefined) {
52 if (timeout !== undefined && timeout >=0) {
105 this.timeout = setTimeout(function () {
53 this.timeout = setTimeout(function () {
106 that.element.fadeOut(100, function () {that.element.html('');});
54 that.element.fadeOut(100, function () {that.element.html('');});
107 that.timeout = null;
55 that.timeout = null;
108 }, timeout)
56 }, timeout);
109 };
57 } else {
58 this.element.click(function() {
59 if( callback() != false ) {
60 that.element.fadeOut(100, function () {that.element.html('');});
61 that.element.unbind('click');
62 }
63 if (that.timeout !== undefined) {
64 that.timeout = undefined;
65 clearTimeout(that.timeout);
66 }
67 });
68 }
110 };
69 };
111
70
112
71
@@ -152,7 +152,8 b' data-notebook-id={{notebook_id}}'
152 </ul>
152 </ul>
153
153
154 </div>
154 </div>
155 <div id="notification"></div>
155 <div id="notification_area">
156 </div>
156 </div>
157 </div>
157
158
158
159
@@ -242,6 +243,7 b' data-notebook-id={{notebook_id}}'
242 <script src="{{ static_url("js/toolbar.js") }}" type="text/javascript" charset="utf-8"></script>
243 <script src="{{ static_url("js/toolbar.js") }}" type="text/javascript" charset="utf-8"></script>
243 <script src="{{ static_url("js/notebook.js") }}" type="text/javascript" charset="utf-8"></script>
244 <script src="{{ static_url("js/notebook.js") }}" type="text/javascript" charset="utf-8"></script>
244 <script src="{{ static_url("js/notificationwidget.js") }}" type="text/javascript" charset="utf-8"></script>
245 <script src="{{ static_url("js/notificationwidget.js") }}" type="text/javascript" charset="utf-8"></script>
246 <script src="{{ static_url("js/notificationarea.js") }}" type="text/javascript" charset="utf-8"></script>
245 <script src="{{ static_url("js/tooltip.js") }}" type="text/javascript" charset="utf-8"></script>
247 <script src="{{ static_url("js/tooltip.js") }}" type="text/javascript" charset="utf-8"></script>
246 <script src="{{ static_url("js/notebookmain.js") }}" type="text/javascript" charset="utf-8"></script>
248 <script src="{{ static_url("js/notebookmain.js") }}" type="text/javascript" charset="utf-8"></script>
247
249
General Comments 0
You need to be logged in to leave comments. Login now