From 701e59342c16c23f8ee16c1ef92ee2ca6c416c0a Mon Sep 17 00:00:00 2001 From: Michal Klobukowski Date: Wed, 12 Dec 2018 18:45:52 +0100 Subject: [PATCH] Create FileViewerActions component Feature #13540 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- .../actions/file-viewer-actions.tsx | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/views-components/context-menu/actions/file-viewer-actions.tsx 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 00000000..868769d9 --- /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 => + + + + {viewer.name} + + + + )} + ); -- 2.30.2