Skip to content

Commit c84bdfa

Browse files
committed
Double click to rename code snippet #43
1 parent 92da7a6 commit c84bdfa

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

src/CodeSnippetDisplay.tsx

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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 {

src/CodeSnippetWidgetModel.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,19 @@ export class CodeSnippetWidgetModel implements ICodeSnippetWidgetModel {
3333
}
3434
}
3535

36+
renameSnippet(oldName: string, newName: string): void {
37+
for (const snippet of this._snippets) {
38+
if (snippet.name === oldName) {
39+
snippet.name = newName;
40+
CodeSnippetContentsService.getInstance().save(
41+
'snippets/' + snippet.name + '.json',
42+
{ type: 'file', format: 'text', content: JSON.stringify(snippet) }
43+
);
44+
break;
45+
}
46+
}
47+
}
48+
3649
addSnippet(newSnippet: ICodeSnippet, index: number): void {
3750
// append a new snippet created from input form to the end
3851
if (newSnippet.id === -1) {

style/index.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@
6969
background-color: var(--jp-layout-color2);
7070
}
7171

72+
#jp-codeSnippet-rename {
73+
background-color: var(--jp-layout-color2);
74+
border: 1px solid var(--jp-layout-color1);
75+
border-radius: 2px;
76+
font-size: var(--jp-ui-font-size1);
77+
}
78+
7279
.jp-codeSnippet-metadata {
7380
flex-basis: 95%;
7481
width: 100%;

0 commit comments

Comments
 (0)