// Copyright (c) IPython Development Team. // Distributed under the terms of the Modified BSD License. define([ 'base/js/namespace', 'jquery', 'base/js/utils', 'base/js/dialog', ], function(IPython, $, utils, dialog) { var ContentManager = function(options) { // Constructor // // A contentmanager handles passing file operations // to the back-end. This includes checkpointing // with the normal file operations. // // Parameters: // options: dictionary // Dictionary of keyword arguments. // events: $(Events) instance // base_url: string this.version = 0.1; this.events = options.events; this.base_url = options.base_url; }; /** * Notebook Functions */ /** * Creates a new notebook file at the specified path, and * opens that notebook in a new window. * * @method scroll_to_cell * @param {String} path The path to create the new notebook at */ ContentManager.prototype.new_notebook = function(path) { var base_url = this.base_url; var settings = { processData : false, cache : false, type : "POST", dataType : "json", async : false, success : function (data, status, xhr){ var notebook_name = data.name; window.open( utils.url_join_encode( base_url, 'notebooks', path, notebook_name ), '_blank' ); }, error : function(xhr, status, error) { utils.log_ajax_error(xhr, status, error); var msg; if (xhr.responseJSON && xhr.responseJSON.message) { msg = xhr.responseJSON.message; } else { msg = xhr.statusText; } dialog.modal({ title : 'Creating Notebook Failed', body : "The error was: " + msg, buttons : {'OK' : {'class' : 'btn-primary'}} }); } }; var url = utils.url_join_encode( base_url, 'api/notebooks', path ); $.ajax(url,settings); }; ContentManager.prototype.delete_notebook = function(name, path) { var settings = { processData : false, cache : false, type : "DELETE", 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( this.base_url, 'api/notebooks', path, name ); $.ajax(url, settings); }; 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", contentType: 'application/json', 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( this.base_url, 'api/notebooks', path, name ); $.ajax(url, 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 = { 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. var settings = { processData : false, cache : false, type : "PUT", data : JSON.stringify(model), contentType: 'application/json', 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]; } } var url = utils.url_join_encode( this.base_url, 'api/notebooks', path, name ); $.ajax(url, settings); }; /** * Checkpointing Functions */ ContentManager.prototype.save_checkpoint = function() { // This is not necessary - integrated into save }; ContentManager.prototype.restore_checkpoint = function(notebook, id) { that = notebook; this.events.trigger('notebook_restoring.Notebook', checkpoint); var url = utils.url_join_encode( this.base_url, 'api/notebooks', this.notebook_path, this.notebook_name, 'checkpoints', checkpoint ); $.post(url).done( $.proxy(that.restore_checkpoint_success, that) ).fail( $.proxy(that.restore_checkpoint_error, that) ); }; ContentManager.prototype.list_checkpoints = function(notebook) { that = notebook; var url = utils.url_join_encode( that.base_url, 'api/notebooks', that.notebook_path, that.notebook_name, 'checkpoints' ); $.get(url).done( $.proxy(that.list_checkpoints_success, that) ).fail( $.proxy(that.list_checkpoints_error, that) ); }; /** * File management functions */ /** * List notebooks and directories at a given path * * On success, load_callback is called with an array of dictionaries * representing individual files or directories. Each dictionary has * the keys: * type: "notebook" or "directory" * name: the name of the file or directory * created: created date * last_modified: last modified dat * path: the path * @method list_notebooks * @param {String} path The path to list notebooks in * @param {Function} load_callback called with list of notebooks on success * @param {Function} error_callback called with ajax results on error */ ContentManager.prototype.list_contents = function(path, load_callback, error_callback) { var that = this; var settings = { processData : false, cache : false, type : "GET", dataType : "json", success : load_callback, error : error_callback }; var url = utils.url_join_encode(this.base_url, 'api', 'notebooks', path); $.ajax(url, settings); } IPython.ContentManager = ContentManager; return {'ContentManager': ContentManager}; });