Skip to content

Commit 907185b

Browse files
committed
Handle duplicate snippet name
1 parent b837718 commit 907185b

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

src/CodeSnippetDisplay.tsx

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -327,9 +327,9 @@ export class CodeSnippetDisplay extends React.Component<
327327

328328
// rename snippet on double click
329329
// TODO: duplicate name check!
330-
private handleRenameSnippet(
330+
private async handleRenameSnippet(
331331
event: React.MouseEvent<HTMLSpanElement, MouseEvent>
332-
): void {
332+
): Promise<void> {
333333
const contentsService = CodeSnippetContentsService.getInstance();
334334
console.log(event.currentTarget);
335335
console.log(event.target);
@@ -339,28 +339,38 @@ export class CodeSnippetDisplay extends React.Component<
339339
const new_element = document.createElement('input');
340340
new_element.setAttribute('type', 'text');
341341
new_element.id = 'jp-codeSnippet-rename';
342-
// new_element.innerHTML = target.innerHTML;
342+
new_element.innerHTML = target.innerHTML;
343343

344344
target.replaceWith(new_element);
345345
new_element.value = target.innerHTML;
346346

347347
new_element.focus();
348348
new_element.setSelectionRange(0, new_element.value.length);
349349

350-
new_element.onblur = (): void => {
351-
new_element.replaceWith(target);
352-
350+
new_element.onblur = async (): Promise<void> => {
351+
console.log(target.innerHTML);
352+
console.log(new_element.value);
353353
if (target.innerHTML !== new_element.value) {
354354
const newPath = 'snippets/' + new_element.value + '.json';
355-
356-
contentsService.rename(oldPath, newPath);
355+
try {
356+
await contentsService.rename(oldPath, newPath);
357+
} catch (error) {
358+
new_element.replaceWith(target);
359+
360+
await showDialog({
361+
title: 'Duplicate Name of Code Snippet',
362+
body: <p> {`"${newPath}" already exists.`} </p>,
363+
buttons: [Dialog.okButton({ label: 'Dismiss' })]
364+
});
365+
return;
366+
}
357367
this.props._codeSnippetWidgetModel.renameSnippet(
358368
target.innerHTML,
359369
new_element.value
360370
);
361-
362371
target.innerHTML = new_element.value;
363372
}
373+
new_element.replaceWith(target);
364374
};
365375
new_element.onkeydown = (event: KeyboardEvent): void => {
366376
switch (event.code) {

style/index.css

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
text-overflow: ellipsis;
4343
color: var(--jp-ui-font-color0);
4444
display: flex;
45+
align-items: center;
4546
}
4647

4748
.jp-codeSnippetsContainer-button {
@@ -72,8 +73,10 @@
7273
#jp-codeSnippet-rename {
7374
background-color: var(--jp-layout-color2);
7475
border: 1px solid var(--jp-layout-color1);
75-
border-radius: 2px;
76+
border-radius: 4px;
7677
font-size: var(--jp-ui-font-size1);
78+
box-sizing: border-box;
79+
margin: 0px;
7780
}
7881

7982
.jp-codeSnippet-metadata {

0 commit comments

Comments
 (0)