1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React from 'react';
6 import { CustomStyleRulesCallback } from 'common/custom-theme';
7 import { Card, CardHeader, Typography, Grid } from '@mui/material';
8 import { WithStyles } from '@mui/styles';
9 import withStyles from '@mui/styles/withStyles';
10 import { ArvadosTheme } from 'common/custom-theme';
11 import { UserResource } from 'models/user';
12 import { connect } from 'react-redux';
13 import { getResource } from 'store/resources/resources';
14 import { UserResourceAccountStatus } from 'views-components/data-explorer/renderers';
15 import { MultiselectToolbar } from 'components/multiselect-toolbar/MultiselectToolbar';
16 import { RootState } from 'store/store';
17 import { Dispatch } from 'redux';
18 import { loadDetailsPanel } from 'store/details-panel/details-panel-action';
19 import { setSelectedResourceUuid } from 'store/selected-resource/selected-resource-actions';
20 import { deselectAllOthers } from 'store/multiselect/multiselect-actions';
21 import { Resource } from 'models/resource';
22 import { ProjectResource } from 'models/project';
24 type CssRules = 'root' | 'cardHeaderContainer' | 'cardHeader' | 'userNameContainer' | 'accountStatusSection';
26 const styles: CustomStyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
39 cardHeaderContainer: {
44 justifyContent: 'space-between',
48 padding: '0.2rem 0.4rem 0.2rem 1rem',
50 accountStatusSection: {
58 const mapStateToProps = ({ auth, selectedResourceUuid, resources, properties }: RootState) => {
59 const currentResource = getResource(properties.currentRouteUuid)(resources);
60 const frozenByUser = currentResource && getResource((currentResource as ProjectResource).frozenByUuid as string)(resources);
61 const frozenByFullName = frozenByUser && (frozenByUser as Resource & { fullName: string }).fullName;
62 const isSelected = selectedResourceUuid === properties.currentRouteUuid;
65 isAdmin: auth.user?.isAdmin,
72 const mapDispatchToProps = (dispatch: Dispatch) => ({
73 handleCardClick: (uuid: string) => {
74 dispatch<any>(loadDetailsPanel(uuid));
75 dispatch<any>(setSelectedResourceUuid(uuid));
76 dispatch<any>(deselectAllOthers(uuid));
80 type UserCardProps = WithStyles<CssRules> & {
81 currentResource: UserResource;
84 handleCardClick: (resource: any) => void;
87 export const UserCard = connect(
91 withStyles(styles)((props: UserCardProps) => {
92 const { classes, currentResource, handleCardClick, isSelected } = props;
93 const { fullName, uuid } = currentResource as UserResource & { fullName: string };
97 className={classes.root}
98 onClick={() => handleCardClick(uuid)}
99 data-cy='user-details-card'
104 className={classes.cardHeaderContainer}
107 className={classes.cardHeader}
109 <section className={classes.userNameContainer}>
116 <section className={classes.accountStatusSection}>
117 {!currentResource.isActive && (
119 <UserResourceAccountStatus uuid={uuid} />
126 {isSelected && <MultiselectToolbar />}