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 { 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, GROUP_PERMISSIONS_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';
22 export enum GroupDetailsPanelColumnNames {
26 USERNAME = "Username",
29 export const groupDetailsPanelColumns: DataColumns<string> = [
31 name: GroupDetailsPanelColumnNames.FULL_NAME,
34 filters: createTree(),
35 render: uuid => <ResourceFullName uuid={uuid} />
38 name: GroupDetailsPanelColumnNames.USERNAME,
41 filters: createTree(),
42 render: uuid => <ResourceUsername uuid={uuid} />
45 name: GroupDetailsPanelColumnNames.UUID,
48 filters: createTree(),
49 render: uuid => <ResourceUuid uuid={uuid} />
52 name: GroupDetailsPanelColumnNames.EMAIL,
55 filters: createTree(),
56 render: uuid => <ResourceEmail uuid={uuid} />
60 const mapStateToProps = (state: RootState) => {
62 resources: state.resources
66 const mapDispatchToProps = {
67 onContextMenu: openContextMenu,
68 onAddUser: openAddGroupMembersDialog,
71 export interface GroupDetailsPanelProps {
72 onContextMenu: (event: React.MouseEvent<HTMLElement>, item: any) => void;
73 onAddUser: () => void;
74 resources: ResourcesState;
77 export const GroupDetailsPanel = connect(
78 mapStateToProps, mapDispatchToProps
80 class GroupDetailsPanel extends React.Component<GroupDetailsPanelProps> {
86 this.setState({ value: 0 });
90 const { value } = this.state;
93 <Tabs value={value} onChange={this.handleChange} fullWidth>
94 <Tab label="MEMBERS" />
95 <Tab label="PERMISSIONS" />
99 id={GROUP_DETAILS_PANEL_ID}
101 onRowDoubleClick={noop}
102 onContextMenu={this.handleContextMenu}
103 contextMenuColumn={true}
107 <Grid container justify='flex-end'>
111 onClick={this.props.onAddUser}>
122 id={GROUP_PERMISSIONS_PANEL_ID}
124 onRowDoubleClick={noop}
125 onContextMenu={this.handleContextMenu}
126 contextMenuColumn={true}
130 <Grid container justify='flex-end'>
134 onClick={this.props.onAddUser}>
147 handleContextMenu = (event: React.MouseEvent<HTMLElement>, resourceUuid: string) => {
148 const resource = getResource<PermissionResource>(resourceUuid)(this.props.resources);
150 this.props.onContextMenu(event, {
153 ownerUuid: resource.ownerUuid,
155 menuKind: ContextMenuKind.GROUP_MEMBER
160 handleChange = (event: React.MouseEvent<HTMLElement>, value: number) => {
161 this.setState({ value });