1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from 'react';
6 import { Link } from 'react-router-dom';
8 StyleRulesCallback, WithStyles, withStyles, Grid
9 } from '@material-ui/core';
10 import { CollectionIcon } from '~/components/icon/icon';
11 import { ArvadosTheme } from '~/common/custom-theme';
12 import { BackIcon } from '~/components/icon/icon';
13 import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
14 import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from '~/store/collections-content-address-panel/collections-content-address-panel-actions';
15 import { DataExplorer } from "~/views-components/data-explorer/data-explorer";
16 import { Dispatch } from 'redux';
17 import { getIsAdmin } from '~/store/public-favorites/public-favorites-actions';
18 import { resourceKindToContextMenuKind, openContextMenu } from '~/store/context-menu/context-menu-actions';
19 import { ResourceKind } from '~/models/resource';
20 import { loadDetailsPanel } from '~/store/details-panel/details-panel-action';
21 import { connect } from 'react-redux';
22 import { navigateTo } from '~/store/navigation/navigation-action';
23 import { DataColumns } from '~/components/data-table/data-table';
24 import { SortDirection } from '~/components/data-table/data-column';
25 import { createTree } from '~/models/tree';
26 import { ResourceName, ResourceOwner, ResourceLastModifiedDate } from '~/views-components/data-explorer/renderers';
28 type CssRules = 'backLink' | 'backIcon' | 'card' | 'title' | 'iconHeader' | 'link';
30 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
36 textDecoration: 'none',
37 padding: theme.spacing.unit,
38 color: theme.palette.grey["700"],
41 marginRight: theme.spacing.unit
47 color: theme.palette.grey["700"]
51 color: theme.customs.colors.green700
55 color: theme.palette.primary.main,
63 enum CollectionContentAddressPanelColumnNames {
64 COLLECTION_WITH_THIS_ADDRESS = "Collection with this address",
66 LAST_MODIFIED = "Last modified"
69 export const collectionContentAddressPanelColumns: DataColumns<string> = [
71 name: CollectionContentAddressPanelColumnNames.COLLECTION_WITH_THIS_ADDRESS,
74 sortDirection: SortDirection.NONE,
75 filters: createTree(),
76 render: uuid => <ResourceName uuid={uuid} />
79 name: CollectionContentAddressPanelColumnNames.OWNER,
82 filters: createTree(),
83 render: uuid => <ResourceOwner uuid={uuid} />
86 name: CollectionContentAddressPanelColumnNames.LAST_MODIFIED,
89 sortDirection: SortDirection.DESC,
90 filters: createTree(),
91 render: uuid => <ResourceLastModifiedDate uuid={uuid} />
95 export interface CollectionContentAddressMainCardActionProps {
96 onContextMenu: (event: React.MouseEvent<any>, uuid: string) => void;
97 onItemClick: (item: string) => void;
98 onItemDoubleClick: (item: string) => void;
101 const mapDispatchToProps = (dispatch: Dispatch): CollectionContentAddressMainCardActionProps => ({
102 onContextMenu: (event, resourceUuid) => {
103 const isAdmin = dispatch<any>(getIsAdmin());
104 const kind = resourceKindToContextMenuKind(resourceUuid, isAdmin);
106 dispatch<any>(openContextMenu(event, {
110 kind: ResourceKind.NONE,
114 dispatch<any>(loadDetailsPanel(resourceUuid));
116 onItemClick: (uuid: string) => {
117 dispatch<any>(loadDetailsPanel(uuid));
119 onItemDoubleClick: uuid => {
120 dispatch<any>(navigateTo(uuid));
124 export const CollectionsContentAddressPanel = withStyles(styles)(
125 connect(null, mapDispatchToProps)(
126 class extends React.Component<CollectionContentAddressMainCardActionProps & WithStyles<CssRules>> {
128 return <Grid item xs={12}>
129 {/* <Link to={`/collections/${this.props.collection.uuid}`} className={this.props.classes.backLink}>
130 <BackIcon className={this.props.classes.backIcon} />
134 id={COLLECTIONS_CONTENT_ADDRESS_PANEL_ID}
135 onRowClick={this.props.onItemClick}
136 onRowDoubleClick={this.props.onItemDoubleClick}
137 onContextMenu={this.props.onContextMenu}
138 contextMenuColumn={true}
139 dataTableDefaultView={
140 <DataTableDefaultView
141 icon={CollectionIcon}
142 messages={['Collections with this content address not found.']} />