##// END OF EJS Templates
Add ScrollManager to global ipy namespace in main.js instead of,...
Add ScrollManager to global ipy namespace in main.js instead of, in the bottom of the scroll manager js file.

File last commit:

r17759:830c1a7f
r17868:7d0e0ec2
Show More
notificationarea.js
256 lines | 9.6 KiB | application/javascript | JavascriptLexer
Jonathan Frederic
Almost done!...
r17198 // Copyright (c) IPython Development Team.
// Distributed under the terms of the Modified BSD License.
define([
'base/js/namespace',
Jonathan Frederic
MWE,...
r17200 'jquery',
Jonathan Frederic
Almost done!...
r17198 'base/js/utils',
'base/js/dialog',
Jonathan Frederic
MWE,...
r17200 'notebook/js/notificationwidget',
Matthias BUSSONNIER
use momentjs for nice dates
r17474 'moment'
], function(IPython, $, utils, dialog, notificationwidget, moment) {
Matthias BUSSONNIER
beginning notification area
r8011 "use strict";
jon
In person review with @ellisonbg
r17210 var NotificationArea = function (selector, options) {
jon
Added some nice comments,...
r17211 // Constructor
//
// Parameters:
// selector: string
// options: dictionary
// Dictionary of keyword arguments.
// notebook: Notebook instance
// events: $(Events) instance
// save_widget: SaveWidget instance
Matthias BUSSONNIER
beginning notification area
r8011 this.selector = selector;
jon
In person review with @ellisonbg
r17210 this.events = options.events;
this.save_widget = options.save_widget;
this.notebook = options.notebook;
Jonathan Frederic
Some JS test fixes
r17212 this.keyboard_manager = options.keyboard_manager;
Matthias BUSSONNIER
beginning notification area
r8011 if (this.selector !== undefined) {
this.element = $(selector);
}
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 this.widget_dict = {};
Matthias BUSSONNIER
beginning notification area
r8011 };
NotificationArea.prototype.temp_message = function (msg, timeout, css_class) {
var tdiv = $('<div>')
Matthias BUSSONNIER
more cleanup
r17432 .addClass('notification_widget')
Matthias BUSSONNIER
beginning notification area
r8011 .addClass(css_class)
.hide()
.text(msg);
$(this.selector).append(tdiv);
Matthias BUSSONNIER
trap undefined timout
r8012 var tmout = Math.max(1500,(timeout||1500));
Matthias BUSSONNIER
beginning notification area
r8011 tdiv.fadeIn(100);
setTimeout(function () {
tdiv.fadeOut(100, function () {tdiv.remove();});
Matthias BUSSONNIER
jslint 1
r8204 }, tmout);
Matthias BUSSONNIER
beginning notification area
r8011 };
Matthias BUSSONNIER
jslint 1
r8204 NotificationArea.prototype.widget = function(name) {
Paul Ivanov
rename css class names to be consistent with current style
r15847 if(this.widget_dict[name] === undefined) {
Matthias BUSSONNIER
jslint 1
r8204 return this.new_notification_widget(name);
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 }
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 return this.get_widget(name);
Matthias BUSSONNIER
jslint 1
r8204 };
Matthias BUSSONNIER
tweek notebook notification behavior
r8074
NotificationArea.prototype.get_widget = function(name) {
Paul Ivanov
rename css class names to be consistent with current style
r15847 if(this.widget_dict[name] === undefined) {
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 throw('no widgets with this name');
}
return this.widget_dict[name];
Matthias BUSSONNIER
jslint 1
r8204 };
Matthias BUSSONNIER
tweek notebook notification behavior
r8074
Matthias BUSSONNIER
call init method
r8048 NotificationArea.prototype.new_notification_widget = function(name) {
Paul Ivanov
rename css class names to be consistent with current style
r15847 if(this.widget_dict[name] !== undefined) {
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 throw('widget with that name already exists ! ');
}
Matthias BUSSONNIER
call init method
r8048 var div = $('<div/>').attr('id','notification_'+name);
Matthias BUSSONNIER
jslint 1
r8204 $(this.selector).append(div);
Jonathan Frederic
Fix imports of "modules",...
r17202 this.widget_dict[name] = new notificationwidget.NotificationWidget('#notification_'+name);
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 return this.widget_dict[name];
Matthias BUSSONNIER
jslint 1
r8204 };
Matthias BUSSONNIER
tweek notebook notification behavior
r8074
NotificationArea.prototype.init_notification_widgets = function() {
Jonathan Frederic
Almost done!...
r17198 var that = this;
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 var knw = this.new_notification_widget('kernel');
Brian E. Granger
Add edit/command mode indicator.
r15115 var $kernel_ind_icon = $("#kernel_indicator_icon");
var $modal_ind_icon = $("#modal_indicator_icon");
// Command/Edit mode
Jonathan Frederic
Almost done!...
r17198 this.events.on('edit_mode.Notebook',function () {
that.save_widget.update_document_title();
Paul Ivanov
rename css class names to be consistent with current style
r15847 $modal_ind_icon.attr('class','edit_mode_icon').attr('title','Edit Mode');
Brian E. Granger
Add edit/command mode indicator.
r15115 });
Jonathan Frederic
Almost done!...
r17198 this.events.on('command_mode.Notebook',function () {
that.save_widget.update_document_title();
Paul Ivanov
rename css class names to be consistent with current style
r15847 $modal_ind_icon.attr('class','command_mode_icon').attr('title','Command Mode');
Brian E. Granger
Add edit/command mode indicator.
r15115 });
Matthias BUSSONNIER
tweek notebook notification behavior
r8074
Paul Ivanov
better fix for starting with Command Mode icon
r15809 // Implicitly start off in Command mode, switching to Edit mode will trigger event
Matthias BUSSONNIER
command_mode_icon typos (dash instead of underscore)
r17433 $modal_ind_icon.attr('class','command_mode_icon').attr('title','Command Mode');
Paul Ivanov
better fix for starting with Command Mode icon
r15809
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 // Kernel events
Jonathan Frederic
Almost done!...
r17198 this.events.on('status_idle.Kernel',function () {
that.save_widget.update_document_title();
Paul Ivanov
rename css class names to be consistent with current style
r15847 $kernel_ind_icon.attr('class','kernel_idle_icon').attr('title','Kernel Idle');
Matthias BUSSONNIER
more subtle kernel indicator...
r15042 });
Matthias BUSSONNIER
tweek notebook notification behavior
r8074
Jonathan Frederic
Almost done!...
r17198 this.events.on('status_busy.Kernel',function () {
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 window.document.title='(Busy) '+window.document.title;
Paul Ivanov
rename css class names to be consistent with current style
r15847 $kernel_ind_icon.attr('class','kernel_busy_icon').attr('title','Kernel Busy');
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 });
Jonathan Frederic
Almost done!...
r17198 this.events.on('status_restarting.Kernel',function () {
that.save_widget.update_document_title();
MinRK
handle new autorestart javascript-side
r10316 knw.set_message("Restarting kernel", 2000);
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 });
MinRK
improve indicators and handling of dead kernels and broken websocket connections...
r17676 this.events.on('status_dead.Kernel',function () {
that.save_widget.update_document_title();
knw.danger("Dead kernel");
$kernel_ind_icon.attr('class','kernel_dead_icon').attr('title','Kernel Dead');
});
Jonathan Frederic
Almost done!...
r17198 this.events.on('status_interrupting.Kernel',function () {
Brian E. Granger
Added platform dep. logic.
r14816 knw.set_message("Interrupting kernel", 2000);
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 });
MinRK
Correct initial state of kernel status indicator...
r15737
// Start the kernel indicator in the busy state, and send a kernel_info request.
// When the kernel_info reply arrives, the kernel is idle.
Paul Ivanov
rename css class names to be consistent with current style
r15847 $kernel_ind_icon.attr('class','kernel_busy_icon').attr('title','Kernel Busy');
MinRK
Correct initial state of kernel status indicator...
r15737
Jonathan Frederic
Almost done!...
r17198 this.events.on('status_started.Kernel', function (evt, data) {
MinRK
improve indicators and handling of dead kernels and broken websocket connections...
r17676 knw.info("Websockets Connected", 500);
that.events.trigger('status_busy.Kernel');
MinRK
Correct initial state of kernel status indicator...
r15737 data.kernel.kernel_info(function () {
Jonathan Frederic
Almost done!...
r17198 that.events.trigger('status_idle.Kernel');
MinRK
Correct initial state of kernel status indicator...
r15737 });
});
Matthias BUSSONNIER
tweek notebook notification behavior
r8074
Jonathan Frederic
Almost done!...
r17198 this.events.on('status_dead.Kernel',function () {
MinRK
bootstrap dialogs
r10895 var msg = 'The kernel has died, and the automatic restart has failed.' +
MinRK
handle new autorestart javascript-side
r10316 ' It is possible the kernel cannot be restarted.' +
' If you are not able to restart the kernel, you will still be able to save' +
' the notebook, but running code will no longer work until the notebook' +
MinRK
bootstrap dialogs
r10895 ' is reopened.';
Jonathan Frederic
Fix imports of "modules",...
r17202 dialog.modal({
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 title: "Dead kernel",
MinRK
bootstrap dialogs
r10895 body : msg,
Jonathan Frederic
Some JS test fixes
r17212 keyboard_manager: that.keyboard_manager,
notebook: that.notebook,
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 buttons : {
MinRK
bootstrap dialogs
r10895 "Manual Restart": {
class: "btn-danger",
click: function () {
Jonathan Frederic
Almost done!...
r17198 that.events.trigger('status_restarting.Kernel');
that.notebook.start_kernel();
MinRK
bootstrap dialogs
r10895 }
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 },
MinRK
bootstrap dialogs
r10895 "Don't restart": {}
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 }
});
});
Jonathan Frederic
Almost done!...
r17198 this.events.on('websocket_closed.Kernel', function (event, data) {
Brian E. Granger
Refactoring WebSocket connection failure logic....
r9222 var kernel = data.kernel;
var ws_url = data.ws_url;
var early = data.early;
var msg;
MinRK
improve indicators and handling of dead kernels and broken websocket connections...
r17676
$kernel_ind_icon
.attr('class', 'kernel_disconnected_icon')
.attr('title', 'No Connection to Kernel');
Brian E. Granger
Refactoring WebSocket connection failure logic....
r9222 if (!early) {
MinRK
improve indicators and handling of dead kernels and broken websocket connections...
r17676 knw.warning('Reconnecting');
Brian E. Granger
Refactoring WebSocket connection failure logic....
r9222 setTimeout(function () {
kernel.start_channels();
}, 5000);
return;
}
Paul Ivanov
rename css class names to be consistent with current style
r15847 console.log('WebSocket connection failed: ', ws_url);
Kieran O'Mahony
Fix error message typo on web socket fail
r14955 msg = "A WebSocket connection could not be established." +
Brian E. Granger
Refactoring WebSocket connection failure logic....
r9222 " You will NOT be able to run code. Check your" +
" network connection or notebook server configuration.";
Jonathan Frederic
Fix imports of "modules",...
r17202 dialog.modal({
Brian E. Granger
Refactoring WebSocket connection failure logic....
r9222 title: "WebSocket connection failed",
MinRK
bootstrap dialogs
r10895 body: msg,
Jonathan Frederic
Some JS test fixes
r17212 keyboard_manager: that.keyboard_manager,
notebook: that.notebook,
Brian E. Granger
Refactoring WebSocket connection failure logic....
r9222 buttons : {
MinRK
bootstrap dialogs
r10895 "OK": {},
"Reconnect": {
click: function () {
MinRK
improve indicators and handling of dead kernels and broken websocket connections...
r17676 knw.warning('Reconnecting');
MinRK
bootstrap dialogs
r10895 setTimeout(function () {
kernel.start_channels();
}, 5000);
}
Brian E. Granger
Refactoring WebSocket connection failure logic....
r9222 }
}
});
});
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 var nnw = this.new_notification_widget('notebook');
// Notebook events
Jonathan Frederic
Almost done!...
r17198 this.events.on('notebook_loading.Notebook', function () {
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 nnw.set_message("Loading notebook",500);
});
Jonathan Frederic
Almost done!...
r17198 this.events.on('notebook_loaded.Notebook', function () {
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 nnw.set_message("Notebook loaded",500);
});
Jonathan Frederic
Almost done!...
r17198 this.events.on('notebook_saving.Notebook', function () {
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 nnw.set_message("Saving notebook",500);
});
Jonathan Frederic
Almost done!...
r17198 this.events.on('notebook_saved.Notebook', function () {
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 nnw.set_message("Notebook saved",2000);
});
Jonathan Frederic
Almost done!...
r17198 this.events.on('notebook_save_failed.Notebook', function (evt, xhr, status, data) {
Matthias BUSSONNIER
Introduce info/warning/danger to notification area...
r17368 nnw.warning(data || "Notebook save failed");
Matthias BUSSONNIER
tweek notebook notification behavior
r8074 });
MinRK
add some checkpoint messages to the notification area
r10502
// Checkpoint events
Jonathan Frederic
Almost done!...
r17198 this.events.on('checkpoint_created.Notebook', function (evt, data) {
MinRK
add some checkpoint messages to the notification area
r10502 var msg = "Checkpoint created";
if (data.last_modified) {
var d = new Date(data.last_modified);
Matthias BUSSONNIER
use momentjs for nice dates
r17474 msg = msg + ": " + moment(d).format("HH:mm:ss");
MinRK
add some checkpoint messages to the notification area
r10502 }
nnw.set_message(msg, 2000);
});
Jonathan Frederic
Almost done!...
r17198 this.events.on('checkpoint_failed.Notebook', function () {
Matthias BUSSONNIER
Introduce info/warning/danger to notification area...
r17368 nnw.warning("Checkpoint failed");
MinRK
add some checkpoint messages to the notification area
r10502 });
Jonathan Frederic
Almost done!...
r17198 this.events.on('checkpoint_deleted.Notebook', function () {
MinRK
add some checkpoint messages to the notification area
r10502 nnw.set_message("Checkpoint deleted", 500);
});
Jonathan Frederic
Almost done!...
r17198 this.events.on('checkpoint_delete_failed.Notebook', function () {
Matthias BUSSONNIER
Introduce info/warning/danger to notification area...
r17368 nnw.warning("Checkpoint delete failed");
MinRK
add some checkpoint messages to the notification area
r10502 });
Jonathan Frederic
Almost done!...
r17198 this.events.on('checkpoint_restoring.Notebook', function () {
MinRK
add some checkpoint messages to the notification area
r10502 nnw.set_message("Restoring to checkpoint...", 500);
});
Jonathan Frederic
Almost done!...
r17198 this.events.on('checkpoint_restore_failed.Notebook', function () {
Matthias BUSSONNIER
Introduce info/warning/danger to notification area...
r17368 nnw.warning("Checkpoint restore failed");
MinRK
add some checkpoint messages to the notification area
r10502 });
Matthias BUSSONNIER
tweek notebook notification behavior
r8074
MinRK
add autosave timer...
r10505 // Autosave events
Jonathan Frederic
Almost done!...
r17198 this.events.on('autosave_disabled.Notebook', function () {
MinRK
add autosave timer...
r10505 nnw.set_message("Autosave disabled", 2000);
});
Jonathan Frederic
Almost done!...
r17198 this.events.on('autosave_enabled.Notebook', function (evt, interval) {
MinRK
add autosave timer...
r10505 nnw.set_message("Saving every " + interval / 1000 + "s", 1000);
});
Matthias BUSSONNIER
jslint 1
r8204 };
Matthias BUSSONNIER
call init method
r8048
Matthias BUSSONNIER
beginning notification area
r8011 IPython.NotificationArea = NotificationArea;
Jonathan Frederic
Return dicts instead of classes,...
r17201 return {'NotificationArea': NotificationArea};
Jonathan Frederic
Almost done!...
r17198 });