浏览代码

Refactor the share link command to separate plugin

This is to allow deployments to customize the link behavior handling by
disabling this plugin and substituting it with another implementation.
Joe Quigley 6 年之前
父节点
当前提交
8db2b13c92
共有 1 个文件被更改,包括 45 次插入19 次删除
  1. 45 19
      packages/filebrowser-extension/src/index.ts

+ 45 - 19
packages/filebrowser-extension/src/index.ts

@@ -103,6 +103,24 @@ const factory: JupyterLabPlugin<IFileBrowserFactory> = {
   requires: [IDocumentManager, IStateDB]
 };
 
+/**
+ * The default file browser share-file plugin
+ *
+ * This extension adds a "Copy Shareable Link" command that generates a copy-
+ * pastable URL. This url can be used to open a particular file in JupyterLab,
+ * handy for emailing links or bookmarking for reference.
+ *
+ * If you need to change how this link is generated (for instance, to copy a
+ * /user-redirect URL for JupyterHub), disable this plugin and replace it
+ * with another implementation.
+ */
+const shareFile: JupyterLabPlugin<void> = {
+  activate: activateShareFile,
+  id: '@jupyterlab/filebrowser-extension:share-file',
+  requires: [IFileBrowserFactory],
+  autoStart: true
+};
+
 /**
  * The file browser namespace token.
  */
@@ -111,7 +129,7 @@ const namespace = 'filebrowser';
 /**
  * Export the plugins as default.
  */
-const plugins: JupyterLabPlugin<any>[] = [factory, browser];
+const plugins: JupyterLabPlugin<any>[] = [factory, browser, shareFile];
 export default plugins;
 
 /**
@@ -208,6 +226,32 @@ function activateBrowser(
   });
 }
 
+function activateShareFile(
+  app: JupyterLab,
+  factory: IFileBrowserFactory
+): void {
+  const { commands } = app;
+  const { tracker } = factory;
+
+  commands.addCommand(CommandIDs.share, {
+    execute: () => {
+      const widget = tracker.currentWidget;
+      if (!widget) {
+        return;
+      }
+      const path = encodeURI(widget.selectedItems().next().path);
+      const tree = PageConfig.getTreeUrl({ workspace: true });
+
+      Clipboard.copyToSystem(URLExt.join(tree, path));
+    },
+    isVisible: () =>
+      tracker.currentWidget &&
+      toArray(tracker.currentWidget.selectedItems()).length === 1,
+    iconClass: 'jp-MaterialIcon jp-LinkIcon',
+    label: 'Copy Shareable Link'
+  });
+}
+
 /**
  * Add the main file browser commands to the application's command registry.
  */
@@ -450,24 +494,6 @@ function addCommands(
     mnemonic: 0
   });
 
-  commands.addCommand(CommandIDs.share, {
-    execute: () => {
-      const widget = tracker.currentWidget;
-      if (!widget) {
-        return;
-      }
-      const path = encodeURI(widget.selectedItems().next().path);
-      const tree = PageConfig.getTreeUrl({ workspace: true });
-
-      Clipboard.copyToSystem(URLExt.join(tree, path));
-    },
-    isVisible: () =>
-      tracker.currentWidget &&
-      toArray(tracker.currentWidget.selectedItems()).length === 1,
-    iconClass: 'jp-MaterialIcon jp-LinkIcon',
-    label: 'Copy Shareable Link'
-  });
-
   commands.addCommand(CommandIDs.copyPath, {
     execute: () => {
       const widget = tracker.currentWidget;