1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React from 'react';
6 import { connect } from 'react-redux';
8 import { DataExplorer } from "views-components/data-explorer/data-explorer";
9 import { DataColumns } from 'components/data-table/data-table';
10 import { ResourceLinkHeadUuid, ResourceLinkTailUuid, ResourceLinkTailEmail, ResourceLinkTailUsername, ResourceLinkHeadPermissionLevel, ResourceLinkTailPermissionLevel, ResourceLinkHead, ResourceLinkTail, ResourceLinkDelete, ResourceLinkTailIsActive, ResourceLinkTailIsHidden } 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_MEMBERS_PANEL_ID, GROUP_DETAILS_PERMISSIONS_PANEL_ID, openAddGroupMembersDialog, getCurrentGroupDetailsPanelUuid } 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 import { getUserUuid } from 'common/getuser';
22 import { GroupResource } from 'models/group';
24 export enum GroupDetailsPanelMembersColumnNames {
26 USERNAME = "Username",
28 ACTIVE = "User Active",
29 HIDDEN = "Member Hidden",
30 PERMISSION = "Permission",
35 export enum GroupDetailsPanelPermissionsColumnNames {
37 PERMISSION = "Permission",
42 export const groupDetailsMembersPanelColumns: DataColumns<string> = [
44 name: GroupDetailsPanelMembersColumnNames.FULL_NAME,
47 filters: createTree(),
48 render: uuid => <ResourceLinkTail uuid={uuid} />
51 name: GroupDetailsPanelMembersColumnNames.USERNAME,
54 filters: createTree(),
55 render: uuid => <ResourceLinkTailUsername uuid={uuid} />
58 name: GroupDetailsPanelMembersColumnNames.EMAIL,
61 filters: createTree(),
62 render: uuid => <ResourceLinkTailEmail uuid={uuid} />
65 name: GroupDetailsPanelMembersColumnNames.ACTIVE,
68 filters: createTree(),
69 render: uuid => <ResourceLinkTailIsActive uuid={uuid} />
72 name: GroupDetailsPanelMembersColumnNames.HIDDEN,
75 filters: createTree(),
76 render: uuid => <ResourceLinkTailIsHidden uuid={uuid} />
79 name: GroupDetailsPanelMembersColumnNames.PERMISSION,
82 filters: createTree(),
83 render: uuid => <ResourceLinkTailPermissionLevel uuid={uuid} />
86 name: GroupDetailsPanelMembersColumnNames.UUID,
89 filters: createTree(),
90 render: uuid => <ResourceLinkTailUuid uuid={uuid} />
93 name: GroupDetailsPanelMembersColumnNames.REMOVE,
96 filters: createTree(),
97 render: uuid => <ResourceLinkDelete uuid={uuid} />
101 export const groupDetailsPermissionsPanelColumns: DataColumns<string> = [
103 name: GroupDetailsPanelPermissionsColumnNames.NAME,
106 filters: createTree(),
107 render: uuid => <ResourceLinkHead uuid={uuid} />
110 name: GroupDetailsPanelPermissionsColumnNames.PERMISSION,
113 filters: createTree(),
114 render: uuid => <ResourceLinkHeadPermissionLevel uuid={uuid} />
117 name: GroupDetailsPanelPermissionsColumnNames.UUID,
120 filters: createTree(),
121 render: uuid => <ResourceLinkHeadUuid uuid={uuid} />
124 name: GroupDetailsPanelPermissionsColumnNames.REMOVE,
127 filters: createTree(),
128 render: uuid => <ResourceLinkDelete uuid={uuid} />
132 const mapStateToProps = (state: RootState) => {
133 const groupUuid = getCurrentGroupDetailsPanelUuid(state.properties);
134 const group = getResource<GroupResource>(groupUuid || '')(state.resources);
135 const userUuid = getUserUuid(state);
138 resources: state.resources,
139 groupCanManage: userUuid ? group?.writableBy?.includes(userUuid) : false,
143 const mapDispatchToProps = {
144 onContextMenu: openContextMenu,
145 onAddUser: openAddGroupMembersDialog,
148 export interface GroupDetailsPanelProps {
149 onContextMenu: (event: React.MouseEvent<HTMLElement>, item: any) => void;
150 onAddUser: () => void;
151 resources: ResourcesState;
152 groupCanManage: boolean;
155 export const GroupDetailsPanel = connect(
156 mapStateToProps, mapDispatchToProps
158 class GroupDetailsPanel extends React.Component<GroupDetailsPanelProps> {
163 componentDidMount() {
164 this.setState({ value: 0 });
168 const { value } = this.state;
171 <Tabs value={value} onChange={this.handleChange} variant="fullWidth">
172 <Tab label="MEMBERS" />
173 <Tab label="PERMISSIONS" />
177 id={GROUP_DETAILS_MEMBERS_PANEL_ID}
178 data-cy="group-members-data-explorer"
180 onRowDoubleClick={noop}
182 contextMenuColumn={false}
186 this.props.groupCanManage &&
187 <Grid container justify='flex-end'>
189 data-cy="group-member-add"
192 onClick={this.props.onAddUser}>
203 id={GROUP_DETAILS_PERMISSIONS_PANEL_ID}
205 onRowDoubleClick={noop}
207 contextMenuColumn={false}
218 handleContextMenu = (event: React.MouseEvent<HTMLElement>, resourceUuid: string) => {
219 const resource = getResource<PermissionResource>(resourceUuid)(this.props.resources);
221 this.props.onContextMenu(event, {
224 ownerUuid: resource.ownerUuid,
226 menuKind: ContextMenuKind.GROUP_MEMBER
231 handleChange = (event: React.MouseEvent<HTMLElement>, value: number) => {
232 this.setState({ value });