//
// SPDX-License-Identifier: AGPL-3.0
-import * as React from 'react';
-import { Link } from 'react-router-dom';
+import React from 'react';
import {
- StyleRulesCallback, WithStyles, withStyles, Grid
+ StyleRulesCallback,
+ WithStyles,
+ withStyles,
+ Button
} from '@material-ui/core';
-import { CollectionIcon } from '~/components/icon/icon';
-import { ArvadosTheme } from '~/common/custom-theme';
-import { BackIcon } from '~/components/icon/icon';
-import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
-import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from '~/store/collections-content-address-panel/collections-content-address-panel-actions';
-import { DataExplorer } from "~/views-components/data-explorer/data-explorer";
+import { CollectionIcon } from 'components/icon/icon';
+import { ArvadosTheme } from 'common/custom-theme';
+import { BackIcon } from 'components/icon/icon';
+import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from 'store/collections-content-address-panel/collections-content-address-panel-actions';
+import { DataExplorer } from "views-components/data-explorer/data-explorer";
import { Dispatch } from 'redux';
-import { getIsAdmin } from '~/store/public-favorites/public-favorites-actions';
-import { resourceKindToContextMenuKind, openContextMenu } from '~/store/context-menu/context-menu-actions';
-import { ResourceKind } from '~/models/resource';
-import { loadDetailsPanel } from '~/store/details-panel/details-panel-action';
+import {
+ resourceUuidToContextMenuKind,
+ openContextMenu
+} from 'store/context-menu/context-menu-actions';
+import { ResourceKind } from 'models/resource';
+import { loadDetailsPanel } from 'store/details-panel/details-panel-action';
import { connect } from 'react-redux';
-import { navigateTo } from '~/store/navigation/navigation-action';
-import { DataColumns } from '~/components/data-table/data-table';
-import { SortDirection } from '~/components/data-table/data-column';
-import { createTree } from '~/models/tree';
-import { ResourceName, ResourceOwner, ResourceLastModifiedDate } from '~/views-components/data-explorer/renderers';
+import { navigateTo } from 'store/navigation/navigation-action';
+import { DataColumns } from 'components/data-table/data-table';
+import { SortDirection } from 'components/data-table/data-column';
+import { createTree } from 'models/tree';
+import {
+ ResourceName,
+ ResourceOwnerName,
+ ResourceLastModifiedDate,
+ ResourceStatus
+} from 'views-components/data-explorer/renderers';
+import { getResource, ResourcesState } from 'store/resources/resources';
+import { RootState } from 'store/store';
+import { CollectionResource } from 'models/collection';
-type CssRules = 'backLink' | 'backIcon' | 'card' | 'title' | 'iconHeader' | 'link';
+type CssRules = 'backLink' | 'backIcon' | 'root' | 'content';
const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
backLink: {
- fontSize: '1rem',
+ fontSize: '12px',
fontWeight: 600,
display: 'flex',
alignItems: 'center',
- textDecoration: 'none',
padding: theme.spacing.unit,
- color: theme.palette.grey["700"],
+ marginBottom: theme.spacing.unit,
+ color: theme.palette.grey["500"],
},
backIcon: {
marginRight: theme.spacing.unit
},
- card: {
- width: '100%'
+ root: {
+ width: '100%',
},
- title: {
- color: theme.palette.grey["700"]
+ content: {
+ // reserve space for the content address bar
+ height: `calc(100% - ${theme.spacing.unit * 7}px)`,
},
- iconHeader: {
- fontSize: '1.875rem',
- color: theme.customs.colors.green700
- },
- link: {
- fontSize: '0.875rem',
- color: theme.palette.primary.main,
- textAlign: 'right',
- '&:hover': {
- cursor: 'pointer'
- }
- }
});
enum CollectionContentAddressPanelColumnNames {
COLLECTION_WITH_THIS_ADDRESS = "Collection with this address",
- OWNER = "Owner",
+ STATUS = "Status",
+ LOCATION = "Location",
LAST_MODIFIED = "Last modified"
}
-export const collectionContentAddressPanelColumns: DataColumns<string> = [
+export const collectionContentAddressPanelColumns: DataColumns<string, CollectionResource> = [
{
name: CollectionContentAddressPanelColumnNames.COLLECTION_WITH_THIS_ADDRESS,
selected: true,
configurable: true,
- sortDirection: SortDirection.NONE,
+ sort: {direction: SortDirection.NONE, field: "uuid"},
filters: createTree(),
render: uuid => <ResourceName uuid={uuid} />
},
{
- name: CollectionContentAddressPanelColumnNames.OWNER,
+ name: CollectionContentAddressPanelColumnNames.STATUS,
selected: true,
configurable: true,
filters: createTree(),
- render: uuid => <ResourceOwner uuid={uuid} />
+ render: uuid => <ResourceStatus uuid={uuid} />
+ },
+ {
+ name: CollectionContentAddressPanelColumnNames.LOCATION,
+ selected: true,
+ configurable: true,
+ filters: createTree(),
+ render: uuid => <ResourceOwnerName uuid={uuid} />
},
{
name: CollectionContentAddressPanelColumnNames.LAST_MODIFIED,
selected: true,
configurable: true,
- sortDirection: SortDirection.DESC,
+ sort: {direction: SortDirection.DESC, field: "modifiedAt"},
filters: createTree(),
render: uuid => <ResourceLastModifiedDate uuid={uuid} />
}
];
-export interface CollectionContentAddressMainCardActionProps {
- onContextMenu: (event: React.MouseEvent<any>, uuid: string) => void;
+interface CollectionContentAddressPanelActionProps {
+ onContextMenu: (resources: ResourcesState) => (event: React.MouseEvent<any>, uuid: string) => void;
onItemClick: (item: string) => void;
onItemDoubleClick: (item: string) => void;
}
-const mapDispatchToProps = (dispatch: Dispatch): CollectionContentAddressMainCardActionProps => ({
- onContextMenu: (event, resourceUuid) => {
- const isAdmin = dispatch<any>(getIsAdmin());
- const kind = resourceKindToContextMenuKind(resourceUuid, isAdmin);
+interface CollectionContentAddressPanelDataProps {
+ resources: ResourcesState;
+}
+
+const mapStateToProps = ({ resources }: RootState): CollectionContentAddressPanelDataProps => ({
+ resources
+})
+
+const mapDispatchToProps = (dispatch: Dispatch): CollectionContentAddressPanelActionProps => ({
+ onContextMenu: (resources: ResourcesState) => (event, resourceUuid) => {
+ const resource = getResource<CollectionResource>(resourceUuid)(resources);
+ const kind = dispatch<any>(resourceUuidToContextMenuKind(resourceUuid));
if (kind) {
dispatch<any>(openContextMenu(event, {
- name: '',
+ name: resource ? resource.name : '',
+ description: resource ? resource.description : '',
+ storageClassesDesired: resource ? resource.storageClassesDesired : [],
uuid: resourceUuid,
ownerUuid: '',
kind: ResourceKind.NONE,
}
});
+interface CollectionContentAddressDataProps {
+ match: {
+ params: { id: string }
+ };
+}
+
export const CollectionsContentAddressPanel = withStyles(styles)(
- connect(null, mapDispatchToProps)(
- class extends React.Component<CollectionContentAddressMainCardActionProps & WithStyles<CssRules>> {
+ connect(mapStateToProps, mapDispatchToProps)(
+ class extends React.Component<CollectionContentAddressPanelActionProps & CollectionContentAddressPanelDataProps & CollectionContentAddressDataProps & WithStyles<CssRules>> {
render() {
- return <Grid item xs={12}>
- {/* <Link to={`/collections/${this.props.collection.uuid}`} className={this.props.classes.backLink}>
+ return <div className={this.props.classes.root}>
+ <Button
+ onClick={() => window.history.back()}
+ className={this.props.classes.backLink}>
<BackIcon className={this.props.classes.backIcon} />
- Back test
- </Link> */}
- <DataExplorer
+ Back
+ </Button>
+ <div className={this.props.classes.content}><DataExplorer
id={COLLECTIONS_CONTENT_ADDRESS_PANEL_ID}
+ hideSearchInput
onRowClick={this.props.onItemClick}
onRowDoubleClick={this.props.onItemDoubleClick}
- onContextMenu={this.props.onContextMenu}
+ onContextMenu={this.props.onContextMenu(this.props.resources)}
contextMenuColumn={true}
- dataTableDefaultView={
- <DataTableDefaultView
- icon={CollectionIcon}
- messages={['Collections with this content address not found.']} />
- } />;
- </Grid >;
+ title={`Content address: ${this.props.match.params.id}`}
+ defaultViewIcon={CollectionIcon}
+ defaultViewMessages={['Collections with this content address not found.']} />
+ </div>
+ </div>;
}
}
)
-);
\ No newline at end of file
+);