diff --git a/IPython/html/static/notebook/js/main.js b/IPython/html/static/notebook/js/main.js index ec25f23..999c01d 100644 --- a/IPython/html/static/notebook/js/main.js +++ b/IPython/html/static/notebook/js/main.js @@ -46,16 +46,23 @@ function (marked) { $('#ipython-main-app').addClass('border-box-sizing'); $('div#notebook_panel').addClass('border-box-sizing'); - var baseProjectUrl = $('body').data('baseProjectUrl') + var baseProjectUrl = $('body').data('baseProjectUrl'); + var notebookPath = $('body').data('notebookPath'); + var notebookName = $('body').data('notebookName'); + notebookName = decodeURIComponent(notebookName); + console.log(notebookName); + if (notebookPath == 'None'){ + notebookPath = ""; + } IPython.page = new IPython.Page(); IPython.layout_manager = new IPython.LayoutManager(); IPython.pager = new IPython.Pager('div#pager', 'div#pager_splitter'); IPython.quick_help = new IPython.QuickHelp(); IPython.login_widget = new IPython.LoginWidget('span#login_widget',{baseProjectUrl:baseProjectUrl}); - IPython.notebook = new IPython.Notebook('div#notebook',{baseProjectUrl:baseProjectUrl}); + IPython.notebook = new IPython.Notebook('div#notebook',{baseProjectUrl:baseProjectUrl, notebookPath:notebookPath, notebookName:notebookName}); IPython.save_widget = new IPython.SaveWidget('span#save_widget'); - IPython.menubar = new IPython.MenuBar('#menubar',{baseProjectUrl:baseProjectUrl}) + IPython.menubar = new IPython.MenuBar('#menubar',{baseProjectUrl:baseProjectUrl, notebookPath: notebookPath}) IPython.toolbar = new IPython.MainToolBar('#maintoolbar-container') IPython.tooltip = new IPython.Tooltip() IPython.notification_area = new IPython.NotificationArea('#notification_area') @@ -91,7 +98,7 @@ function (marked) { $([IPython.events]).on('notebook_loaded.Notebook', first_load); $([IPython.events]).trigger('app_initialized.NotebookApp'); - IPython.notebook.load_notebook($('body').data('notebookId')); + IPython.notebook.load_notebook(notebookName, notebookPath); if (marked) { marked.setOptions({ diff --git a/IPython/html/static/notebook/js/menubar.js b/IPython/html/static/notebook/js/menubar.js index fee79d6..ea1fc27 100644 --- a/IPython/html/static/notebook/js/menubar.js +++ b/IPython/html/static/notebook/js/menubar.js @@ -50,7 +50,10 @@ var IPython = (function (IPython) { return this._baseProjectUrl || $('body').data('baseProjectUrl'); }; - + MenuBar.prototype.notebookPath = function(){ + return this._notebookPath || $('body').data('notebookPath'); + }; + MenuBar.prototype.style = function () { this.element.addClass('border-box-sizing'); this.element.find("li").click(function (event, ui) { @@ -66,38 +69,68 @@ var IPython = (function (IPython) { MenuBar.prototype.bind_events = function () { // File var that = this; - this.element.find('#new_notebook').click(function () { - window.open(that.baseProjectUrl()+'new'); - }); - this.element.find('#open_notebook').click(function () { - window.open(that.baseProjectUrl()); - }); + if (this.notebookPath() != 'None') { + this.element.find('#new_notebook').click(function () { + window.open(that.baseProjectUrl() + 'notebooks/' + that.notebookPath() +'/new'); + }); + this.element.find('#open_notebook').click(function () { + window.open(that.baseProjectUrl() + 'tree/' + that.notebookPath()); + }); + this.element.find('#copy_notebook').click(function () { + var notebook_name = IPython.notebook.get_notebook_name(); + var url = that.baseProjectUrl() + 'notebooks/' + that.notebookPath() + '/'+ notebook_name + '/copy'; + window.open(url,'_blank'); + return false; + }); + this.element.find('#download_ipynb').click(function () { + var notebook_name = IPython.notebook.get_notebook_name(); + var url = that.baseProjectUrl() + 'api/notebooks/' + + notebook_name + '?format=json'; + window.location.assign(url); + }); + this.element.find('#download_py').click(function () { + var notebook_name = IPython.notebook.get_notebook_name(); + var url = that.baseProjectUrl() + 'api/notebooks/' + + notebook_name + '?format=py'; + window.location.assign(url); + }); + } + else { + this.element.find('#new_notebook').click(function () { + window.open(that.baseProjectUrl()+'notebooks/new'); + }); + this.element.find('#open_notebook').click(function () { + window.open(that.baseProjectUrl() + 'tree'); + }); + this.element.find('#copy_notebook').click(function () { + var notebook_name = IPython.notebook.get_notebook_name(); + var url = that.baseProjectUrl() + 'notebooks/' + notebook_name + '/copy'; + window.open(url,'_blank'); + return false; + }); + this.element.find('#download_ipynb').click(function () { + var notebook_name = IPython.notebook.get_notebook_name(); + var url = that.baseProjectUrl() + 'api/notebooks/' + + notebook_name + '?format=json'; + window.location.assign(url); + }); + this.element.find('#download_py').click(function () { + var notebook_name = IPython.notebook.get_notebook_name(); + var url = that.baseProjectUrl() + 'api/notebooks/' + + notebook_name + '?format=py'; + window.location.assign(url); + }); + + + } this.element.find('#rename_notebook').click(function () { IPython.save_widget.rename_notebook(); }); - this.element.find('#copy_notebook').click(function () { - var notebook_id = IPython.notebook.get_notebook_id(); - var url = that.baseProjectUrl() + notebook_id + '/copy'; - window.open(url,'_blank'); - return false; - }); this.element.find('#save_checkpoint').click(function () { IPython.notebook.save_checkpoint(); }); this.element.find('#restore_checkpoint').click(function () { }); - this.element.find('#download_ipynb').click(function () { - var notebook_id = IPython.notebook.get_notebook_id(); - var url = that.baseProjectUrl() + 'notebooks/' + - notebook_id + '?format=json'; - window.location.assign(url); - }); - this.element.find('#download_py').click(function () { - var notebook_id = IPython.notebook.get_notebook_id(); - var url = that.baseProjectUrl() + 'notebooks/' + - notebook_id + '?format=py'; - window.location.assign(url); - }); this.element.find('#kill_and_exit').click(function () { IPython.notebook.kernel.kill(); setTimeout(function(){window.close();}, 200); diff --git a/IPython/html/static/notebook/js/notebook.js b/IPython/html/static/notebook/js/notebook.js index 2392690..068098e 100644 --- a/IPython/html/static/notebook/js/notebook.js +++ b/IPython/html/static/notebook/js/notebook.js @@ -26,12 +26,13 @@ var IPython = (function (IPython) { var Notebook = function (selector, options) { var options = options || {}; this._baseProjectUrl = options.baseProjectUrl; - + this.notebook_path = options.notebookPath; + this.notebook_name = options.notebookName; this.element = $(selector); this.element.scroll(); this.element.data("notebook", this); this.next_prompt_number = 1; - this.kernel = null; + this.session = null; this.clipboard = null; this.undelete_backup = null; this.undelete_index = null; @@ -49,7 +50,6 @@ var IPython = (function (IPython) { // single worksheet for now this.worksheet_metadata = {}; this.control_key_active = false; - this.notebook_id = null; this.notebook_name = null; this.notebook_name_blacklist_re = /[\/\\:]/; this.nbformat = 3 // Increment this when changing the nbformat @@ -78,6 +78,18 @@ var IPython = (function (IPython) { return this._baseProjectUrl || $('body').data('baseProjectUrl'); }; + Notebook.prototype.notebookPath = function() { + var path = $('body').data('notebookPath'); + if (path != 'None') { + if (path[path.length-1] != '/') { + path = path.substring(0,path.length); + }; + return path; + } else { + return ''; + } + }; + /** * Create an HTML and CSS representation of the notebook. * @@ -745,7 +757,7 @@ var IPython = (function (IPython) { var i = this.index_or_selected(index); var cell = this.get_selected_cell(); this.undelete_backup = cell.toJSON(); - $('#undelete_cell').removeClass('disabled'); + $('#undelete_cell').removeClass('ui-state-disabled'); if (this.is_valid_cell_index(i)) { var ce = this.get_cell_element(i); ce.remove(); @@ -1028,11 +1040,11 @@ var IPython = (function (IPython) { Notebook.prototype.enable_paste = function () { var that = this; if (!this.paste_enabled) { - $('#paste_cell_replace').removeClass('disabled') + $('#paste_cell_replace').removeClass('ui-state-disabled') .on('click', function () {that.paste_cell_replace();}); - $('#paste_cell_above').removeClass('disabled') + $('#paste_cell_above').removeClass('ui-state-disabled') .on('click', function () {that.paste_cell_above();}); - $('#paste_cell_below').removeClass('disabled') + $('#paste_cell_below').removeClass('ui-state-disabled') .on('click', function () {that.paste_cell_below();}); this.paste_enabled = true; }; @@ -1045,9 +1057,9 @@ var IPython = (function (IPython) { */ Notebook.prototype.disable_paste = function () { if (this.paste_enabled) { - $('#paste_cell_replace').addClass('disabled').off('click'); - $('#paste_cell_above').addClass('disabled').off('click'); - $('#paste_cell_below').addClass('disabled').off('click'); + $('#paste_cell_replace').addClass('ui-state-disabled').off('click'); + $('#paste_cell_above').addClass('ui-state-disabled').off('click'); + $('#paste_cell_below').addClass('ui-state-disabled').off('click'); this.paste_enabled = false; }; }; @@ -1146,7 +1158,7 @@ var IPython = (function (IPython) { this.undelete_backup = null; this.undelete_index = null; } - $('#undelete_cell').addClass('disabled'); + $('#undelete_cell').addClass('ui-state-disabled'); } // Split/merge @@ -1370,50 +1382,20 @@ var IPython = (function (IPython) { this.get_selected_cell().toggle_line_numbers(); }; - // Kernel related things + // Session related things /** - * Start a new kernel and set it on each code cell. + * Start a new session and set it on each code cell. * - * @method start_kernel + * @method start_session */ - Notebook.prototype.start_kernel = function () { - var base_url = $('body').data('baseKernelUrl') + "kernels"; - this.kernel = new IPython.Kernel(base_url); - this.kernel.start({notebook: this.notebook_id}); - // Now that the kernel has been created, tell the CodeCells about it. - var ncells = this.ncells(); - for (var i=0; i<ncells; i++) { - var cell = this.get_cell(i); - if (cell instanceof IPython.CodeCell) { - cell.set_kernel(this.kernel) - }; - }; + Notebook.prototype.start_session = function () { + var notebook_info = this.notebookPath() + this.notebook_name; + console.log(notebook_info) + this.session = new IPython.Session(notebook_info, this); + this.session.start(); }; - /** - * Prompt the user to restart the IPython kernel. - * - * @method restart_kernel - */ - Notebook.prototype.restart_kernel = function () { - var that = this; - IPython.dialog.modal({ - title : "Restart kernel or continue running?", - body : $("<p/>").html( - 'Do you want to restart the current kernel? You will lose all variables defined in it.' - ), - buttons : { - "Continue running" : {}, - "Restart" : { - "class" : "btn-danger", - "click" : function() { - that.kernel.restart(); - } - } - } - }); - }; /** * Run the selected cell. @@ -1548,6 +1530,7 @@ var IPython = (function (IPython) { * @param {Object} data JSON representation of a notebook */ Notebook.prototype.fromJSON = function (data) { + data = data.content; var ncells = this.ncells(); var i; for (i=0; i<ncells; i++) { @@ -1556,7 +1539,7 @@ var IPython = (function (IPython) { }; // Save the metadata and name. this.metadata = data.metadata; - this.notebook_name = data.metadata.name; + this.notebook_name = data.metadata.name +'.ipynb'; // Only handle 1 worksheet for now. var worksheet = data.worksheets[0]; if (worksheet !== undefined) { @@ -1671,7 +1654,12 @@ var IPython = (function (IPython) { error : $.proxy(this.save_notebook_error, this) }; $([IPython.events]).trigger('notebook_saving.Notebook'); - var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id; + if (this.notebook_path != "") { + var url = this.baseProjectUrl() + 'api/notebooks/' + this.notebook_path+ this.notebook_name; + } + else { + var url = this.baseProjectUrl() + 'api/notebooks/' +this.notebook_name; + } $.ajax(url, settings); }; @@ -1730,24 +1718,25 @@ var IPython = (function (IPython) { * Request a notebook's data from the server. * * @method load_notebook - * @param {String} notebook_id A notebook to load - */ - Notebook.prototype.load_notebook = function (notebook_id) { - var that = this; - this.notebook_id = notebook_id; - // We do the call with settings so we can set cache to false. - var settings = { - processData : false, - cache : false, - type : "GET", - dataType : "json", - success : $.proxy(this.load_notebook_success,this), - error : $.proxy(this.load_notebook_error,this), - }; - $([IPython.events]).trigger('notebook_loading.Notebook'); - var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id; - $.ajax(url, settings); - }; + * @param {String} notebook_naem and path A notebook to load + */ + Notebook.prototype.load_notebook = function (notebook_name, notebook_path) { + var that = this; + this.notebook_name = notebook_name; + this.notebook_path = notebook_path; + // We do the call with settings so we can set cache to false. + var settings = { + processData : false, + cache : false, + type : "GET", + dataType : "json", + success : $.proxy(this.load_notebook_success,this), + error : $.proxy(this.load_notebook_error,this), + }; + $([IPython.events]).trigger('notebook_loading.Notebook'); + var url = this.baseProjectUrl() + 'api/notebooks/' + this.notebook_path + this.notebook_name; + $.ajax(url, settings); + }; /** * Success callback for loading a notebook from the server. @@ -1803,12 +1792,13 @@ var IPython = (function (IPython) { } - // Create the kernel after the notebook is completely loaded to prevent + // Create the session after the notebook is completely loaded to prevent // code execution upon loading, which is a security risk. - this.start_kernel(); + if (this.session == null) { + this.start_session(this.notebook_path); + } // load our checkpoint list IPython.notebook.list_checkpoints(); - $([IPython.events]).trigger('notebook_loaded.Notebook'); }; @@ -1876,14 +1866,19 @@ var IPython = (function (IPython) { * * @method list_checkpoints */ - Notebook.prototype.list_checkpoints = function () { - var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints'; - $.get(url).done( - $.proxy(this.list_checkpoints_success, this) - ).fail( - $.proxy(this.list_checkpoints_error, this) - ); - }; + Notebook.prototype.list_checkpoints = function () { + if (this.notebook_path != "") { + var url = this.baseProjectUrl() + 'api/notebooks/' + this.notebook_path+ this.notebook_name + '/checkpoints'; + } + else { + var url = this.baseProjectUrl() + 'api/notebooks/' +this.notebook_name + '/checkpoints'; + } + $.get(url).done( + $.proxy(this.list_checkpoints_success, this) + ).fail( + $.proxy(this.list_checkpoints_error, this) + ); + }; /** * Success callback for listing checkpoints. @@ -1921,14 +1916,19 @@ var IPython = (function (IPython) { * * @method create_checkpoint */ - Notebook.prototype.create_checkpoint = function () { - var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints'; - $.post(url).done( - $.proxy(this.create_checkpoint_success, this) - ).fail( - $.proxy(this.create_checkpoint_error, this) - ); - }; + Notebook.prototype.create_checkpoint = function () { + if (this.notebook_path != "") { + var url = this.baseProjectUrl() + 'api/notebooks/' + this.notebook_path + this.notebook_name + '/checkpoints'; + } + else { + var url = this.baseProjectUrl() + 'api/notebooks/' +this.notebook_name + '/checkpoints'; + } + $.post(url).done( + $.proxy(this.create_checkpoint_success, this) + ).fail( + $.proxy(this.create_checkpoint_error, this) + ); + }; /** * Success callback for creating a checkpoint. @@ -2003,7 +2003,12 @@ var IPython = (function (IPython) { */ Notebook.prototype.restore_checkpoint = function (checkpoint) { $([IPython.events]).trigger('checkpoint_restoring.Notebook', checkpoint); - var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints/' + checkpoint; + if (this.notebook_path != "") { + var url = this.baseProjectUrl() + 'api/notebooks/' + this.notebook_path + this.notebook_name + '/checkpoints/' + checkpoint; + } + else { + var url = this.baseProjectUrl() + 'api/notebooks/' +this.notebook_name + '/checkpoints/' + checkpoint; + } $.post(url).done( $.proxy(this.restore_checkpoint_success, this) ).fail( @@ -2021,7 +2026,7 @@ var IPython = (function (IPython) { */ Notebook.prototype.restore_checkpoint_success = function (data, status, xhr) { $([IPython.events]).trigger('checkpoint_restored.Notebook'); - this.load_notebook(this.notebook_id); + this.load_notebook(this.notebook_name, this.notebook_path); }; /** @@ -2043,8 +2048,13 @@ var IPython = (function (IPython) { * @param {String} checkpoint ID */ Notebook.prototype.delete_checkpoint = function (checkpoint) { - $([IPython.events]).trigger('checkpoint_deleting.Notebook', checkpoint); - var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints/' + checkpoint; + $([IPython.events]).trigger('checkpoint_restoring.Notebook', checkpoint); + if (this.notebook_path != "") { + var url = this.baseProjectUrl() + 'api/notebooks/' + this.notebook_path + this.notebook_name + '/checkpoints/' + checkpoint; + } + else { + var url = this.baseProjectUrl() + 'api/notebooks/' +this.notebook_name + '/checkpoints/' + checkpoint; + } $.ajax(url, { type: 'DELETE', success: $.proxy(this.delete_checkpoint_success, this), @@ -2062,7 +2072,7 @@ var IPython = (function (IPython) { */ Notebook.prototype.delete_checkpoint_success = function (data, status, xhr) { $([IPython.events]).trigger('checkpoint_deleted.Notebook', data); - this.load_notebook(this.notebook_id); + this.load_notebook(this.notebook_name, this.notebook_path); }; /**