import { FavoriteStar, PublicFavoriteStar } from 'views-components/favorite-star/favorite-star';
import { FreezeIcon } from 'components/icon/icon';
import { Resource } from 'models/resource';
-import { ContextMenuResource } from 'store/context-menu/context-menu-actions';
-import { openContextMenu, resourceUuidToContextMenuKind } from 'store/context-menu/context-menu-actions';
-import { CollectionResource } from 'models/collection';
-import { ContextMenuKind } from 'views-components/context-menu/context-menu';
import { Dispatch } from 'redux';
import { loadDetailsPanel } from 'store/details-panel/details-panel-action';
import { ExpandChevronRight } from 'components/expand-chevron-right/expand-chevron-right';
| 'root'
| 'cardHeaderContainer'
| 'cardHeader'
+ | 'projectToolbar'
| 'descriptionToggle'
| 'showMore'
| 'noDescription'
| 'faveIcon'
| 'frozenIcon'
| 'accountStatusSection'
+ | 'chipSection'
| 'tag'
| 'description';
noDescription: {
color: theme.palette.grey['600'],
fontStyle: 'italic',
+ padding: '0 0 0.5rem 1rem',
+ marginTop: '-0.5rem',
},
userNameContainer: {
display: 'flex',
minWidth: '30rem',
padding: '0.2rem 0.4rem 0.2rem 1rem',
},
+ projectToolbar: {
+ //shows only the first 3 buttons
+ width: '12rem !important',
+ },
descriptionToggle: {
display: 'flex',
flexDirection: 'row',
cardContent: {
display: 'flex',
flexDirection: 'column',
- marginTop: '-1.75rem',
+ paddingTop: 0,
+ paddingLeft: '0.1rem',
},
nameSection: {
display: 'flex',
flexDirection: 'row',
alignItems: 'center',
margin: 0,
+ minHeight: '2.7rem',
},
faveIcon: {
fontSize: '0.8rem',
- margin: 'auto 0 0.5rem 0.3rem',
+ margin: 'auto 0 1rem 0.3rem',
color: theme.palette.text.primary,
},
frozenIcon: {
fontSize: '0.5rem',
marginLeft: '0.3rem',
- marginTop: '0.1rem',
height: '1rem',
color: theme.palette.text.primary,
},
alignItems: 'center',
paddingLeft: '1rem',
},
+ chipSection: {
+ marginBottom: '-2rem',
+ },
tag: {
- marginRight: '1rem',
- marginTop: '1rem',
+ marginRight: '0.75rem',
+ marginBottom: '0.5rem',
},
description: {
maxWidth: '95%',
dispatch<any>(setSelectedResourceUuid(uuid));
dispatch<any>(deselectAllOthers(uuid));
},
- handleContextMenu: (event: React.MouseEvent<HTMLElement>, resource: any, isAdmin: boolean) => {
- event.stopPropagation();
- // When viewing the contents of a filter group, all contents should be treated as read only.
- let readOnly = false;
- if (resource.groupClass === 'filter') {
- readOnly = true;
- }
- let menuKind = dispatch<any>(resourceUuidToContextMenuKind(resource.uuid, readOnly));
- if (menuKind === ContextMenuKind.ROOT_PROJECT) {
- menuKind = ContextMenuKind.USER_DETAILS;
- }
- if (menuKind && resource) {
- dispatch<any>(
- openContextMenu(event, {
- name: resource.name,
- uuid: resource.uuid,
- ownerUuid: resource.ownerUuid,
- isTrashed: 'isTrashed' in resource ? resource.isTrashed : false,
- kind: resource.kind,
- menuKind,
- isAdmin,
- isFrozen: !!resource.frozenByUuid,
- description: resource.description,
- storageClassesDesired: (resource as CollectionResource).storageClassesDesired,
- properties: 'properties' in resource ? resource.properties : {},
- })
- );
- }
- },
+
});
type DetailsCardProps = WithStyles<CssRules> & {
frozenByFullName?: string;
isAdmin: boolean;
isSelected: boolean;
- handleContextMenu: (event: React.MouseEvent<HTMLElement>, resource: ContextMenuResource, isAdmin: boolean) => void;
handleCardClick: (resource: any) => void;
};
currentResource: UserResource;
isAdmin: boolean;
isSelected: boolean;
- handleContextMenu: (event: React.MouseEvent<HTMLElement>, resource: ContextMenuResource, isAdmin: boolean) => void;
handleCardClick: (resource: any) => void;
};
mapDispatchToProps
)(
withStyles(styles)((props: DetailsCardProps) => {
- const { classes, currentResource, frozenByFullName, handleContextMenu, handleCardClick, isAdmin, isSelected } = props;
+ const { classes, currentResource, frozenByFullName, handleCardClick, isAdmin, isSelected } = props;
if (!currentResource) {
return null;
}
currentResource={currentResource as UserResource}
isAdmin={isAdmin}
isSelected={isSelected}
- handleContextMenu={(ev) => handleContextMenu(ev, currentResource as any, isAdmin)}
handleCardClick={handleCardClick}
/>
);
</section>
}
/>
- {isSelected && <MultiselectToolbar />}
+ {isSelected && <MultiselectToolbar injectedStyles={classes.projectToolbar} />}
</Grid>
<section onClick={(ev) => ev.stopPropagation()}>
{description ? (
<Typography
className={classes.description}
data-cy='project-description'
- >
- {description}
- </Typography>
+ //dangerouslySetInnerHTML is ok here only if description is sanitized,
+ //which it is before it is loaded into the redux store
+ dangerouslySetInnerHTML={{ __html: description }}
+ />
</Collapse>
</section>
</section>
data-cy='project-description'
>
<CardContent className={classes.cardContent}>
- <Typography component='div'>
+ <Typography component='div' className={classes.chipSection}>
{Object.keys(currentResource.properties).map((k) =>
Array.isArray(currentResource.properties[k])
? currentResource.properties[k].map((v: string) => getPropertyChip(k, v, undefined, classes.tag))