1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React from 'react';
6 import { StyleRulesCallback, Card, CardHeader, WithStyles, withStyles, Typography, Grid } from '@material-ui/core';
7 import { ArvadosTheme } from 'common/custom-theme';
8 import { UserResource } from 'models/user';
9 import { connect } from 'react-redux';
10 import { getResource } from 'store/resources/resources';
11 import { UserResourceAccountStatus } from 'views-components/data-explorer/renderers';
12 import { MultiselectToolbar } from 'components/multiselect-toolbar/MultiselectToolbar';
13 import { RootState } from 'store/store';
14 import { Dispatch } from 'redux';
15 import { loadDetailsPanel } from 'store/details-panel/details-panel-action';
16 import { setSelectedResourceUuid } from 'store/selected-resource/selected-resource-actions';
17 import { deselectAllOthers } from 'store/multiselect/multiselect-actions';
18 import { Resource } from 'models/resource';
19 import { ProjectResource } from 'models/project';
21 type CssRules = 'root' | 'cardHeaderContainer' | 'cardHeader' | 'userNameContainer' | 'accountStatusSection';
23 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
36 cardHeaderContainer: {
41 justifyContent: 'space-between',
45 padding: '0.2rem 0.4rem 0.2rem 1rem',
47 accountStatusSection: {
55 const mapStateToProps = ({ auth, selectedResourceUuid, resources, properties }: RootState) => {
56 const currentResource = getResource(properties.currentRouteUuid)(resources);
57 const frozenByUser = currentResource && getResource((currentResource as ProjectResource).frozenByUuid as string)(resources);
58 const frozenByFullName = frozenByUser && (frozenByUser as Resource & { fullName: string }).fullName;
59 const isSelected = selectedResourceUuid === properties.currentRouteUuid;
62 isAdmin: auth.user?.isAdmin,
69 const mapDispatchToProps = (dispatch: Dispatch) => ({
70 handleCardClick: (uuid: string) => {
71 dispatch<any>(loadDetailsPanel(uuid));
72 dispatch<any>(setSelectedResourceUuid(uuid));
73 dispatch<any>(deselectAllOthers(uuid));
77 type UserCardProps = WithStyles<CssRules> & {
78 currentResource: UserResource;
81 handleCardClick: (resource: any) => void;
84 export const UserCard = connect(
88 withStyles(styles)((props: UserCardProps) => {
89 const { classes, currentResource, handleCardClick, isSelected } = props;
90 const { fullName, uuid } = currentResource as UserResource & { fullName: string };
94 className={classes.root}
95 onClick={() => handleCardClick(uuid)}
96 data-cy='user-details-card'
101 className={classes.cardHeaderContainer}
104 className={classes.cardHeader}
106 <section className={classes.userNameContainer}>
113 <section className={classes.accountStatusSection}>
114 {!currentResource.isActive && (
116 <UserResourceAccountStatus uuid={uuid} />
123 {isSelected && <MultiselectToolbar />}