X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/3c7e3cdc547ad5468421e1c049daa94b0d4b8bc0..ad06ff12da24dae2a9b206d6f88dcfe7704bfbb3:/src/views-components/details-panel/details-panel.tsx diff --git a/src/views-components/details-panel/details-panel.tsx b/src/views-components/details-panel/details-panel.tsx index 38ac163efa..2653a21033 100644 --- a/src/views-components/details-panel/details-panel.tsx +++ b/src/views-components/details-panel/details-panel.tsx @@ -18,12 +18,16 @@ import { ProjectDetails } from "./project-details"; import { CollectionDetails } from "./collection-details"; import { ProcessDetails } from "./process-details"; import { EmptyDetails } from "./empty-details"; +import { WorkflowDetails } from "./workflow-details"; import { DetailsData } from "./details-data"; import { DetailsResource } from "models/details"; +import { Config } from 'common/config'; +import { isInlineFileUrlSafe } from "../context-menu/actions/helpers"; import { getResource } from 'store/resources/resources'; import { toggleDetailsPanel, SLIDE_TIMEOUT, openDetailsPanel } from 'store/details-panel/details-panel-action'; import { FileDetails } from 'views-components/details-panel/file-details'; import { getNode } from 'models/tree'; +import { resourceIsFrozen } from 'common/frozen-resources'; type CssRules = 'root' | 'container' | 'opened' | 'headerContainer' | 'headerIcon' | 'tabContainer'; @@ -69,6 +73,8 @@ const getItem = (res: DetailsResource): DetailsData => { return new CollectionDetails(res); case ResourceKind.PROCESS: return new ProcessDetails(res); + case ResourceKind.WORKFLOW: + return new WorkflowDetails(res); default: return new EmptyDetails(res); } @@ -77,12 +83,23 @@ const getItem = (res: DetailsResource): DetailsData => { } }; -const mapStateToProps = ({ detailsPanel, resources, collectionPanelFiles }: RootState) => { - const resource = getResource(detailsPanel.resourceUuid)(resources) as DetailsResource | undefined; +const mapStateToProps = ({ auth, detailsPanel, resources, collectionPanelFiles, multiselect, router }: RootState) => { + const isDetailsResourceChecked = multiselect.checkedList[detailsPanel.resourceUuid] + const currentRoute = router.location ? router.location.pathname : ""; + const currentItemUuid = isDetailsResourceChecked || currentRoute.includes('collections') ? detailsPanel.resourceUuid : multiselect.selectedUuid ? multiselect.selectedUuid : currentRoute.split('/')[2]; + const resource = getResource(currentItemUuid)(resources) as DetailsResource | undefined; const file = resource ? undefined : getNode(detailsPanel.resourceUuid)(collectionPanelFiles); + + let isFrozen = false; + if (resource) { + isFrozen = resourceIsFrozen(resource, resources); + } + return { + isFrozen, + authConfig: auth.config, isOpened: detailsPanel.isOpened, tabNr: detailsPanel.tabNr, res: resource || (file && file.value) || EMPTY_RESOURCE, @@ -101,9 +118,11 @@ const mapDispatchToProps = (dispatch: Dispatch) => ({ export interface DetailsPanelDataProps { onCloseDrawer: () => void; setActiveTab: (tabNr: number) => void; + authConfig: Config; isOpened: boolean; tabNr: number; res: DetailsResource; + isFrozen: boolean; } type DetailsPanelProps = DetailsPanelDataProps & WithStyles; @@ -143,9 +162,20 @@ export const DetailsPanel = withStyles(styles)( } renderContent() { - const { classes, onCloseDrawer, res, tabNr } = this.props; + const { classes, onCloseDrawer, res, tabNr, authConfig } = this.props; + + let shouldShowInlinePreview = false; + if (!('kind' in res)) { + shouldShowInlinePreview = isInlineFileUrlSafe( + res ? res.url : "", + authConfig.keepWebServiceUrl, + authConfig.keepWebInlineServiceUrl + ) || authConfig.clusterConfig.Collections.TrustAllContent; + } + const item = getItem(res); return = tabNr+1) ? tabNr : 0}> - { item.getTabLabels().map((tabLabel, idx) => + value={(item.getTabLabels().length >= tabNr + 1) ? tabNr : 0}> + {item.getTabLabels().map((tabLabel, idx) => ) } - {item.getDetails(tabNr)} + {item.getDetails({ tabNr, showPreview: shouldShowInlinePreview })} ; }