notificationarea.js
222 lines
| 8.5 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'); | ||||
Brian E. Granger
|
r15115 | var $kernel_ind_icon = $("#kernel_indicator_icon"); | ||
var $modal_ind_icon = $("#modal_indicator_icon"); | ||||
// Command/Edit mode | ||||
$([IPython.events]).on('edit_mode.Notebook',function () { | ||||
IPython.save_widget.update_document_title(); | ||||
$modal_ind_icon.attr('class','icon-pencil').attr('title','Edit Mode'); | ||||
}); | ||||
$([IPython.events]).on('command_mode.Notebook',function () { | ||||
IPython.save_widget.update_document_title(); | ||||
$modal_ind_icon.attr('class','').attr('title','Command Mode'); | ||||
}); | ||||
Matthias BUSSONNIER
|
r8074 | |||
// Kernel events | ||||
$([IPython.events]).on('status_idle.Kernel',function () { | ||||
IPython.save_widget.update_document_title(); | ||||
Brian E. Granger
|
r15198 | $kernel_ind_icon.attr('class','icon-circle-blank').attr('title','Kernel Idle'); | ||
Matthias BUSSONNIER
|
r15042 | }); | ||
Matthias BUSSONNIER
|
r8074 | |||
$([IPython.events]).on('status_busy.Kernel',function () { | ||||
window.document.title='(Busy) '+window.document.title; | ||||
Brian E. Granger
|
r15198 | $kernel_ind_icon.attr('class','icon-circle').attr('title','Kernel Busy'); | ||
Matthias BUSSONNIER
|
r8074 | }); | ||
$([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 () { | ||||
Brian E. Granger
|
r14816 | knw.set_message("Interrupting kernel", 2000); | ||
Matthias BUSSONNIER
|
r8074 | }); | ||
$([IPython.events]).on('status_dead.Kernel',function () { | ||||
MinRK
|
r10895 | var msg = 'The kernel has died, and the automatic restart has failed.' + | ||
MinRK
|
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
|
r10895 | ' is reopened.'; | ||
IPython.dialog.modal({ | ||||
Matthias BUSSONNIER
|
r8074 | title: "Dead kernel", | ||
MinRK
|
r10895 | body : msg, | ||
Matthias BUSSONNIER
|
r8074 | buttons : { | ||
MinRK
|
r10895 | "Manual Restart": { | ||
class: "btn-danger", | ||||
click: function () { | ||||
$([IPython.events]).trigger('status_restarting.Kernel'); | ||||
IPython.notebook.start_kernel(); | ||||
} | ||||
Matthias BUSSONNIER
|
r8074 | }, | ||
MinRK
|
r10895 | "Don't restart": {} | ||
Matthias BUSSONNIER
|
r8074 | } | ||
}); | ||||
}); | ||||
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) | ||||
Kieran O'Mahony
|
r14955 | msg = "A WebSocket connection could not be established." + | ||
Brian E. Granger
|
r9222 | " You will NOT be able to run code. Check your" + | ||
" network connection or notebook server configuration."; | ||||
MinRK
|
r10895 | IPython.dialog.modal({ | ||
Brian E. Granger
|
r9222 | title: "WebSocket connection failed", | ||
MinRK
|
r10895 | body: msg, | ||
Brian E. Granger
|
r9222 | buttons : { | ||
MinRK
|
r10895 | "OK": {}, | ||
"Reconnect": { | ||||
click: function () { | ||||
knw.set_message('Reconnecting WebSockets', 1000); | ||||
setTimeout(function () { | ||||
kernel.start_channels(); | ||||
}, 5000); | ||||
} | ||||
Brian E. Granger
|
r9222 | } | ||
} | ||||
}); | ||||
}); | ||||
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)); | ||||