[ARVADOS-WORKBENCH2] created: 1.3.0-128-g0a9fd3e

Git user git at public.curoverse.com
Wed Dec 12 12:46:28 EST 2018


        at  0a9fd3e65e852b2e27f7051736f10fa81a73ba5d (commit)


commit 0a9fd3e65e852b2e27f7051736f10fa81a73ba5d
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Dec 12 18:46:19 2018 +0100

    Add FileViewerActions to file's context menu
    
    Feature #13540
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts b/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts
index b556489..94f702e 100644
--- a/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts
+++ b/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts
@@ -6,6 +6,7 @@ import { ContextMenuActionSet } from "../context-menu-action-set";
 import { RenameIcon, RemoveIcon } from "~/components/icon/icon";
 import { DownloadCollectionFileAction } from "../actions/download-collection-file-action";
 import { openFileRemoveDialog, openRenameFileDialog } from '~/store/collection-panel/collection-panel-files/collection-panel-files-actions';
+import { FileViewerActions } from '~/views-components/context-menu/actions/file-viewer-actions';
 
 
 export const collectionFilesItemActionSet: ContextMenuActionSet = [[{
@@ -23,4 +24,7 @@ export const collectionFilesItemActionSet: ContextMenuActionSet = [[{
     execute: (dispatch, resource) => {
         dispatch<any>(openFileRemoveDialog(resource.uuid));
     }
+}], [{
+    component: FileViewerActions,
+    execute: () => { return; },
 }]];

commit 701e59342c16c23f8ee16c1ef92ee2ca6c416c0a
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Dec 12 18:45:52 2018 +0100

    Create FileViewerActions component
    
    Feature #13540
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/views-components/context-menu/actions/file-viewer-actions.tsx b/src/views-components/context-menu/actions/file-viewer-actions.tsx
new file mode 100644
index 0000000..868769d
--- /dev/null
+++ b/src/views-components/context-menu/actions/file-viewer-actions.tsx
@@ -0,0 +1,71 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import * as React from "react";
+import { ListItemText, ListItem, ListItemIcon } from "@material-ui/core";
+import { RootState } from '~/store/store';
+import { getNodeValue } from '~/models/tree';
+import { CollectionDirectory, CollectionFile, CollectionFileType } from '~/models/collection-file';
+import { FileViewerList, FileViewer } from '~/models/file-viewers-config';
+import { getFileViewers } from '~/store/file-viewers/file-viewers-selectors';
+import { connect } from 'react-redux';
+
+interface FileViewerActionProps {
+    fileUrl: string;
+    viewers: FileViewerList;
+}
+
+const mapStateToProps = (state: RootState): FileViewerActionProps => {
+    const { resource } = state.contextMenu;
+    if (resource) {
+        const file = getNodeValue(resource.uuid)(state.collectionPanelFiles);
+        if (file) {
+            const fileViewers = getFileViewers(state.properties);
+            return {
+                fileUrl: file.url,
+                viewers: fileViewers.filter(enabledViewers(file)),
+            };
+        }
+    }
+    return {
+        fileUrl: '',
+        viewers: [],
+    };
+};
+
+const enabledViewers = (file: CollectionFile | CollectionDirectory) =>
+    ({ extensions, collections }: FileViewer) => {
+        if (collections && file.type === CollectionFileType.DIRECTORY) {
+            return true;
+        } else if (extensions) {
+            return extensions.some(extension => file.name.endsWith(extension));
+        } else {
+            return true;
+        }
+    };
+
+const fillViewerUrl = (fileUrl: string, { url, filePathParam }: FileViewer) => {
+    const viewerUrl = new URL(url);
+    viewerUrl.searchParams.append(filePathParam, fileUrl);
+    return viewerUrl.href;
+};
+
+export const FileViewerActions = connect(mapStateToProps)(
+    ({ fileUrl, viewers, onClick }: FileViewerActionProps & { onClick: () => void }) =>
+        <>
+            {viewers.map(viewer =>
+                <a
+                    key={viewer.name}
+                    style={{ textDecoration: 'none' }}
+                    href={fillViewerUrl(fileUrl, viewer)}
+                    onClick={onClick}
+                    target='_blank'>
+                    <ListItem button>
+                        <ListItemText>
+                            {viewer.name}
+                        </ListItemText>
+                    </ListItem>
+                </a>
+            )}
+        </>);

commit f96610d3846dac93bfdfdb3ba329c40f66435281
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Dec 12 18:02:11 2018 +0100

    Dispatch loadFileViewersConfig from workbench
    
    Feature #13540
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/index.tsx b/src/index.tsx
index e73f08c..55d0b48 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -57,6 +57,7 @@ import { userActionSet } from '~/views-components/context-menu/action-sets/user-
 import { computeNodeActionSet } from '~/views-components/context-menu/action-sets/compute-node-action-set';
 import { apiClientAuthorizationActionSet } from '~/views-components/context-menu/action-sets/api-client-authorization-action-set';
 import { linkActionSet } from '~/views-components/context-menu/action-sets/link-action-set';
+import { loadFileViewersConfig } from '~/store/file-viewers/file-viewers-actions';
 
 console.log(`Starting arvados [${getBuildInfo()}]`);
 
@@ -102,6 +103,7 @@ fetchConfig()
         store.dispatch(setCurrentTokenDialogApiHost(apiHost));
         store.dispatch(setUuidPrefix(config.uuidPrefix));
         store.dispatch(loadVocabulary);
+        store.dispatch(loadFileViewersConfig);
 
         const TokenComponent = (props: any) => <ApiToken authService={services.authService} {...props} />;
         const MainPanelComponent = (props: any) => <MainPanel {...props} />;

commit 4105d31a5aba13507832d6c86c0154116d857ea5
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Dec 12 18:01:50 2018 +0100

    Handle  errors while fetching fileViewersConfig
    
    Feature #13540
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/store/file-viewers/file-viewers-actions.ts b/src/store/file-viewers/file-viewers-actions.ts
index d31c85e..44bfd2f 100644
--- a/src/store/file-viewers/file-viewers-actions.ts
+++ b/src/store/file-viewers/file-viewers-actions.ts
@@ -5,11 +5,17 @@
 import { Dispatch } from 'redux';
 import { ServiceRepository } from '~/services/services';
 import { propertiesActions } from '~/store/properties/properties-actions';
-import { FILE_VIEWERS_PROPERTY_NAME } from '~/store/file-viewers/file-viewers-selectors';
+import { FILE_VIEWERS_PROPERTY_NAME, DEFAULT_FILE_VIEWERS } from '~/store/file-viewers/file-viewers-selectors';
+import { FileViewerList } from '~/models/file-viewers-config';
 
 export const loadFileViewersConfig = async (dispatch: Dispatch, _: {}, { fileViewersConfig }: ServiceRepository) => {
-
-    const config = await fileViewersConfig.get();
+    
+    let config: FileViewerList;
+    try{
+        config = await fileViewersConfig.get();
+    } catch (e){
+        config = DEFAULT_FILE_VIEWERS;
+    }
 
     dispatch(propertiesActions.SET_PROPERTY({
         key: FILE_VIEWERS_PROPERTY_NAME,

commit 48eb2deb49b06521ab6cf899ac25a544fcd6702e
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Dec 12 17:46:33 2018 +0100

    Create actions and selectors for file viewers
    
    Feature #13540
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/store/file-viewers/file-viewers-actions.ts b/src/store/file-viewers/file-viewers-actions.ts
new file mode 100644
index 0000000..d31c85e
--- /dev/null
+++ b/src/store/file-viewers/file-viewers-actions.ts
@@ -0,0 +1,19 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { Dispatch } from 'redux';
+import { ServiceRepository } from '~/services/services';
+import { propertiesActions } from '~/store/properties/properties-actions';
+import { FILE_VIEWERS_PROPERTY_NAME } from '~/store/file-viewers/file-viewers-selectors';
+
+export const loadFileViewersConfig = async (dispatch: Dispatch, _: {}, { fileViewersConfig }: ServiceRepository) => {
+
+    const config = await fileViewersConfig.get();
+
+    dispatch(propertiesActions.SET_PROPERTY({
+        key: FILE_VIEWERS_PROPERTY_NAME,
+        value: config,
+    }));
+
+};
diff --git a/src/store/file-viewers/file-viewers-selectors.ts b/src/store/file-viewers/file-viewers-selectors.ts
new file mode 100644
index 0000000..009e1f3
--- /dev/null
+++ b/src/store/file-viewers/file-viewers-selectors.ts
@@ -0,0 +1,14 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { PropertiesState, getProperty } from '~/store/properties/properties';
+import { FileViewerList } from '~/models/file-viewers-config';
+
+export const FILE_VIEWERS_PROPERTY_NAME = 'fileViewers';
+
+export const DEFAULT_FILE_VIEWERS: FileViewerList = [
+    { name: 'Test viewer', url: 'http://viewer.com', filePathParam: 'filePath' },
+];
+export const getFileViewers = (state: PropertiesState) =>
+    getProperty<FileViewerList>(FILE_VIEWERS_PROPERTY_NAME)(state) || DEFAULT_FILE_VIEWERS;

commit 1d825abb2c8a4be30a611cd57a5e8b4bfc303d01
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Dec 12 17:45:51 2018 +0100

    Add FileViewersConfigService to service repository
    
    Feature #13540
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/services/services.ts b/src/services/services.ts
index 59fe2d4..78ea714 100644
--- a/src/services/services.ts
+++ b/src/services/services.ts
@@ -30,6 +30,7 @@ import { RepositoriesService } from '~/services/repositories-service/repositorie
 import { AuthorizedKeysService } from '~/services/authorized-keys-service/authorized-keys-service';
 import { VocabularyService } from '~/services/vocabulary-service/vocabulary-service';
 import { NodeService } from '~/services/node-service/node-service';
+import { FileViewersConfigService } from '~/services/file-viewers-config-service/file-viewers-config-service';
 
 export type ServiceRepository = ReturnType<typeof createServices>;
 
@@ -64,6 +65,7 @@ export const createServices = (config: Config, actions: ApiActions) => {
     const tagService = new TagService(linkService);
     const searchService = new SearchService();
     const vocabularyService = new VocabularyService(config.vocabularyUrl);
+    const fileViewersConfig = new FileViewersConfigService(config.fileViewersConfigUrl);
 
     return {
         ancestorsService,
@@ -76,6 +78,7 @@ export const createServices = (config: Config, actions: ApiActions) => {
         containerRequestService,
         containerService,
         favoriteService,
+        fileViewersConfig,
         groupsService,
         keepService,
         linkService,

commit 9f9072365214fbf9d19f0359df90bbf2ab7ae3c9
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Dec 12 17:45:33 2018 +0100

    Create FileViewersConfigService
    
    Feature #13540
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/services/file-viewers-config-service/file-viewers-config-service.ts b/src/services/file-viewers-config-service/file-viewers-config-service.ts
new file mode 100644
index 0000000..4029225
--- /dev/null
+++ b/src/services/file-viewers-config-service/file-viewers-config-service.ts
@@ -0,0 +1,18 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import Axios from 'axios';
+import { FileViewerList } from '~/models/file-viewers-config';
+
+export class FileViewersConfigService {
+    constructor(
+        private url: string
+    ) { }
+
+    get() {
+        return Axios
+            .get<FileViewerList>(this.url)
+            .then(response => response.data);
+    }
+}

commit db28e4c12074c0411d907044eb4abf4c462d11b3
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Dec 12 17:44:29 2018 +0100

    Extend main config with FILE_VIEWERS_CONFIG_URL
    
    Feature #13540
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/README.md b/README.md
index e8d7770..425d178 100644
--- a/README.md
+++ b/README.md
@@ -41,7 +41,8 @@ Currently this configuration schema is supported:
 ```
 {
     "API_HOST": "string",
-    "VOCABULARY_URL": "string"
+    "VOCABULARY_URL": "string",
+    "FILE_VIEWERS_CONFIG_URL": "string",
 }
 ```
 
@@ -49,6 +50,13 @@ Currently this configuration schema is supported:
 Local path, or any URL that allows cross-origin requests. See 
 [Vocabulary JSON file example](public/vocabulary-example.json).
 
+### FILE_VIEWERS_CONFIG_URL
+Local path, or any URL that allows cross-origin requests. See:
+
+[File viewers config file example](public/file-viewers-example.json)
+
+[File viewers config scheme](src/models/file-viewers-config.ts)
+
 ### Licensing
 
 Arvados is Free Software. See COPYING for information about Arvados Free
diff --git a/public/file-viewers-example.json b/public/file-viewers-example.json
new file mode 100644
index 0000000..7c8aefc
--- /dev/null
+++ b/public/file-viewers-example.json
@@ -0,0 +1,24 @@
+[
+    {
+        "name": "File browser",
+        "extensions": [
+            ".txt",
+            ".zip"
+        ],
+        "url": "https://doc.arvados.org",
+        "filePathParam": "filePath"
+    },
+    {
+        "name": "Collection browser",
+        "extensions": [],
+        "collections": true,
+        "url": "https://doc.arvados.org",
+        "filePathParam": "collectionPath"
+    },
+    {
+        "name": "Universal browser",
+        "collections": true,
+        "url": "https://doc.arvados.org",
+        "filePathParam": "filePath"
+    }
+]
\ No newline at end of file
diff --git a/src/common/config.ts b/src/common/config.ts
index b7b89bd..4d96bbb 100644
--- a/src/common/config.ts
+++ b/src/common/config.ts
@@ -50,6 +50,7 @@ export interface Config {
     websocketUrl: string;
     workbenchUrl: string;
     vocabularyUrl: string;
+    fileViewersConfigUrl: string;
 }
 
 export const fetchConfig = () => {
@@ -111,17 +112,20 @@ export const mockConfig = (config: Partial<Config>): Config => ({
     websocketUrl: '',
     workbenchUrl: '',
     vocabularyUrl: '',
+    fileViewersConfigUrl: '',
     ...config
 });
 
 interface ConfigJSON {
     API_HOST: string;
     VOCABULARY_URL: string;
+    FILE_VIEWERS_CONFIG_URL: string;
 }
 
 const getDefaultConfig = (): ConfigJSON => ({
     API_HOST: process.env.REACT_APP_ARVADOS_API_HOST || "",
     VOCABULARY_URL: "",
+    FILE_VIEWERS_CONFIG_URL: "",
 });
 
 const getDiscoveryURL = (apiHost: string) => `${window.location.protocol}//${apiHost}/discovery/v1/apis/arvados/v1/rest`;

commit 3a525b4ef49ca90050183713292c95cd244f3123
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Dec 12 17:43:40 2018 +0100

    Move file-viewers-config to models
    
    Feature #13540
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/common/file-viewers-config.ts b/src/models/file-viewers-config.ts
similarity index 100%
rename from src/common/file-viewers-config.ts
rename to src/models/file-viewers-config.ts

commit a45ee68505f1a8efdc654d4f200c35ef8d55aff9
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Dec 12 17:20:42 2018 +0100

    Create file viewer config schema
    
    Feature #13540
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/common/file-viewers-config.ts b/src/common/file-viewers-config.ts
new file mode 100644
index 0000000..5c23dd4
--- /dev/null
+++ b/src/common/file-viewers-config.ts
@@ -0,0 +1,42 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+export type FileViewerList = FileViewer[];
+
+export interface FileViewer {
+    /**
+     * Name is used as a label in file's context menu
+     */
+    name: string;
+
+    /**
+     * Limits files for which viewer is enabled
+     * If not given, viewer will be enabled for all files
+     * Viewer is enabled if file name ends with an extension.
+     * 
+     * Example: `['.zip', '.tar.gz', 'bam']`
+     */
+    extensions?: string[];
+
+    /**
+     * Determines whether a viewer is enabled for collections.
+     */
+    collections?: boolean;
+
+    /**
+     * URL that redirects to a viewer 
+     * Example: `https://bam-viewer.com`
+     */
+    url: string;
+
+    /**
+     * Name of a search param that will be used to send file's path to a viewer
+     * Example: 
+     * 
+     * `{ filePathParam: 'filePath' }`
+     * 
+     * `https://bam-viewer.com?filePath=/path/to/file`
+     */
+    filePathParam: string;
+}

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list