mirror of
https://github.com/Unleash/unleash.git
synced 2025-02-23 00:22:19 +01:00
Merge remote-tracking branch 'origin/task/constraint_card_adjustmnets' into task/constraint_card_adjustmnets
This commit is contained in:
commit
f99937a334
1
frontend/.gitignore
vendored
1
frontend/.gitignore
vendored
@ -50,5 +50,6 @@ build
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
cypress/videos/*
|
cypress/videos/*
|
||||||
|
cypress/downloads/*
|
||||||
cypress/screenshots/*
|
cypress/screenshots/*
|
||||||
.env.local
|
.env.local
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import { Avatar, Badge, styled } from '@mui/material';
|
import { Avatar, Badge, styled } from '@mui/material';
|
||||||
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
|
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
|
||||||
import { IGroupUser, Role } from 'interfaces/group';
|
import { IGroupUser, Role } from 'interfaces/group';
|
||||||
import { useMemo } from 'react';
|
import React, { useMemo, useState } from 'react';
|
||||||
import StarIcon from '@mui/icons-material/Star';
|
import StarIcon from '@mui/icons-material/Star';
|
||||||
|
import { GroupPopover } from './GroupPopover/GroupPopover';
|
||||||
|
|
||||||
const StyledAvatars = styled('div')(({ theme }) => ({
|
const StyledAvatars = styled('div')(({ theme }) => ({
|
||||||
display: 'inline-flex',
|
display: 'inline-flex',
|
||||||
@ -42,6 +43,20 @@ export const GroupCardAvatars = ({ users }: IGroupCardAvatarsProps) => {
|
|||||||
() => users.sort((a, b) => (a.role < b.role ? 1 : -1)).slice(0, 9),
|
() => users.sort((a, b) => (a.role < b.role ? 1 : -1)).slice(0, 9),
|
||||||
[users]
|
[users]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);
|
||||||
|
const [popupUser, setPopupUser] = useState<IGroupUser>();
|
||||||
|
|
||||||
|
const onPopoverOpen = (event: React.MouseEvent<HTMLElement>) => {
|
||||||
|
setAnchorEl(event.currentTarget);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onPopoverClose = () => {
|
||||||
|
setAnchorEl(null);
|
||||||
|
};
|
||||||
|
|
||||||
|
const avatarOpen = Boolean(anchorEl);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StyledAvatars>
|
<StyledAvatars>
|
||||||
{shownUsers.map(user => (
|
{shownUsers.map(user => (
|
||||||
@ -53,9 +68,11 @@ export const GroupCardAvatars = ({ users }: IGroupCardAvatarsProps) => {
|
|||||||
data-loading
|
data-loading
|
||||||
alt="Gravatar"
|
alt="Gravatar"
|
||||||
src={user.imageUrl}
|
src={user.imageUrl}
|
||||||
title={`${
|
onMouseEnter={event => {
|
||||||
user.name || user.email || user.username
|
onPopoverOpen(event);
|
||||||
} (id: ${user.id})`}
|
setPopupUser(user);
|
||||||
|
}}
|
||||||
|
onMouseLeave={onPopoverClose}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
elseShow={
|
elseShow={
|
||||||
@ -71,9 +88,11 @@ export const GroupCardAvatars = ({ users }: IGroupCardAvatarsProps) => {
|
|||||||
data-loading
|
data-loading
|
||||||
alt="Gravatar"
|
alt="Gravatar"
|
||||||
src={user.imageUrl}
|
src={user.imageUrl}
|
||||||
title={`${
|
onMouseEnter={event => {
|
||||||
user.name || user.email || user.username
|
onPopoverOpen(event);
|
||||||
} (id: ${user.id})`}
|
setPopupUser(user);
|
||||||
|
}}
|
||||||
|
onMouseLeave={onPopoverClose}
|
||||||
/>
|
/>
|
||||||
</Badge>
|
</Badge>
|
||||||
}
|
}
|
||||||
@ -87,6 +106,12 @@ export const GroupCardAvatars = ({ users }: IGroupCardAvatarsProps) => {
|
|||||||
</StyledAvatarMore>
|
</StyledAvatarMore>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
<GroupPopover
|
||||||
|
open={avatarOpen}
|
||||||
|
user={popupUser}
|
||||||
|
anchorEl={anchorEl}
|
||||||
|
onPopoverClose={onPopoverClose}
|
||||||
|
/>
|
||||||
</StyledAvatars>
|
</StyledAvatars>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,88 @@
|
|||||||
|
import { Popover, Badge, styled, Tooltip } from '@mui/material';
|
||||||
|
import { IGroup, IGroupUser, Role } from 'interfaces/group';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
|
||||||
|
|
||||||
|
import { Badge as StyledBadge } from 'component/common/Badge/Badge';
|
||||||
|
|
||||||
|
import { RemoveGroup } from 'component/admin/groups/RemoveGroup/RemoveGroup';
|
||||||
|
import { useState } from 'react';
|
||||||
|
import StarIcon from '@mui/icons-material/Star';
|
||||||
|
import { IUser } from '../../../../../../../interfaces/user';
|
||||||
|
|
||||||
|
const StyledPopover = styled(Popover)(({ theme }) => ({
|
||||||
|
pointerEvents: 'none',
|
||||||
|
'.MuiPaper-root': {
|
||||||
|
padding: '12px',
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
const StyledPopupStar = styled(StarIcon)(({ theme }) => ({
|
||||||
|
color: theme.palette.warning.main,
|
||||||
|
fontSize: theme.fontSizes.smallBody,
|
||||||
|
marginLeft: theme.spacing(0.1),
|
||||||
|
marginTop: theme.spacing(2),
|
||||||
|
}));
|
||||||
|
|
||||||
|
const StyledName = styled('div')(({ theme }) => ({
|
||||||
|
color: theme.palette.text.secondary,
|
||||||
|
fontSize: theme.fontSizes.smallBody,
|
||||||
|
marginTop: theme.spacing(1),
|
||||||
|
}));
|
||||||
|
|
||||||
|
interface IGroupPopoverProps {
|
||||||
|
user: IGroupUser | undefined;
|
||||||
|
|
||||||
|
open: boolean;
|
||||||
|
anchorEl: HTMLElement | null;
|
||||||
|
|
||||||
|
onPopoverClose(event: React.MouseEvent<HTMLElement>): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const GroupPopover = ({
|
||||||
|
user,
|
||||||
|
open,
|
||||||
|
anchorEl,
|
||||||
|
onPopoverClose,
|
||||||
|
}: IGroupPopoverProps) => {
|
||||||
|
return (
|
||||||
|
<StyledPopover
|
||||||
|
open={open}
|
||||||
|
anchorEl={anchorEl}
|
||||||
|
onClose={onPopoverClose}
|
||||||
|
anchorOrigin={{
|
||||||
|
vertical: 'bottom',
|
||||||
|
horizontal: 'left',
|
||||||
|
}}
|
||||||
|
transformOrigin={{
|
||||||
|
vertical: 'top',
|
||||||
|
horizontal: 'left',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ConditionallyRender
|
||||||
|
condition={user?.role === Role.Member}
|
||||||
|
show={<StyledBadge color="success">{user?.role}</StyledBadge>}
|
||||||
|
elseShow={
|
||||||
|
<Badge
|
||||||
|
overlap="circular"
|
||||||
|
anchorOrigin={{
|
||||||
|
vertical: 'top',
|
||||||
|
horizontal: 'left',
|
||||||
|
}}
|
||||||
|
badgeContent={<StyledPopupStar />}
|
||||||
|
>
|
||||||
|
<StyledBadge
|
||||||
|
color="success"
|
||||||
|
sx={{ paddingLeft: '16px' }}
|
||||||
|
>
|
||||||
|
{user?.role}
|
||||||
|
</StyledBadge>
|
||||||
|
</Badge>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<StyledName>{user?.name}</StyledName>
|
||||||
|
<div>{user?.email}</div>
|
||||||
|
</StyledPopover>
|
||||||
|
);
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user