18123: Display full name of group members in group edit
[arvados-workbench2.git] / src / views / group-details-panel / group-details-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 { connect } from 'react-redux';
7
8 import { DataExplorer } from "views-components/data-explorer/data-explorer";
9 import { DataColumns } from 'components/data-table/data-table';
10 import { ResourceFullName, ResourceUuid, ResourceEmail, ResourceUsername } from 'views-components/data-explorer/renderers';
11 import { createTree } from 'models/tree';
12 import { noop } from 'lodash/fp';
13 import { RootState } from 'store/store';
14 import { GROUP_DETAILS_PANEL_ID, openAddGroupMembersDialog } from 'store/group-details-panel/group-details-panel-actions';
15 import { openContextMenu } from 'store/context-menu/context-menu-actions';
16 import { ResourcesState, getResource } from 'store/resources/resources';
17 import { ContextMenuKind } from 'views-components/context-menu/context-menu';
18 import { PermissionResource } from 'models/permission';
19 import { Grid, Button, Tabs, Tab, Paper } from '@material-ui/core';
20 import { AddIcon } from 'components/icon/icon';
21
22 export enum GroupDetailsPanelColumnNames {
23     FULL_NAME = "Name",
24     UUID = "UUID",
25     EMAIL = "Email",
26     USERNAME = "Username",
27 }
28
29 export const groupDetailsPanelColumns: DataColumns<string> = [
30     {
31         name: GroupDetailsPanelColumnNames.FULL_NAME,
32         selected: true,
33         configurable: true,
34         filters: createTree(),
35         render: uuid => <ResourceFullName uuid={uuid} />
36     },
37     {
38         name: GroupDetailsPanelColumnNames.USERNAME,
39         selected: true,
40         configurable: true,
41         filters: createTree(),
42         render: uuid => <ResourceUsername uuid={uuid} />
43     },
44     {
45         name: GroupDetailsPanelColumnNames.UUID,
46         selected: true,
47         configurable: true,
48         filters: createTree(),
49         render: uuid => <ResourceUuid uuid={uuid} />
50     },
51     {
52         name: GroupDetailsPanelColumnNames.EMAIL,
53         selected: true,
54         configurable: true,
55         filters: createTree(),
56         render: uuid => <ResourceEmail uuid={uuid} />
57     },
58 ];
59
60 const mapStateToProps = (state: RootState) => {
61     return {
62         resources: state.resources
63     };
64 };
65
66 const mapDispatchToProps = {
67     onContextMenu: openContextMenu,
68     onAddUser: openAddGroupMembersDialog,
69 };
70
71 export interface GroupDetailsPanelProps {
72     onContextMenu: (event: React.MouseEvent<HTMLElement>, item: any) => void;
73     onAddUser: () => void;
74     resources: ResourcesState;
75 }
76
77 export const GroupDetailsPanel = connect(
78     mapStateToProps, mapDispatchToProps
79 )(
80     class GroupDetailsPanel extends React.Component<GroupDetailsPanelProps> {
81
82         render() {
83             return (
84                 <DataExplorer
85                     id={GROUP_DETAILS_PANEL_ID}
86                     onRowClick={noop}
87                     onRowDoubleClick={noop}
88                     onContextMenu={this.handleContextMenu}
89                     contextMenuColumn={true}
90                     hideColumnSelector
91                     hideSearchInput
92                     actions={
93                         <Grid container justify='flex-end'>
94                             <Button
95                                 variant="contained"
96                                 color="primary"
97                                 onClick={this.props.onAddUser}>
98                                 <AddIcon /> Add user
99                         </Button>
100                         </Grid>
101                     } />
102             );
103         }
104
105         handleContextMenu = (event: React.MouseEvent<HTMLElement>, resourceUuid: string) => {
106             const resource = getResource<PermissionResource>(resourceUuid)(this.props.resources);
107             if (resource) {
108                 this.props.onContextMenu(event, {
109                     name: '',
110                     uuid: resource.uuid,
111                     ownerUuid: resource.ownerUuid,
112                     kind: resource.kind,
113                     menuKind: ContextMenuKind.GROUP_MEMBER
114                 });
115             }
116         }
117     });
118