Jelajahi Sumber

Implement file creation with name prompt

Steven Silvester 9 tahun lalu
induk
melakukan
cdd41d3391
1 mengubah file dengan 72 tambahan dan 6 penghapusan
  1. 72 6
      src/filebrowser/buttons.ts

+ 72 - 6
src/filebrowser/buttons.ts

@@ -265,11 +265,14 @@ namespace Private {
   }
 
   /**
-   * Create a new untitled file.
+   * Create a new source file.
    */
   export
   function createNewFile(widget: FileButtons): void {
-    widget.model.newUntitled('file').then(contents => {
+    createFile(widget, 'file').then(contents => {
+      if (contents === void 0) {
+        return;
+      }
       widget.model.refresh().then(() => widget.model.open(contents.name));
     }).catch(error => {
       utils.showErrorMessage(widget, 'New File Error', error);
@@ -277,11 +280,14 @@ namespace Private {
   }
 
   /**
-   * Create a new untitled folder.
+   * Create a new folder.
    */
   export
   function createNewFolder(widget: FileButtons): void {
-    widget.model.newUntitled('directory').then(contents => {
+    createFile(widget, 'directory').then(contents => {
+      if (contents === void 0) {
+        return;
+      }
       widget.model.refresh();
     }).catch(error => {
       utils.showErrorMessage(widget, 'New Folder Error', error);
@@ -289,20 +295,80 @@ namespace Private {
   }
 
   /**
-   * Create a new untitled notebook.
+   * Create a new  notebook.
    */
   export
   function createNewNotebook(widget: FileButtons, spec: IKernelSpecId): void {
-    widget.model.newUntitled('notebook').then(contents => {
+    createFile(widget, 'notebook').then(contents => {
       let started = widget.model.startSession(contents.path, spec.name);
       return started.then(() => contents);
     }).then(contents => {
+      if (contents === void 0) {
+        return;
+      }
       widget.model.refresh().then(() => widget.model.open(contents.name));
     }).catch(error => {
       utils.showErrorMessage(widget, 'New Notebook Error', error);
     });
   }
 
+  /**
+   * Create a new file, prompting the user for a name.
+   */
+  function createFile(widget: FileButtons, type: string): Promise<IContentsModel> {
+    return widget.model.newUntitled(type).then(contents => {
+      return doRename(widget, contents);
+    });
+  }
+
+  /**
+   * Rename a file or directory.
+   */
+  function doRename(widget: FileButtons, contents: IContentsModel): Promise<IContentsModel> {
+    var edit = document.createElement('input');
+    edit.value = contents.name;
+    let index = edit.value.lastIndexOf('.');
+    if (index === -1) {
+      edit.setSelectionRange(0, edit.value.length);
+    } else {
+      edit.setSelectionRange(0, index);
+    }
+    return showDialog({
+      title: `Create a new ${contents.type}`,
+      body: edit,
+      host: widget.node.parentElement
+    }).then(value => {
+      if (value.text === 'OK') {
+        return widget.model.rename(contents.path, edit.value);
+      } else {
+        return widget.model.delete(contents.path).then(() => void 0);
+      }
+    }).catch(error => {
+      if (error.statusText === 'Conflict') {
+        return handleExisting(widget, edit.value, contents);
+      } 
+      return utils.showErrorMessage(widget, 'File creation error', error).then(
+        () => { return void 0 });
+    });
+  }
+
+  /**
+   * Handle an existing file name.
+   */
+  function handleExisting(widget: FileButtons, name: string, contents: IContentsModel): Promise<IContentsModel> {
+    return showDialog({
+      title: 'File already exists',
+      body: `File "${name}" already exists, try again?`,
+      host: widget.node.parentElement
+    }).then(value => {
+      if (value.text === 'OK') {
+        return doRename(widget, contents);
+      } else {
+        return widget.model.delete(contents.path).then(() => void 0);
+      }
+    });
+  }
+
   /**
    * Create a new dropdown menu for the create new button.
    */