X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/fc84a3f3932af503d3afd04a58af52270c8fc3b6..58db72fee358d5987139a1b8526c0ca873e07dbf:/src/views/group-details-panel/group-details-panel.tsx diff --git a/src/views/group-details-panel/group-details-panel.tsx b/src/views/group-details-panel/group-details-panel.tsx index d0f79736..ce3f34c7 100644 --- a/src/views/group-details-panel/group-details-panel.tsx +++ b/src/views/group-details-panel/group-details-panel.tsx @@ -7,67 +7,129 @@ import { connect } from 'react-redux'; import { DataExplorer } from "views-components/data-explorer/data-explorer"; import { DataColumns } from 'components/data-table/data-table'; -import { ResourceUuid, ResourceFirstName, ResourceLastName, ResourceEmail, ResourceUsername } from 'views-components/data-explorer/renderers'; +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_PANEL_ID, openAddGroupMembersDialog } from 'store/group-details-panel/group-details-panel-actions'; +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 { ContextMenuKind } from 'views-components/context-menu/context-menu'; -import { PermissionResource } from 'models/permission'; -import { Grid, Button } from '@material-ui/core'; +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'; -export enum GroupDetailsPanelColumnNames { - FIRST_NAME = "First name", - LAST_NAME = "Last name", - UUID = "UUID", - EMAIL = "Email", +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 groupDetailsPanelColumns: DataColumns = [ +export const groupDetailsMembersPanelColumns: DataColumns = [ { - name: GroupDetailsPanelColumnNames.FIRST_NAME, + name: GroupDetailsPanelMembersColumnNames.FULL_NAME, selected: true, configurable: true, filters: createTree(), - render: uuid => + render: uuid => }, { - name: GroupDetailsPanelColumnNames.LAST_NAME, + name: GroupDetailsPanelMembersColumnNames.USERNAME, selected: true, configurable: true, filters: createTree(), - render: uuid => + render: uuid => }, { - name: GroupDetailsPanelColumnNames.UUID, + name: GroupDetailsPanelMembersColumnNames.ACTIVE, selected: true, configurable: true, filters: createTree(), - render: uuid => + render: uuid => }, { - name: GroupDetailsPanelColumnNames.EMAIL, + name: GroupDetailsPanelMembersColumnNames.VISIBLE, selected: true, configurable: true, filters: createTree(), - render: uuid => + render: uuid => }, { - name: GroupDetailsPanelColumnNames.USERNAME, + name: GroupDetailsPanelMembersColumnNames.PERMISSION, selected: true, configurable: true, filters: createTree(), - render: uuid => + 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 + resources: state.resources, + groupCanManage: userUuid && !isBuiltinGroup(group?.uuid || '') + ? group?.writableBy?.includes(userUuid) + : false, }; }; @@ -80,47 +142,74 @@ export interface GroupDetailsPanelProps { onContextMenu: (event: React.MouseEvent, item: any) => void; onAddUser: () => void; resources: ResourcesState; + groupCanManage: boolean; } -export const GroupDetailsPanel = connect( +export const GroupDetailsPanel = withStyles(styles)(connect( mapStateToProps, mapDispatchToProps )( - class GroupDetailsPanel extends React.Component { + 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 && + + } + ); } - handleContextMenu = (event: React.MouseEvent, resourceUuid: string) => { - const resource = getResource(resourceUuid)(this.props.resources); - if (resource) { - this.props.onContextMenu(event, { - name: '', - uuid: resource.uuid, - ownerUuid: resource.ownerUuid, - kind: resource.kind, - menuKind: ContextMenuKind.GROUP_MEMBER - }); - } + handleChange = (event: React.MouseEvent, value: number) => { + this.setState({ value }); } - }); - + }));