18559: Remove user panel tabs
[arvados-workbench2.git] / src / views / user-panel / user-panel.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import React from 'react';
6 import { WithStyles, withStyles, Tabs, Tab, Paper, Button, Grid } 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 { RootState } from 'store/store';
11 import { SortDirection } from 'components/data-table/data-column';
12 import { openContextMenu } from "store/context-menu/context-menu-actions";
13 import { getResource, ResourcesState } from "store/resources/resources";
14 import {
15     ResourceFirstName,
16     ResourceLastName,
17     ResourceUuid,
18     ResourceEmail,
19     ResourceIsActive,
20     ResourceIsAdmin,
21     ResourceUsername
22 } from "views-components/data-explorer/renderers";
23 import { navigateToUserProfile } from "store/navigation/navigation-action";
24 import { ContextMenuKind } from "views-components/context-menu/context-menu";
25 import { DataTableDefaultView } from 'components/data-table-default-view/data-table-default-view';
26 import { createTree } from 'models/tree';
27 import { compose, Dispatch } from 'redux';
28 import { UserResource } from 'models/user';
29 import { ShareMeIcon, AddIcon } from 'components/icon/icon';
30 import { USERS_PANEL_ID, openUserCreateDialog } from 'store/users/users-actions';
31 import { noop } from 'lodash';
32
33 type UserPanelRules = "button" | 'root';
34
35 const styles = withStyles<UserPanelRules>(theme => ({
36     button: {
37         marginTop: theme.spacing.unit,
38         marginRight: theme.spacing.unit * 2,
39         textAlign: 'right',
40         alignSelf: 'center'
41     },
42     root: {
43         width: '100%',
44     },
45 }));
46
47 export enum UserPanelColumnNames {
48     FIRST_NAME = "First Name",
49     LAST_NAME = "Last Name",
50     UUID = "Uuid",
51     EMAIL = "Email",
52     ACTIVE = "Active",
53     ADMIN = "Admin",
54     REDIRECT_TO_USER = "Redirect to user",
55     USERNAME = "Username"
56 }
57
58 export const userPanelColumns: DataColumns<string> = [
59     {
60         name: UserPanelColumnNames.FIRST_NAME,
61         selected: true,
62         configurable: true,
63         sortDirection: SortDirection.NONE,
64         filters: createTree(),
65         render: uuid => <ResourceFirstName uuid={uuid} />
66     },
67     {
68         name: UserPanelColumnNames.LAST_NAME,
69         selected: true,
70         configurable: true,
71         sortDirection: SortDirection.NONE,
72         filters: createTree(),
73         render: uuid => <ResourceLastName uuid={uuid} />
74     },
75     {
76         name: UserPanelColumnNames.UUID,
77         selected: true,
78         configurable: true,
79         sortDirection: SortDirection.NONE,
80         filters: createTree(),
81         render: uuid => <ResourceUuid uuid={uuid} />
82     },
83     {
84         name: UserPanelColumnNames.EMAIL,
85         selected: true,
86         configurable: true,
87         sortDirection: SortDirection.NONE,
88         filters: createTree(),
89         render: uuid => <ResourceEmail uuid={uuid} />
90     },
91     {
92         name: UserPanelColumnNames.ACTIVE,
93         selected: true,
94         configurable: true,
95         sortDirection: SortDirection.NONE,
96         filters: createTree(),
97         render: uuid => <ResourceIsActive uuid={uuid} />
98     },
99     {
100         name: UserPanelColumnNames.ADMIN,
101         selected: true,
102         configurable: false,
103         sortDirection: SortDirection.NONE,
104         filters: createTree(),
105         render: uuid => <ResourceIsAdmin uuid={uuid} />
106     },
107     {
108         name: UserPanelColumnNames.USERNAME,
109         selected: true,
110         configurable: false,
111         sortDirection: SortDirection.NONE,
112         filters: createTree(),
113         render: uuid => <ResourceUsername uuid={uuid} />
114     }
115 ];
116
117 interface UserPanelDataProps {
118     resources: ResourcesState;
119 }
120
121 interface UserPanelActionProps {
122     openUserCreateDialog: () => void;
123     handleRowClick: (uuid: string) => void;
124     onContextMenu: (event: React.MouseEvent<HTMLElement>, item: any) => void;
125 }
126
127 const mapStateToProps = (state: RootState) => {
128     return {
129         resources: state.resources
130     };
131 };
132
133 const mapDispatchToProps = (dispatch: Dispatch) => ({
134     openUserCreateDialog: () => dispatch<any>(openUserCreateDialog()),
135     handleRowClick: (uuid: string) => dispatch<any>(navigateToUserProfile(uuid)),
136     onContextMenu: (event: React.MouseEvent<HTMLElement>, item: any) => dispatch<any>(openContextMenu(event, item))
137 });
138
139 type UserPanelProps = UserPanelDataProps & UserPanelActionProps & DispatchProp & WithStyles<UserPanelRules>;
140
141 export const UserPanel = compose(
142     styles,
143     connect(mapStateToProps, mapDispatchToProps))(
144         class extends React.Component<UserPanelProps> {
145             render() {
146                 return <Paper className={this.props.classes.root}>
147                     <DataExplorer
148                         id={USERS_PANEL_ID}
149                         onRowClick={this.props.handleRowClick}
150                         onRowDoubleClick={noop}
151                         onContextMenu={this.handleContextMenu}
152                         contextMenuColumn={true}
153                         hideColumnSelector
154                         actions={
155                             <Grid container justify='flex-end'>
156                                 <Button variant="contained" color="primary" onClick={this.props.openUserCreateDialog}>
157                                     <AddIcon /> NEW USER
158                                 </Button>
159                             </Grid>
160                         }
161                         paperProps={{
162                             elevation: 0,
163                         }}
164                         dataTableDefaultView={
165                             <DataTableDefaultView
166                                 icon={ShareMeIcon}
167                                 messages={['Your user list is empty.']} />
168                         } />
169                 </Paper>;
170             }
171
172             handleContextMenu = (event: React.MouseEvent<HTMLElement>, resourceUuid: string) => {
173                 event.stopPropagation();
174                 const resource = getResource<UserResource>(resourceUuid)(this.props.resources);
175                 if (resource) {
176                     this.props.onContextMenu(event, {
177                         name: '',
178                         uuid: resource.uuid,
179                         ownerUuid: resource.ownerUuid,
180                         kind: resource.kind,
181                         menuKind: ContextMenuKind.USER
182                     });
183                 }
184             }
185         }
186     );