remove width attr from DataColumn, move styles to data-explorer
[arvados-workbench2.git] / src / views / favorite-panel / favorite-panel.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import * as React from 'react';
6 import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core';
7 import { DataExplorer } from "~/views-components/data-explorer/data-explorer";
8 import { connect, DispatchProp } from 'react-redux';
9 import { DataColumns } from '~/components/data-table/data-table';
10 import { RouteComponentProps } from 'react-router';
11 import { DataTableFilterItem } from '~/components/data-table-filters/data-table-filters';
12 import { SortDirection } from '~/components/data-table/data-column';
13 import { ResourceKind } from '~/models/resource';
14 import { resourceLabel } from '~/common/labels';
15 import { ArvadosTheme } from '~/common/custom-theme';
16 import { FAVORITE_PANEL_ID } from "~/store/favorite-panel/favorite-panel-action";
17 import {
18     ProcessStatus,
19     ResourceFileSize,
20     ResourceLastModifiedDate,
21     ResourceName,
22     ResourceOwner,
23     ResourceType
24 } from '~/views-components/data-explorer/renderers';
25 import { FavoriteIcon } from '~/components/icon/icon';
26 import { Dispatch } from 'redux';
27 import { openContextMenu, resourceKindToContextMenuKind } from '~/store/context-menu/context-menu-actions';
28 import { loadDetailsPanel } from '~/store/details-panel/details-panel-action';
29 import { navigateTo } from '~/store/navigation/navigation-action';
30 import { ContainerRequestState } from "~/models/container-request";
31
32 type CssRules = "toolbar" | "button";
33
34 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
35     toolbar: {
36         paddingBottom: theme.spacing.unit * 3,
37         textAlign: "right"
38     },
39     button: {
40         marginLeft: theme.spacing.unit
41     },
42 });
43
44 export enum FavoritePanelColumnNames {
45     NAME = "Name",
46     STATUS = "Status",
47     TYPE = "Type",
48     OWNER = "Owner",
49     FILE_SIZE = "File size",
50     LAST_MODIFIED = "Last modified"
51 }
52
53 export interface FavoritePanelFilter extends DataTableFilterItem {
54     type: ResourceKind | ContainerRequestState;
55 }
56
57 export const favoritePanelColumns: DataColumns<string, FavoritePanelFilter> = [
58     {
59         name: FavoritePanelColumnNames.NAME,
60         selected: true,
61         configurable: true,
62         sortDirection: SortDirection.ASC,
63         filters: [],
64         render: uuid => <ResourceName uuid={uuid} />
65     },
66     {
67         name: "Status",
68         selected: true,
69         configurable: true,
70         filters: [],
71         render: uuid => <ProcessStatus uuid={uuid} />
72     },
73     {
74         name: FavoritePanelColumnNames.TYPE,
75         selected: true,
76         configurable: true,
77         filters: [
78             {
79                 name: resourceLabel(ResourceKind.COLLECTION),
80                 selected: true,
81                 type: ResourceKind.COLLECTION
82             },
83             {
84                 name: resourceLabel(ResourceKind.PROCESS),
85                 selected: true,
86                 type: ResourceKind.PROCESS
87             },
88             {
89                 name: resourceLabel(ResourceKind.PROJECT),
90                 selected: true,
91                 type: ResourceKind.PROJECT
92             }
93         ],
94         render: uuid => <ResourceType uuid={uuid} />
95     },
96     {
97         name: FavoritePanelColumnNames.OWNER,
98         selected: true,
99         configurable: true,
100         filters: [],
101         render: uuid => <ResourceOwner uuid={uuid} />
102     },
103     {
104         name: FavoritePanelColumnNames.FILE_SIZE,
105         selected: true,
106         configurable: true,
107         filters: [],
108         render: uuid => <ResourceFileSize uuid={uuid} />
109     },
110     {
111         name: FavoritePanelColumnNames.LAST_MODIFIED,
112         selected: true,
113         configurable: true,
114         sortDirection: SortDirection.NONE,
115         filters: [],
116         render: uuid => <ResourceLastModifiedDate uuid={uuid} />
117     }
118 ];
119
120 interface FavoritePanelDataProps {
121     currentItemId: string;
122 }
123
124 interface FavoritePanelActionProps {
125     onItemClick: (item: string) => void;
126     onContextMenu: (event: React.MouseEvent<HTMLElement>, item: string) => void;
127     onDialogOpen: (ownerUuid: string) => void;
128     onItemDoubleClick: (item: string) => void;
129 }
130
131 const mapDispatchToProps = (dispatch: Dispatch): FavoritePanelActionProps => ({
132     onContextMenu: (event, resourceUuid) => {
133         const kind = resourceKindToContextMenuKind(resourceUuid);
134         if (kind) {
135             dispatch<any>(openContextMenu(event, {
136                 name: '',
137                 uuid: resourceUuid,
138                 ownerUuid: '',
139                 kind: ResourceKind.NONE,
140                 menuKind: kind
141             }));
142         }
143     },
144     onDialogOpen: (ownerUuid: string) => { return; },
145     onItemClick: (resourceUuid: string) => {
146         dispatch<any>(loadDetailsPanel(resourceUuid));
147     },
148     onItemDoubleClick: uuid => {
149         dispatch<any>(navigateTo(uuid));
150     }
151 });
152
153 type FavoritePanelProps = FavoritePanelDataProps & FavoritePanelActionProps & DispatchProp
154     & WithStyles<CssRules> & RouteComponentProps<{ id: string }>;
155
156 export const FavoritePanel = withStyles(styles)(
157     connect(undefined, mapDispatchToProps)(
158         class extends React.Component<FavoritePanelProps> {
159             render() {
160                 return <DataExplorer
161                     id={FAVORITE_PANEL_ID}
162                     onRowClick={this.props.onItemClick}
163                     onRowDoubleClick={this.props.onItemDoubleClick}
164                     onContextMenu={this.props.onContextMenu}
165                     defaultIcon={FavoriteIcon}
166                     defaultMessages={['Your favorites list is empty.']}
167                     contextMenuColumn={true}/>;
168             }
169         }
170     )
171 );