@@ -2846,7 +2846,96 @@ define([
28462846 this . _checkpoint_after_save = false ;
28472847 }
28482848 } ;
2849-
2849+
2850+ Notebook . prototype . save_notebook_as = function ( ) {
2851+ var that = this ;
2852+ var current_dir = $ ( 'body' ) . attr ( 'data-notebook-path' ) . split ( '/' ) . slice ( 0 , - 1 ) . join ( "/" ) ;
2853+ current_dir = current_dir ? current_dir + "/" : "" ;
2854+ var dialog_body = $ ( '<div/>' ) . append (
2855+ $ ( '<p/>' ) . addClass ( 'save-message' )
2856+ . text ( i18n . msg . _ ( 'Enter a notebook path relative to notebook dir' ) )
2857+ ) . append (
2858+ $ ( '<br/>' )
2859+ ) . append (
2860+ $ ( '<input/>' ) . attr ( 'type' , 'text' ) . attr ( 'size' , '25' )
2861+ . attr ( 'data-testid' , 'save-as' )
2862+ . addClass ( 'form-control' )
2863+ ) ;
2864+
2865+ var d = dialog . modal ( {
2866+ title : 'Save As' ,
2867+ body : dialog_body ,
2868+ keyboard_manager : this . keyboard_manager ,
2869+ notebook : this ,
2870+ buttons : {
2871+ Cancel : { } ,
2872+ Save : {
2873+ class : 'btn-primary' ,
2874+ click : function ( ) {
2875+ var nb_path = d . find ( 'input' ) . val ( ) ;
2876+ var nb_name = nb_path . split ( '/' ) . slice ( - 1 ) . pop ( ) ;
2877+ // If notebook name does not contain extension '.ipynb' add it
2878+ var ext = utils . splitext ( nb_name ) [ 1 ] ;
2879+ if ( ext === '' ) {
2880+ nb_name = nb_name + '.ipynb' ;
2881+ nb_path = nb_path + '.ipynb' ;
2882+ }
2883+ var save_thunk = function ( ) {
2884+ var model = {
2885+ 'type' : 'notebook' ,
2886+ 'content' : that . toJSON ( ) ,
2887+ 'name' : nb_name
2888+ } ;
2889+ return that . contents . save ( nb_path , model )
2890+ . then ( function ( data ) {
2891+ d . modal ( 'hide' ) ;
2892+ that . notebook_name = data . name ;
2893+ that . notebook_path = data . path ;
2894+ that . session . rename_notebook ( data . path ) ;
2895+ that . events . trigger ( 'notebook_renamed.Notebook' , data ) ;
2896+ } , function ( error ) {
2897+ var msg = i18n . msg . _ ( error . message || 'Unknown error saving notebook' ) ;
2898+ $ ( ".save-message" ) . html (
2899+ $ ( "<span>" )
2900+ . attr ( "style" , "color:red;" )
2901+ . text ( msg )
2902+ ) ;
2903+ } ) ;
2904+ } ;
2905+ that . contents . get ( nb_path , { type : 'notebook' , content : false } ) . then ( function ( data ) {
2906+ var warning_body = $ ( '<div/>' ) . append (
2907+ $ ( "<p/>" ) . text ( i18n . msg . _ ( 'Notebook with that name exists.' ) ) ) ;
2908+ dialog . modal ( {
2909+ title : 'Save As' ,
2910+ body : warning_body ,
2911+ buttons : { Cancel : { } ,
2912+ Overwrite : {
2913+ class : 'btn-warning' ,
2914+ click : function ( ) {
2915+ return save_thunk ( ) ;
2916+ }
2917+ }
2918+ }
2919+ } ) ;
2920+ } , function ( err ) {
2921+ return save_thunk ( ) ;
2922+ } ) ;
2923+ return false ;
2924+ }
2925+ } ,
2926+ } ,
2927+ open : function ( ) {
2928+ d . find ( 'input[type="text"]' ) . keydown ( function ( event ) {
2929+ if ( event . which === keyboard . keycodes . enter ) {
2930+ d . find ( '.btn-primary' ) . first ( ) . click ( ) ;
2931+ return false ;
2932+ }
2933+ } ) ;
2934+ d . find ( 'input[type="text"]' ) . val ( current_dir ) . focus ( ) ;
2935+ }
2936+ } ) ;
2937+ } ;
2938+
28502939 /**
28512940 * Update the autosave interval based on the duration of the last save.
28522941 *
@@ -3387,4 +3476,4 @@ define([
33873476 } ;
33883477
33893478 return { Notebook : Notebook } ;
3390- } ) ;
3479+ } ) ;
0 commit comments