Merge remote-tracking branch 'origin/14505-admin-group-panel-member-context-menu...
[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 * as 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 { ResourceUuid, ResourceFirstName, ResourceLastName, 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 } 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
20 export enum GroupDetailsPanelColumnNames {
21     FIRST_NAME = "First name",
22     LAST_NAME = "Last name",
23     UUID = "UUID",
24     EMAIL = "Email",
25     USERNAME = "Username",
26 }
27
28 export const groupDetailsPanelColumns: DataColumns<string> = [
29     {
30         name: GroupDetailsPanelColumnNames.FIRST_NAME,
31         selected: true,
32         configurable: true,
33         filters: createTree(),
34         render: uuid => <ResourceFirstName uuid={uuid} />
35     },
36     {
37         name: GroupDetailsPanelColumnNames.LAST_NAME,
38         selected: true,
39         configurable: true,
40         filters: createTree(),
41         render: uuid => <ResourceLastName uuid={uuid} />
42     },
43     {
44         name: GroupDetailsPanelColumnNames.UUID,
45         selected: true,
46         configurable: true,
47         filters: createTree(),
48         render: uuid => <ResourceUuid uuid={uuid} />
49     },
50     {
51         name: GroupDetailsPanelColumnNames.EMAIL,
52         selected: true,
53         configurable: true,
54         filters: createTree(),
55         render: uuid => <ResourceEmail uuid={uuid} />
56     },
57     {
58         name: GroupDetailsPanelColumnNames.USERNAME,
59         selected: true,
60         configurable: true,
61         filters: createTree(),
62         render: uuid => <ResourceUsername uuid={uuid} />
63     },
64 ];
65
66 const mapStateToProps = (state: RootState) => {
67     return {
68         resources: state.resources
69     };
70 };
71
72 const mapDispatchToProps = {
73     onContextMenu: openContextMenu,
74 };
75
76 export interface GroupDetailsPanelProps { 
77     onContextMenu: (event: React.MouseEvent<HTMLElement>, item: any) => void;
78     resources: ResourcesState;
79 }
80
81 export const GroupDetailsPanel = connect(
82     mapStateToProps, mapDispatchToProps
83 )(
84     class GroupDetailsPanel extends React.Component<GroupDetailsPanelProps> {
85
86         render() {
87             return (
88                 <DataExplorer
89                     id={GROUP_DETAILS_PANEL_ID}
90                     onRowClick={noop}
91                     onRowDoubleClick={noop}
92                     onContextMenu={this.handleContextMenu}
93                     contextMenuColumn={true}
94                     hideColumnSelector />
95             );
96         }
97
98         handleContextMenu = (event: React.MouseEvent<HTMLElement>, resourceUuid: string) => {
99             const resource = getResource<PermissionResource>(resourceUuid)(this.props.resources);
100             if (resource) {
101                 this.props.onContextMenu(event, {
102                     name: '',
103                     uuid: resource.uuid,
104                     ownerUuid: resource.ownerUuid,
105                     kind: resource.kind,
106                     menuKind: ContextMenuKind.GROUP_MEMBER
107                 });
108             }
109         }
110     });
111