// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import React from 'react'; import { connect } from 'react-redux'; import { DataExplorer } from "views-components/data-explorer/data-explorer"; import { DataColumns } from 'components/data-table/data-table'; import { ResourceLinkHeadUuid, ResourceLinkTailUsername, ResourceLinkHeadPermissionLevel, ResourceLinkTailPermissionLevel, ResourceLinkHead, ResourceLinkTail, ResourceLinkDelete, ResourceLinkTailIsActive, ResourceLinkTailIsVisible } from 'views-components/data-explorer/renderers'; import { createTree } from 'models/tree'; import { noop } from 'lodash/fp'; import { RootState } from 'store/store'; import { GROUP_DETAILS_MEMBERS_PANEL_ID, GROUP_DETAILS_PERMISSIONS_PANEL_ID, openAddGroupMembersDialog, getCurrentGroupDetailsPanelUuid } from 'store/group-details-panel/group-details-panel-actions'; import { openContextMenu } from 'store/context-menu/context-menu-actions'; import { ResourcesState, getResource } from 'store/resources/resources'; import { Grid, Button, Tabs, Tab, Paper, WithStyles, withStyles, StyleRulesCallback } from '@material-ui/core'; import { AddIcon } from 'components/icon/icon'; import { getUserUuid } from 'common/getuser'; import { GroupResource, isBuiltinGroup } from 'models/group'; import { ArvadosTheme } from 'common/custom-theme'; type CssRules = "root"; const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ root: { width: '100%', } }); export enum GroupDetailsPanelMembersColumnNames { FULL_NAME = "Name", USERNAME = "Username", ACTIVE = "User Active", VISIBLE = "Visible to other members", PERMISSION = "Permission", REMOVE = "Remove", } export enum GroupDetailsPanelPermissionsColumnNames { NAME = "Name", PERMISSION = "Permission", UUID = "UUID", REMOVE = "Remove", } export const groupDetailsMembersPanelColumns: DataColumns = [ { name: GroupDetailsPanelMembersColumnNames.FULL_NAME, selected: true, configurable: true, filters: createTree(), render: uuid => }, { name: GroupDetailsPanelMembersColumnNames.USERNAME, selected: true, configurable: true, filters: createTree(), render: uuid => }, { name: GroupDetailsPanelMembersColumnNames.ACTIVE, selected: true, configurable: true, filters: createTree(), render: uuid => }, { name: GroupDetailsPanelMembersColumnNames.VISIBLE, selected: true, configurable: true, filters: createTree(), render: uuid => }, { name: GroupDetailsPanelMembersColumnNames.PERMISSION, selected: true, configurable: true, filters: createTree(), render: uuid => }, { name: GroupDetailsPanelMembersColumnNames.REMOVE, selected: true, configurable: true, filters: createTree(), render: uuid => }, ]; export const groupDetailsPermissionsPanelColumns: DataColumns = [ { name: GroupDetailsPanelPermissionsColumnNames.NAME, selected: true, configurable: true, filters: createTree(), render: uuid => }, { name: GroupDetailsPanelPermissionsColumnNames.PERMISSION, selected: true, configurable: true, filters: createTree(), render: uuid => }, { name: GroupDetailsPanelPermissionsColumnNames.UUID, selected: true, configurable: true, filters: createTree(), render: uuid => }, { name: GroupDetailsPanelPermissionsColumnNames.REMOVE, selected: true, configurable: true, filters: createTree(), render: uuid => }, ]; const mapStateToProps = (state: RootState) => { const groupUuid = getCurrentGroupDetailsPanelUuid(state.properties); const group = getResource(groupUuid || '')(state.resources); const userUuid = getUserUuid(state); return { resources: state.resources, groupCanManage: userUuid && !isBuiltinGroup(group?.uuid || '') ? group?.writableBy?.includes(userUuid) : false, }; }; const mapDispatchToProps = { onContextMenu: openContextMenu, onAddUser: openAddGroupMembersDialog, }; export interface GroupDetailsPanelProps { onContextMenu: (event: React.MouseEvent, item: any) => void; onAddUser: () => void; resources: ResourcesState; groupCanManage: boolean; } export const GroupDetailsPanel = withStyles(styles)(connect( mapStateToProps, mapDispatchToProps )( class GroupDetailsPanel extends React.Component> { state = { value: 0, }; componentDidMount() { this.setState({ value: 0 }); } render() { const { value } = this.state; return ( {value === 0 && } paperProps={{ elevation: 0, }} /> } {value === 1 && } ); } handleChange = (event: React.MouseEvent, value: number) => { this.setState({ value }); } }));