diff --git a/IPython/frontend/html/notebook/handlers.py b/IPython/frontend/html/notebook/handlers.py index 92752a555..bc5dc9e1f 100644 --- a/IPython/frontend/html/notebook/handlers.py +++ b/IPython/frontend/html/notebook/handlers.py @@ -591,7 +591,10 @@ class NotebookRootHandler(AuthenticatedHandler): @authenticate_unless_readonly def get(self): nbm = self.application.notebook_manager + km = self.application.kernel_manager files = nbm.list_notebooks() + for f in files : + f['kernel_id'] = km.kernel_for_notebook(f['notebook_id']) self.finish(jsonapi.dumps(files)) @web.authenticated diff --git a/IPython/frontend/html/notebook/static/css/alternateuploadform.css b/IPython/frontend/html/notebook/static/css/alternateuploadform.css new file mode 100644 index 000000000..72dbb870a --- /dev/null +++ b/IPython/frontend/html/notebook/static/css/alternateuploadform.css @@ -0,0 +1,23 @@ +/* We need an invisible input field on top of the sentense*/ +/* "Drag file onto the list ..." */ + +.alternate_upload +{ + background-color:none; + display: inline; +} + +.alternate_upload.form +{ + padding: 0; + margin:0; +} + +.alternate_upload input.fileinput +{ + background-color:red; + position:relative; + opacity: 0; + z-index: 2; + width: 447px; +} diff --git a/IPython/frontend/html/notebook/static/js/menubar.js b/IPython/frontend/html/notebook/static/js/menubar.js index e7da9208f..a809cfd15 100644 --- a/IPython/frontend/html/notebook/static/js/menubar.js +++ b/IPython/frontend/html/notebook/static/js/menubar.js @@ -68,6 +68,10 @@ var IPython = (function (IPython) { this.element.find('button#print_notebook').click(function () { IPython.print_widget.print_notebook(); }); + this.element.find('#kill_and_exit').click(function () { + IPython.notebook.kernel.kill(); + setTimeout(function(){window.close();}, 200); + }); // Edit this.element.find('#cut_cell').click(function () { IPython.notebook.cut_cell(); diff --git a/IPython/frontend/html/notebook/static/js/notebooklist.js b/IPython/frontend/html/notebook/static/js/notebooklist.js index a7e98ee64..436325c7b 100644 --- a/IPython/frontend/html/notebook/static/js/notebooklist.js +++ b/IPython/frontend/html/notebook/static/js/notebooklist.js @@ -43,33 +43,44 @@ var IPython = (function (IPython) { this.element.bind('dragover', function () { return false; }); - this.element.bind('drop', function (event) { - var files = event.originalEvent.dataTransfer.files; - for (var i = 0, f; f = files[i]; i++) { - var reader = new FileReader(); - reader.readAsText(f); - var fname = f.name.split('.'); - var nbname = fname.slice(0,-1).join('.'); - var nbformat = fname.slice(-1)[0]; - if (nbformat === 'ipynb') {nbformat = 'json';}; - if (nbformat === 'py' || nbformat === 'json') { - var item = that.new_notebook_item(0); - that.add_name_input(nbname, item); - item.data('nbformat', nbformat); - // Store the notebook item in the reader so we can use it later - // to know which item it belongs to. - $(reader).data('item', item); - reader.onload = function (event) { - var nbitem = $(event.target).data('item'); - that.add_notebook_data(event.target.result, nbitem); - that.add_upload_button(nbitem); - }; - }; - } + this.element.bind('drop', function(event){ + that.handelFilesUpload(event,'drop'); return false; }); }; + NotebookList.prototype.handelFilesUpload = function(event, dropOrForm) { + var that = this; + var files; + if(dropOrForm =='drop'){ + files = event.originalEvent.dataTransfer.files; + } else + { + files = event.originalEvent.target.files + } + for (var i = 0, f; f = files[i]; i++) { + var reader = new FileReader(); + reader.readAsText(f); + var fname = f.name.split('.'); + var nbname = fname.slice(0,-1).join('.'); + var nbformat = fname.slice(-1)[0]; + if (nbformat === 'ipynb') {nbformat = 'json';}; + if (nbformat === 'py' || nbformat === 'json') { + var item = that.new_notebook_item(0); + that.add_name_input(nbname, item); + item.data('nbformat', nbformat); + // Store the notebook item in the reader so we can use it later + // to know which item it belongs to. + $(reader).data('item', item); + reader.onload = function (event) { + var nbitem = $(event.target).data('item'); + that.add_notebook_data(event.target.result, nbitem); + that.add_upload_button(nbitem); + }; + }; + } + return false; + }; NotebookList.prototype.clear_list = function () { this.element.children('.list_item').remove(); @@ -77,7 +88,6 @@ var IPython = (function (IPython) { NotebookList.prototype.load_list = function () { - this.clear_list(); var settings = { processData : false, cache : false, @@ -92,15 +102,30 @@ var IPython = (function (IPython) { NotebookList.prototype.list_loaded = function (data, status, xhr) { var len = data.length; - // Todo: remove old children + this.clear_list(); + + if(len == 0) + { + $(this.new_notebook_item(0)) + .append( + $('
') + .text('Notebook list empty.') + ) + } + for (var i=0; i