define([ 'jquery', 'base/js/namespace', 'base/js/dialog', 'base/js/events', 'base/js/utils', 'require', ], function( $, Jupyter, dialog, events, utils, require ) { "use strict"; //========================================================================== var appmode_unload_handler = function (e) { var nb = Jupyter.notebook; var url_parts = [nb.base_url, 'apps', nb.notebook_path]; var url = utils.url_path_join.apply(null, url_parts); // tell server to clean up session, kernel, and tmp notebook file. utils.ajax(url, {cache: false, type: "DELETE", async: false}); }; //========================================================================== var kernel_busy_handler = function (e) { $('#appmode-busy').css('visibility', 'visible'); } //========================================================================== var kernel_idle_handler = function (e) { $('#appmode-busy').css('visibility', 'hidden'); } //========================================================================== function goto_app_mode() { // kill Jupyter session Jupyter.notebook.session.delete(); // build new URL var base_url = Jupyter.notebook.base_url; var prefix = base_url+"notebooks/" var path = window.location.pathname.substring(prefix.length); var search = window.location.search; var scroll = "appmode_scroll=" + $('#site').scrollTop(); if (search.search(/appmode_scroll=\d+/) != -1){ search = search.replace(/appmode_scroll=\d+/g, scroll); }else if (search.length == 0) { search = "?" + scroll; } else { search += "&" + scroll; } // goto new URL window.location.href = base_url + "apps/" + path + search; } //========================================================================== function goto_normal_mode() { // build new URL var base_url = Jupyter.notebook.base_url; var prefix = base_url+"apps/" var path = window.location.pathname.substring(prefix.length); var new_url = base_url + "notebooks/" + path + window.location.search; // goto new URL // Not using location.pathname as it might urlencode the path again window.location.href = new_url; } //========================================================================== function kernel_inject_url(kernel) { kernel.execute("jupyter_notebook_url = '" + window.location + "'"); } //========================================================================== function initialize_step1() { if (Jupyter.notebook && Jupyter.notebook._fully_loaded) { initialize_step2(); }else{ events.one('notebook_loaded.Notebook', initialize_step2); } } //========================================================================== function initialize_step2() { // scroll to last position if in normal mode var base_url = Jupyter.notebook.base_url; if(window.location.pathname.startsWith(base_url+"notebooks/")){ var url = window.location.href; var m = url.match(/appmode_scroll=(\d+)/); if(m) $('#site').scrollTop(m[1]); } var nb = Jupyter.notebook; if(nb.kernel && nb.kernel.info_reply.status) { initialize_step3(); }else{ events.one('kernel_ready.Kernel', initialize_step3); } } //========================================================================== function initialize_step3() { kernel_inject_url(Jupyter.notebook.kernel); // run kernel_inject_url() again when a new kernel is created events.on('kernel_created.Kernel kernel_created.Session', function(event, data) { kernel_inject_url(data.kernel); }); var base_url = Jupyter.notebook.base_url; if(window.location.pathname.startsWith(base_url+"apps/")){ // appmode is active -> continue intializtion initialize_step4(); } } //========================================================================== function initialize_step4() { // install unload-handler window.onbeforeunload = appmode_unload_handler; // disable autosave Jupyter.notebook.set_autosave_interval(0); // disable keyboard shortcuts Jupyter.keyboard_manager.command_shortcuts.clear_shortcuts(); Jupyter.keyboard_manager.edit_shortcuts.clear_shortcuts(); // disable editing of text cells $('.text_cell').off("dblclick"); // disable editing of raw cells $('.CodeMirror').each(function() { this.CodeMirror.setOption('readOnly', "nocursor"); }); // register kernel events events.on('kernel_idle.Kernel', kernel_idle_handler); events.on('kernel_busy.Kernel', kernel_busy_handler); // register on_click handler $('#appmode-leave').click(goto_normal_mode); // clear all cell outputs persisted in the initial notebook Jupyter.notebook.clear_all_output(); // try to load the jupyter-js-widgets extension to see if it's installed utils.load_extension('jupyter-js-widgets/extension').then(function(module) { // force the extension to initialize if it exists, even if it's a repeat // operation, to avoid a race condition with executing cells that contain // widgets module.load_ipython_extension().then(initialize_step5); }).catch(initialize_step5); } //========================================================================== function initialize_step5() { // hide loading screen $('#appmode-loader').slideUp(); // execute all cells Jupyter.notebook.execute_all_cells(); console.log("Appmode: initialization finished"); }; //========================================================================== var load_ipython_extension = function() { // add button to toolbar in case appmode is not enabled Jupyter.toolbar.add_buttons_group([{ id : 'toggle_codecells', label : 'Appmode', icon : 'fa-arrows-alt', callback : goto_app_mode }]); initialize_step1(); }; //========================================================================== return { load_ipython_extension : load_ipython_extension }; });