1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React from 'react';
12 } from '@material-ui/core';
13 import { CollectionIcon } from 'components/icon/icon';
14 import { ArvadosTheme } from 'common/custom-theme';
15 import { BackIcon } from 'components/icon/icon';
16 import { DataTableDefaultView } from 'components/data-table-default-view/data-table-default-view';
17 import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from 'store/collections-content-address-panel/collections-content-address-panel-actions';
18 import { DataExplorer } from "views-components/data-explorer/data-explorer";
19 import { Dispatch } from 'redux';
21 resourceUuidToContextMenuKind,
23 } from 'store/context-menu/context-menu-actions';
24 import { ResourceKind } from 'models/resource';
25 import { loadDetailsPanel } from 'store/details-panel/details-panel-action';
26 import { connect } from 'react-redux';
27 import { navigateTo } from 'store/navigation/navigation-action';
28 import { DataColumns } from 'components/data-table/data-table';
29 import { SortDirection } from 'components/data-table/data-column';
30 import { createTree } from 'models/tree';
34 ResourceLastModifiedDate,
36 } from 'views-components/data-explorer/renderers';
37 import { getResource, ResourcesState } from 'store/resources/resources';
38 import { RootState } from 'store/store';
39 import { CollectionResource } from 'models/collection';
41 type CssRules = 'backLink' | 'backIcon' | 'card' | 'title' | 'iconHeader' | 'link';
43 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
49 padding: theme.spacing.unit,
50 marginBottom: theme.spacing.unit,
51 color: theme.palette.grey["700"],
54 marginRight: theme.spacing.unit
60 color: theme.palette.grey["700"]
64 color: theme.customs.colors.green700
68 color: theme.palette.primary.main,
76 enum CollectionContentAddressPanelColumnNames {
77 COLLECTION_WITH_THIS_ADDRESS = "Collection with this address",
79 LOCATION = "Location",
80 LAST_MODIFIED = "Last modified"
83 export const collectionContentAddressPanelColumns: DataColumns<string> = [
85 name: CollectionContentAddressPanelColumnNames.COLLECTION_WITH_THIS_ADDRESS,
88 sortDirection: SortDirection.NONE,
89 filters: createTree(),
90 render: uuid => <ResourceName uuid={uuid} />
93 name: CollectionContentAddressPanelColumnNames.STATUS,
96 filters: createTree(),
97 render: uuid => <ResourceStatus uuid={uuid} />
100 name: CollectionContentAddressPanelColumnNames.LOCATION,
103 filters: createTree(),
104 render: uuid => <ResourceOwnerName uuid={uuid} />
107 name: CollectionContentAddressPanelColumnNames.LAST_MODIFIED,
110 sortDirection: SortDirection.DESC,
111 filters: createTree(),
112 render: uuid => <ResourceLastModifiedDate uuid={uuid} />
116 interface CollectionContentAddressPanelActionProps {
117 onContextMenu: (resources: ResourcesState) => (event: React.MouseEvent<any>, uuid: string) => void;
118 onItemClick: (item: string) => void;
119 onItemDoubleClick: (item: string) => void;
122 interface CollectionContentAddressPanelDataProps {
123 resources: ResourcesState;
126 const mapStateToProps = ({ resources }: RootState): CollectionContentAddressPanelDataProps => ({
130 const mapDispatchToProps = (dispatch: Dispatch): CollectionContentAddressPanelActionProps => ({
131 onContextMenu: (resources: ResourcesState) => (event, resourceUuid) => {
132 const resource = getResource<CollectionResource>(resourceUuid)(resources);
133 const kind = dispatch<any>(resourceUuidToContextMenuKind(resourceUuid));
135 dispatch<any>(openContextMenu(event, {
136 name: resource ? resource.name : '',
137 description: resource ? resource.description : '',
138 storageClassesDesired: resource ? resource.storageClassesDesired : [],
141 kind: ResourceKind.NONE,
145 dispatch<any>(loadDetailsPanel(resourceUuid));
147 onItemClick: (uuid: string) => {
148 dispatch<any>(loadDetailsPanel(uuid));
150 onItemDoubleClick: uuid => {
151 dispatch<any>(navigateTo(uuid));
155 interface CollectionContentAddressDataProps {
157 params: { id: string }
161 export const CollectionsContentAddressPanel = withStyles(styles)(
162 connect(mapStateToProps, mapDispatchToProps)(
163 class extends React.Component<CollectionContentAddressPanelActionProps & CollectionContentAddressPanelDataProps & CollectionContentAddressDataProps & WithStyles<CssRules>> {
165 return <Grid item xs={12}>
167 onClick={() => window.history.back()}
168 className={this.props.classes.backLink}>
169 <BackIcon className={this.props.classes.backIcon} />
173 id={COLLECTIONS_CONTENT_ADDRESS_PANEL_ID}
175 onRowClick={this.props.onItemClick}
176 onRowDoubleClick={this.props.onItemDoubleClick}
177 onContextMenu={this.props.onContextMenu(this.props.resources)}
178 contextMenuColumn={true}
179 title={`Content address: ${this.props.match.params.id}`}
180 dataTableDefaultView={
181 <DataTableDefaultView
182 icon={CollectionIcon}
183 messages={['Collections with this content address not found.']} />