[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