Quellcode durchsuchen

Make the file creator separate from the file browser

Steven Silvester vor 9 Jahren
Ursprung
Commit
64995c92b6

+ 4 - 4
examples/filebrowser/src/index.ts

@@ -10,11 +10,11 @@ import {
 } from 'jupyter-js-services';
 
 import {
-  FileHandler, FileHandlerRegistry
+  FileHandler, FileHandlerRegistry, FileCreator
 } from 'jupyter-js-ui/lib/filehandler';
 
 import {
-  FileBrowserWidget, FileBrowserModel, FileCreator
+  FileBrowserWidget, FileBrowserModel
 } from 'jupyter-js-ui/lib/filebrowser';
 
 import {
@@ -73,8 +73,8 @@ function main(): void {
 
   let fbWidget = new FileBrowserWidget(fbModel, registry);
 
-  let dirCreator = new FileCreator(fbModel, 'directory', fbWidget.node);
-  let fileCreator = new FileCreator(fbModel, 'file', fbWidget.node);
+  let dirCreator = new FileCreator(contentsManager, 'directory', fbWidget.node);
+  let fileCreator = new FileCreator(contentsManager, 'file', fbWidget.node);
   registry.addCreator(
     'New Directory', dirCreator.createNew.bind(dirCreator));
   registry.addCreator('New File', fileCreator.createNew.bind(fileCreator));

+ 24 - 15
src/filebrowser/buttons.ts

@@ -290,25 +290,34 @@ namespace Private {
     let creators = registry.listCreators();
     creators = creators.sort((a, b) => a.localeCompare(b));
     let items: MenuItem[] = [];
-    for (var name of creators) {
-      items.push(new MenuItem({
-        text: name,
-        handler: () => {
-          registry.createNew(name).then(contents => {
-            if (contents === void 0) {
-              return;
-            }
-            if (contents.type !== 'directory') {
-              registry.open(contents);
-            }
-            widget.model.refresh();
-          });
-        }
-      }));
+    for (var text of creators) {
+      items.push(createItem(text, widget));
     }
     return new Menu(items);
   }
 
+  /**
+   * Create a menu item in the dropdown menu.
+   */
+  function createItem(text: string, widget: FileButtons): MenuItem {
+    let registry = widget.registry;
+    let model = widget.model;
+    return new MenuItem({
+      text,
+      handler: () => {
+        registry.createNew(text, model.path).then(contents => {
+          if (contents === void 0) {
+            return;
+          }
+          if (contents.type !== 'directory') {
+            registry.open(contents);
+          }
+          model.refresh();
+        });
+      }
+    });
+  }
+
   /**
    * Upload an array of files to the server.
    */

+ 0 - 1
src/filebrowser/index.ts

@@ -3,5 +3,4 @@
 'use strict';
 
 export * from './browser';
-export * from './creator';
 export * from './model';

+ 20 - 20
src/filebrowser/creator.ts → src/filehandler/creator.ts

@@ -3,40 +3,36 @@
 'use strict';
 
 import {
-  IContentsModel
+  IContentsModel, IContentsManager
 } from 'jupyter-js-services';
 
 import {
   showDialog
 } from '../dialog';
 
-import {
-  FileBrowserModel
-} from './model';
-
 
 /**
- * A class that creates files for a file browser.
+ * A class that creates files for a file registry.
  */
 export
 class FileCreator {
   /**
    * Construct a new file creator.
    */
-  constructor(model: FileBrowserModel, type: string, host?: HTMLElement) {
-    this._model = model;
+  constructor(manager: IContentsManager, type: string, host?: HTMLElement) {
+    this._manager = manager;
     this._host = host || document.body;
     this._type = type;
   }
 
   /**
-   * Get the file browser model used by the creator.
+   * Get the contents manager used by the creator.
    *
    * #### Notes
    * This is a read-only property.
    */
-  get model(): FileBrowserModel {
-    return this._model;
+  get manager(): IContentsManager {
+    return this._manager;
   }
 
   /**
@@ -50,10 +46,10 @@ class FileCreator {
   }
 
   /**
-   * Create a new file object.
+   * Create a new file object in the given directory.
    */
-  createNew(): Promise<IContentsModel> {
-    return this._createUntitled().then(contents => {
+  createNew(path: string): Promise<IContentsModel> {
+    return this._createUntitled(path).then(contents => {
       return this.doRename(contents);
     });
   }
@@ -64,6 +60,7 @@ class FileCreator {
   protected doRename(contents: IContentsModel): Promise<IContentsModel> {
     let edit = document.createElement('input');
     edit.value = contents.name;
+    let dname = contents.path.slice(0, -contents.name.length);
     return showDialog({
       title: `Create a new ${contents.type}`,
       body: edit,
@@ -71,9 +68,9 @@ class FileCreator {
       okText: 'CREATE'
     }).then(value => {
       if (value.text === 'CREATE') {
-        return this.model.rename(contents.path, edit.value);
+        return this._manager.rename(contents.path, `${dname}/${edit.value}`);
       } else {
-        return this.model.delete(contents.path).then(() => void 0);
+        return this._manager.delete(contents.path).then(() => void 0);
       }
     }).catch(error => {
       if (error.statusText === 'Conflict') {
@@ -108,7 +105,7 @@ class FileCreator {
       if (value.text === 'OK') {
         return this.doRename(contents);
       } else {
-        return this._model.delete(contents.path).then(() => void 0);
+        return this._manager.delete(contents.path).then(() => void 0);
       }
     });
   }
@@ -116,11 +113,14 @@ class FileCreator {
   /**
    * Create a new untitled file on the current path.
    */
-  private _createUntitled(): Promise<IContentsModel> {
-    return this.model.newUntitled(this._type);
+  private _createUntitled(path: string): Promise<IContentsModel> {
+    let ext = this._type === 'file' ? '.txt' : '';
+    return this._manager.newUntitled(path, {
+      type: this._type, ext
+    });
   }
 
-  private _model: FileBrowserModel = null;
+  private _manager: IContentsManager = null;
   private _host: HTMLElement = null;
   private _type = 'file';
 }

+ 1 - 0
src/filehandler/index.ts

@@ -3,5 +3,6 @@
 'use strict';
 
 export * from './handler';
+export * from './creator';
 export * from './default';
 export * from './registry';

+ 4 - 4
src/filehandler/registry.ts

@@ -41,7 +41,7 @@ class FileHandlerRegistry {
   /**
    * Add a file creator.
    */
-  addCreator(name: string, handler: () => Promise<IContentsModel>): void {
+  addCreator(name: string, handler: (path: string) => Promise<IContentsModel>): void {
     this._creators[name] = handler;
   }
 
@@ -55,10 +55,10 @@ class FileHandlerRegistry {
   /**
    * Create a new file.
    */
-  createNew(name: string): Promise<IContentsModel> {
+  createNew(name: string, path: string): Promise<IContentsModel> {
     let creator = this._creators[name];
     if (creator) {
-      return creator();
+      return creator(path);
     }
     return Promise.reject(new Error(`No handler named ${name}`));
   }
@@ -164,5 +164,5 @@ class FileHandlerRegistry {
 
   private _handlers: AbstractFileHandler<Widget>[] = [];
   private _default: AbstractFileHandler<Widget> = null;
-  private _creators: { [key: string]: () => Promise<IContentsModel> } = Object.create(null);
+  private _creators: { [key: string]: (path: string) => Promise<IContentsModel> } = Object.create(null);
 }