Skip to content

Commit

Permalink
Merge pull request ipython#2 from KesterTong/drive
Browse files Browse the repository at this point in the history
Uses events to signal between ContentManager and other classes
  • Loading branch information
jhemmelg committed Jul 26, 2014
2 parents 82bd2b8 + 01bfdca commit f7d9191
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 49 deletions.
72 changes: 42 additions & 30 deletions IPython/html/static/base/js/contentmanager.js
Expand Up @@ -74,58 +74,66 @@ define([
$.ajax(url,settings);
};

ContentManager.prototype.delete_notebook = function(name, path, base_url) {
ContentManager.prototype.delete_notebook = function(name, path) {
var settings = {
processData : false,
cache : false,
type : "DELETE",
dataType: "json",
error : utils.log_ajax_error,
dataType : "json",
success : $.proxy(this.events.trigger, this.events,
'notebook_deleted.ContentManager',
{
name: name,
path: path
}),
error : utils.log_ajax_error
};
var url = utils.url_join_encode(
base_url,
this.base_url,
'api/notebooks',
path,
name
);
$.ajax(url, settings);
};

ContentManager.prototype.rename_notebook = function(notebook, nbname) {
var that = notebook;
if (!nbname.match(/\.ipynb$/)) {
nbname = nbname + ".ipynb";
}
var data = {name: nbname};
ContentManager.prototype.rename_notebook = function(path, name, new_name) {
var that = this;
var data = {name: new_name};
var settings = {
processData : false,
cache : false,
type : "PATCH",
data : JSON.stringify(data),
dataType: "json",
headers : {'Content-Type': 'application/json'},
success : $.proxy(that.rename_success, that),
error : $.proxy(that.rename_error, that)
};
this.events.trigger('rename_notebook.Notebook', data);
success : function (json, status, xhr) {
that.events.trigger('notebook_rename_success.ContentManager',
json);
},
error : function (xhr, status, error) {
that.events.trigger('notebook_rename_error.ContentManager',
[xhr, status, error]);
}
}
var url = utils.url_join_encode(
that.base_url,
this.base_url,
'api/notebooks',
that.notebook_path,
that.notebook_name
path,
name
);
$.ajax(url, settings);
};

ContentManager.prototype.save_notebook = function(notebook, extra_settings) {
ContentManager.prototype.save_notebook = function(path, name, content,
extra_settings) {
var that = notebook;
// Create a JSON model to be sent to the server.
var model = {};
model.name = notebook.notebook_name;
model.path = notebook.notebook_path;
model.content = notebook.toJSON();
model.content.nbformat = notebook.nbformat;
model.content.nbformat_minor = notebook.nbformat_minor;
var model = {
name : name,
path : path,
content : content
};
// time the ajax call for autosave tuning purposes.
var start = new Date().getTime();
// We do the call with settings so we can set cache to false.
Expand All @@ -135,20 +143,24 @@ define([
type : "PUT",
data : JSON.stringify(model),
headers : {'Content-Type': 'application/json'},
success : $.proxy(notebook.save_notebook_success, that, start),
error : $.proxy(notebook.save_notebook_error, that)
success : $.proxy(this.events.trigger, this.events,
'notebook_save_success.ContentManager',
$.extend(model, { start : start })),
error : function (xhr, status, error) {
that.events.trigger('notebook_save_error.ContentManager',
[xhr, status, error, model]);
}
};
if (extra_settings) {
for (var key in extra_settings) {
settings[key] = extra_settings[key];
}
}
notebook.events.trigger('notebook_saving.Notebook');
var url = utils.url_join_encode(
notebook.base_url,
this.base_url,
'api/notebooks',
notebook.notebook_path,
notebook.notebook_name
path,
name
);
$.ajax(url, settings);
};
Expand Down
60 changes: 43 additions & 17 deletions IPython/html/static/notebook/js/notebook.js
Expand Up @@ -46,6 +46,7 @@ define([
// Dictionary of keyword arguments.
// events: $(Events) instance
// keyboard_manager: KeyboardManager instance
// content_manager: ContentManager instance
// save_widget: SaveWidget instance
// config: dictionary
// base_url : string
Expand Down Expand Up @@ -171,6 +172,26 @@ define([
Notebook.prototype.bind_events = function () {
var that = this;

this.content_manager.events.on('notebook_rename_success.ContentManager',
function (event, data) {
var name = that.notebook_name = data.name;
var path = data.path;
that.session.rename_notebook(name, path);
that.events.trigger('notebook_renamed.Notebook', data);
});

this.content_manager.events.on('notebook_rename_error.ContentManager',
function (event, data) {
that.rename_error(data[0], data[1], data[2]);
});

this.content_manager.events.on('notebook_save_success.ContentManager',
$.proxy(this.save_notebook_success, this));

this.content_manager.events.on('notebook_save_error.ContentManager',
$.proxy(this.events.trigger, this.events,
'notebook_save_failed.Notebook'));

this.events.on('set_next_input.Notebook', function (event, data) {
var index = that.find_cell_index(data.cell);
var new_cell = that.insert_cell_below('code',index);
Expand Down Expand Up @@ -1840,22 +1861,28 @@ define([
* @method save_notebook
*/
Notebook.prototype.save_notebook = function (extra_settings) {
this.content_manager.save_notebook(this, extra_settings);
var content = $.extend(this.toJSON(), {
nbformat : this.nbformat,
nbformat_minor : this.nbformat_minor
})
this.content_manager.save_notebook(this.notebook_path,
this.notebook_name,
content,
extra_settings);
};

/**
* Success callback for saving a notebook.
*
* @method save_notebook_success
* @param {Integer} start the time when the save request started
* @param {Object} data JSON representation of a notebook
* @param {String} status Description of response status
* @param {jqXHR} xhr jQuery Ajax object
* @param {Event} event The save notebook success event
* @param {Object} data dictionary of event data
* data.options start the time when the save request started
*/
Notebook.prototype.save_notebook_success = function (start, data, status, xhr) {
Notebook.prototype.save_notebook_success = function (event, data) {
this.set_dirty(false);
this.events.trigger('notebook_saved.Notebook');
this._update_autosave_interval(start);
this._update_autosave_interval(event.start);
if (this._checkpoint_after_save) {
this.create_checkpoint();
this._checkpoint_after_save = false;
Expand Down Expand Up @@ -1974,18 +2001,17 @@ define([
};

Notebook.prototype.rename = function (nbname) {
this.content_manager.rename_notebook(this, nbname);
};
if (!nbname.match(/\.ipynb$/)) {
nbname = nbname + ".ipynb";
}

Notebook.prototype.delete = function () {
this.content_manager.delete_notebook(this.notebook_name, this.notebook_path, this.base_url);
this.content_manager.rename_notebook(this.notebook_path,
this.notebook_name, nbname);
};

Notebook.prototype.rename_success = function (json, status, xhr) {
var name = this.notebook_name = json.name;
var path = json.path;
this.session.rename_notebook(name, path);
this.events.trigger('notebook_renamed.Notebook', json);
Notebook.prototype.delete = function () {
this.content_manager.delete_notebook(this.notebook_name,
this.notebook_path);
};

Notebook.prototype.rename_error = function (xhr, status, error) {
Expand All @@ -2005,7 +2031,7 @@ define([
"OK": {
class: "btn-primary",
click: function () {
this.save_widget.rename_notebook({notebook:that});
that.save_widget.rename_notebook({notebook:that});
}}
},
open : function (event, ui) {
Expand Down
19 changes: 17 additions & 2 deletions IPython/html/static/tree/js/notebooklist.js
Expand Up @@ -20,6 +20,7 @@ define([
// element_name: string
// base_url: string
// notebook_path: string
// content_manager: ContentManager instance
var that = this;
this.session_list = options.session_list;
// allow code re-use by just changing element_name in kernellist.js
Expand All @@ -39,6 +40,21 @@ define([
this.session_list.events.on('sessions_loaded.Dashboard',
function(e, d) { that.sessions_loaded(d); });
}


if (this.content_manager && this.content_manager.events) {
this.content_manager.events.on('notebook_deleted.ContentManager',
function(e, d) {
// Remove the deleted notebook.
$( ":data(nbname)" ).each(function() {
var element = $( this );
if (element.data( "nbname" ) == d.name &&
element.data( "path" ) == d.path) {
element.remove();
}
});
});
}
};

NotebookList.prototype.style = function () {
Expand Down Expand Up @@ -310,7 +326,6 @@ define([
var parent_item = that.parents('div.list_item');
var nbname = parent_item.data('nbname');
var path = parent_item.data('path');
var base_url = utils.get_body_data("baseUrl");
var message = 'Are you sure you want to permanently delete the notebook: ' + nbname + '?';
dialog.modal({
title : "Delete notebook",
Expand All @@ -319,7 +334,7 @@ define([
Delete : {
class: "btn-danger",
click: function() {
notebooklist.content_manager.delete_notebook(nbname, path, base_url);
notebooklist.content_manager.delete_notebook(nbname, path);
}
},
Cancel : {}
Expand Down

0 comments on commit f7d9191

Please sign in to comment.