notificationarea.js
221 lines
| 8.3 KiB
| application/javascript
|
JavascriptLexer
Matthias BUSSONNIER
|
r8011 | //---------------------------------------------------------------------------- | ||
// Copyright (C) 2012 The IPython Development Team | ||||
// | ||||
// Distributed under the terms of the BSD License. The full license is in | ||||
// the file COPYING, distributed as part of this software. | ||||
//---------------------------------------------------------------------------- | ||||
//============================================================================ | ||||
// Notification widget | ||||
//============================================================================ | ||||
var IPython = (function (IPython) { | ||||
"use strict"; | ||||
var utils = IPython.utils; | ||||
var NotificationArea = function (selector) { | ||||
this.selector = selector; | ||||
if (this.selector !== undefined) { | ||||
this.element = $(selector); | ||||
} | ||||
Matthias BUSSONNIER
|
r8074 | this.widget_dict = {}; | ||
Matthias BUSSONNIER
|
r8011 | }; | ||
NotificationArea.prototype.temp_message = function (msg, timeout, css_class) { | ||||
var uuid = utils.uuid(); | ||||
Matthias BUSSONNIER
|
r8204 | if( css_class == 'danger') {css_class = 'ui-state-error';} | ||
if( css_class == 'warning') {css_class = 'ui-state-highlight';} | ||||
Matthias BUSSONNIER
|
r8011 | var tdiv = $('<div>') | ||
.attr('id',uuid) | ||||
Matthias BUSSONNIER
|
r8074 | .addClass('notification_widget ui-widget ui-widget-content ui-corner-all') | ||
Matthias BUSSONNIER
|
r8011 | .addClass('border-box-sizing') | ||
.addClass(css_class) | ||||
.hide() | ||||
.text(msg); | ||||
$(this.selector).append(tdiv); | ||||
Matthias BUSSONNIER
|
r8012 | var tmout = Math.max(1500,(timeout||1500)); | ||
Matthias BUSSONNIER
|
r8011 | tdiv.fadeIn(100); | ||
setTimeout(function () { | ||||
tdiv.fadeOut(100, function () {tdiv.remove();}); | ||||
Matthias BUSSONNIER
|
r8204 | }, tmout); | ||
Matthias BUSSONNIER
|
r8011 | }; | ||
Matthias BUSSONNIER
|
r8204 | NotificationArea.prototype.widget = function(name) { | ||
if(this.widget_dict[name] == undefined) { | ||||
return this.new_notification_widget(name); | ||||
Matthias BUSSONNIER
|
r8074 | } | ||
Mikhail Korobov
|
r8839 | return this.get_widget(name); | ||
Matthias BUSSONNIER
|
r8204 | }; | ||
Matthias BUSSONNIER
|
r8074 | |||
NotificationArea.prototype.get_widget = function(name) { | ||||
Matthias BUSSONNIER
|
r8204 | if(this.widget_dict[name] == undefined) { | ||
Matthias BUSSONNIER
|
r8074 | throw('no widgets with this name'); | ||
} | ||||
return this.widget_dict[name]; | ||||
Matthias BUSSONNIER
|
r8204 | }; | ||
Matthias BUSSONNIER
|
r8074 | |||
Matthias BUSSONNIER
|
r8048 | NotificationArea.prototype.new_notification_widget = function(name) { | ||
Matthias BUSSONNIER
|
r8204 | if(this.widget_dict[name] != undefined) { | ||
Matthias BUSSONNIER
|
r8074 | throw('widget with that name already exists ! '); | ||
} | ||||
Matthias BUSSONNIER
|
r8048 | var div = $('<div/>').attr('id','notification_'+name); | ||
Matthias BUSSONNIER
|
r8204 | $(this.selector).append(div); | ||
this.widget_dict[name] = new IPython.NotificationWidget('#notification_'+name); | ||||
Matthias BUSSONNIER
|
r8074 | return this.widget_dict[name]; | ||
Matthias BUSSONNIER
|
r8204 | }; | ||
Matthias BUSSONNIER
|
r8074 | |||
NotificationArea.prototype.init_notification_widgets = function() { | ||||
var knw = this.new_notification_widget('kernel'); | ||||
// Kernel events | ||||
$([IPython.events]).on('status_idle.Kernel',function () { | ||||
IPython.save_widget.update_document_title(); | ||||
knw.set_message('Kernel Idle',200); | ||||
} | ||||
); | ||||
$([IPython.events]).on('status_busy.Kernel',function () { | ||||
window.document.title='(Busy) '+window.document.title; | ||||
knw.set_message("Kernel busy"); | ||||
}); | ||||
$([IPython.events]).on('status_restarting.Kernel',function () { | ||||
IPython.save_widget.update_document_title(); | ||||
MinRK
|
r10316 | knw.set_message("Restarting kernel", 2000); | ||
Matthias BUSSONNIER
|
r8074 | }); | ||
$([IPython.events]).on('status_interrupting.Kernel',function () { | ||||
knw.set_message("Interrupting kernel"); | ||||
}); | ||||
$([IPython.events]).on('status_dead.Kernel',function () { | ||||
var dialog = $('<div/>'); | ||||
MinRK
|
r10316 | dialog.html('The kernel has died, and the automatic restart has failed.' + | ||
' 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' + | ||||
Brian E. Granger
|
r9222 | ' is reopened.' | ||
); | ||||
Matthias BUSSONNIER
|
r8074 | $(document).append(dialog); | ||
dialog.dialog({ | ||||
resizable: false, | ||||
modal: true, | ||||
title: "Dead kernel", | ||||
Brian E. Granger
|
r9222 | close: function(event, ui) {$(this).dialog('destroy').remove();}, | ||
Matthias BUSSONNIER
|
r8074 | buttons : { | ||
MinRK
|
r10316 | "Manual Restart": function () { | ||
Matthias BUSSONNIER
|
r8074 | $([IPython.events]).trigger('status_restarting.Kernel'); | ||
IPython.notebook.start_kernel(); | ||||
$(this).dialog('close'); | ||||
}, | ||||
Brian E. Granger
|
r9222 | "Don't restart": function () { | ||
Matthias BUSSONNIER
|
r8074 | $(this).dialog('close'); | ||
} | ||||
} | ||||
}); | ||||
}); | ||||
Brian E. Granger
|
r9222 | $([IPython.events]).on('websocket_closed.Kernel', function (event, data) { | ||
var kernel = data.kernel; | ||||
var ws_url = data.ws_url; | ||||
var early = data.early; | ||||
var msg; | ||||
if (!early) { | ||||
knw.set_message('Reconnecting WebSockets', 1000); | ||||
setTimeout(function () { | ||||
kernel.start_channels(); | ||||
}, 5000); | ||||
return; | ||||
} | ||||
console.log('WebSocket connection failed: ', ws_url) | ||||
msg = "A WebSocket connection to could not be established." + | ||||
" You will NOT be able to run code. Check your" + | ||||
" network connection or notebook server configuration."; | ||||
var dialog = $('<div/>'); | ||||
dialog.html(msg); | ||||
$(document).append(dialog); | ||||
dialog.dialog({ | ||||
resizable: false, | ||||
modal: true, | ||||
title: "WebSocket connection failed", | ||||
closeText: "", | ||||
close: function(event, ui) {$(this).dialog('destroy').remove();}, | ||||
buttons : { | ||||
"OK": function () { | ||||
$(this).dialog('close'); | ||||
}, | ||||
"Reconnect": function () { | ||||
knw.set_message('Reconnecting WebSockets', 1000); | ||||
setTimeout(function () { | ||||
kernel.start_channels(); | ||||
}, 5000); | ||||
$(this).dialog('close'); | ||||
} | ||||
} | ||||
}); | ||||
}); | ||||
Matthias BUSSONNIER
|
r8074 | var nnw = this.new_notification_widget('notebook'); | ||
// Notebook events | ||||
$([IPython.events]).on('notebook_loading.Notebook', function () { | ||||
nnw.set_message("Loading notebook",500); | ||||
}); | ||||
$([IPython.events]).on('notebook_loaded.Notebook', function () { | ||||
nnw.set_message("Notebook loaded",500); | ||||
}); | ||||
$([IPython.events]).on('notebook_saving.Notebook', function () { | ||||
nnw.set_message("Saving notebook",500); | ||||
}); | ||||
$([IPython.events]).on('notebook_saved.Notebook', function () { | ||||
nnw.set_message("Notebook saved",2000); | ||||
}); | ||||
$([IPython.events]).on('notebook_save_failed.Notebook', function () { | ||||
nnw.set_message("Notebook save failed"); | ||||
}); | ||||
MinRK
|
r10502 | |||
// Checkpoint events | ||||
$([IPython.events]).on('checkpoint_created.Notebook', function (evt, data) { | ||||
var msg = "Checkpoint created"; | ||||
if (data.last_modified) { | ||||
var d = new Date(data.last_modified); | ||||
msg = msg + ": " + d.format("HH:MM:ss"); | ||||
} | ||||
nnw.set_message(msg, 2000); | ||||
}); | ||||
$([IPython.events]).on('checkpoint_failed.Notebook', function () { | ||||
nnw.set_message("Checkpoint failed"); | ||||
}); | ||||
$([IPython.events]).on('checkpoint_deleted.Notebook', function () { | ||||
nnw.set_message("Checkpoint deleted", 500); | ||||
}); | ||||
$([IPython.events]).on('checkpoint_delete_failed.Notebook', function () { | ||||
nnw.set_message("Checkpoint delete failed"); | ||||
}); | ||||
$([IPython.events]).on('checkpoint_restoring.Notebook', function () { | ||||
nnw.set_message("Restoring to checkpoint...", 500); | ||||
}); | ||||
$([IPython.events]).on('checkpoint_restore_failed.Notebook', function () { | ||||
nnw.set_message("Checkpoint restore failed"); | ||||
}); | ||||
Matthias BUSSONNIER
|
r8074 | |||
MinRK
|
r10505 | // Autosave events | ||
$([IPython.events]).on('autosave_disabled.Notebook', function () { | ||||
nnw.set_message("Autosave disabled", 2000); | ||||
}); | ||||
$([IPython.events]).on('autosave_enabled.Notebook', function (evt, interval) { | ||||
nnw.set_message("Saving every " + interval / 1000 + "s", 1000); | ||||
}); | ||||
Matthias BUSSONNIER
|
r8204 | }; | ||
Matthias BUSSONNIER
|
r8048 | |||
Matthias BUSSONNIER
|
r8011 | IPython.NotificationArea = NotificationArea; | ||
return IPython; | ||||
}(IPython)); | ||||