@@ -2846,7 +2846,96 @@ define([
2846
2846
this . _checkpoint_after_save = false ;
2847
2847
}
2848
2848
} ;
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
+
2850
2939
/**
2851
2940
* Update the autosave interval based on the duration of the last save.
2852
2941
*
@@ -3387,4 +3476,4 @@ define([
3387
3476
} ;
3388
3477
3389
3478
return { Notebook : Notebook } ;
3390
- } ) ;
3479
+ } ) ;
0 commit comments