@@ -168,6 +168,7 @@ export class CodeSnippetDisplay extends React.Component<
168168 this . _dragData = null ;
169169 this . handleDragMove = this . handleDragMove . bind ( this ) ;
170170 this . _evtMouseUp = this . _evtMouseUp . bind ( this ) ;
171+ this . handleRenameSnippet = this . handleRenameSnippet . bind ( this ) ;
171172 }
172173
173174 // Handle code snippet insert into an editor
@@ -321,9 +322,75 @@ export class CodeSnippetDisplay extends React.Component<
321322 ) ;
322323 }
323324 }
324- return < span > { name } </ span > ;
325+ return < span onDoubleClick = { this . handleRenameSnippet } > { name } </ span > ;
325326 } ;
326327
328+ // rename snippet on double click
329+ // TODO: duplicate name check!
330+ private handleRenameSnippet (
331+ event : React . MouseEvent < HTMLSpanElement , MouseEvent >
332+ ) : void {
333+ const contentsService = CodeSnippetContentsService . getInstance ( ) ;
334+ console . log ( event . currentTarget ) ;
335+ console . log ( event . target ) ;
336+ const target = event . target as HTMLElement ;
337+ const oldPath = 'snippets/' + target . innerHTML + '.json' ;
338+
339+ const new_element = document . createElement ( 'input' ) ;
340+ new_element . setAttribute ( 'type' , 'text' ) ;
341+ new_element . id = 'jp-codeSnippet-rename' ;
342+ // new_element.innerHTML = target.innerHTML;
343+
344+ target . replaceWith ( new_element ) ;
345+ new_element . value = target . innerHTML ;
346+
347+ new_element . focus ( ) ;
348+ new_element . setSelectionRange ( 0 , new_element . value . length ) ;
349+
350+ new_element . onblur = ( ) : void => {
351+ if ( target . innerHTML !== new_element . value ) {
352+ const newPath = 'snippets/' + new_element . value + '.json' ;
353+
354+ new_element . replaceWith ( target ) ;
355+
356+ contentsService . rename ( oldPath , newPath ) ;
357+ this . props . _codeSnippetWidgetModel . renameSnippet (
358+ target . innerHTML ,
359+ new_element . value
360+ ) ;
361+
362+ target . innerHTML = new_element . value ;
363+ }
364+ } ;
365+ new_element . onkeydown = ( event : KeyboardEvent ) : void => {
366+ switch ( event . code ) {
367+ case 'Enter' || 'NumpadEnter' : // Enter
368+ event . stopPropagation ( ) ;
369+ event . preventDefault ( ) ;
370+ new_element . blur ( ) ;
371+ break ;
372+ case 'Escape' : // Escape
373+ event . stopPropagation ( ) ;
374+ event . preventDefault ( ) ;
375+ new_element . blur ( ) ;
376+ break ;
377+ case 'ArrowUp' : // Up arrow
378+ event . stopPropagation ( ) ;
379+ event . preventDefault ( ) ;
380+ new_element . selectionStart = new_element . selectionEnd = 0 ;
381+ break ;
382+ case 'ArrowDown' : // Down arrow
383+ event . stopPropagation ( ) ;
384+ event . preventDefault ( ) ;
385+ new_element . selectionStart = new_element . selectionEnd =
386+ new_element . value . length ;
387+ break ;
388+ default :
389+ break ;
390+ }
391+ } ;
392+ }
393+
327394 private handleDragSnippet (
328395 event : React . MouseEvent < HTMLDivElement , MouseEvent >
329396 ) : void {
0 commit comments