Fix #5956 Long team names go out of the box (#5959)

* Fix #5956 Long team names go out of the box

* Fix unit test

* Minor change

* Fix roles page issue

* Revert policy change

* Fix Long name issue

* Minor change

* Fix unit test
This commit is contained in:
Sachin Chaurasiya 2022-07-08 21:05:53 +05:30 committed by GitHub
parent 1bce9277cc
commit 1ffd29e266
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 81 additions and 48 deletions

View File

@ -60,7 +60,7 @@ const EntityDeleteModal: FC<Prop> = ({
<div className="tw-modal-backdrop" /> <div className="tw-modal-backdrop" />
<div className="tw-modal-container tw-w-120"> <div className="tw-modal-container tw-w-120">
<div className={classNames('tw-modal-header')}> <div className={classNames('tw-modal-header')}>
<p className="tw-modal-title" data-testid="modal-header"> <p className="tw-modal-title tw-break-all" data-testid="modal-header">
{softDelete ? ( {softDelete ? (
<span> <span>
Soft delete <strong>{entityName}</strong> Soft delete <strong>{entityName}</strong>
@ -73,7 +73,7 @@ const EntityDeleteModal: FC<Prop> = ({
</p> </p>
</div> </div>
<div className={classNames('tw-modal-body')} data-testid="body-text"> <div className={classNames('tw-modal-body')} data-testid="body-text">
<p className="tw-mb-2"> <p className="tw-mb-2 tw-break-all">
{bodyText || {bodyText ||
`Once you delete this ${getTitleCase( `Once you delete this ${getTitleCase(
entityType entityType

View File

@ -43,6 +43,7 @@ import { filterEntityAssets, getInfoElements } from '../../utils/EntityUtils';
import SVGIcons from '../../utils/SvgUtils'; import SVGIcons from '../../utils/SvgUtils';
import { Button } from '../buttons/Button/Button'; import { Button } from '../buttons/Button/Button';
import Description from '../common/description/Description'; import Description from '../common/description/Description';
import Ellipses from '../common/Ellipses/Ellipses';
import ErrorPlaceHolder from '../common/error-with-placeholder/ErrorPlaceHolder'; import ErrorPlaceHolder from '../common/error-with-placeholder/ErrorPlaceHolder';
import NextPrevious from '../common/next-previous/NextPrevious'; import NextPrevious from '../common/next-previous/NextPrevious';
import NonAdminAction from '../common/non-admin-action/NonAdminAction'; import NonAdminAction from '../common/non-admin-action/NonAdminAction';
@ -516,9 +517,7 @@ const TeamDetails = ({
const getTeamHeading = () => { const getTeamHeading = () => {
return ( return (
<div <div className="tw-heading tw-text-link tw-text-base">
className="tw-heading tw-text-link tw-text-base tw-truncate tw-w-120"
title={heading}>
{isHeadingEditing ? ( {isHeadingEditing ? (
<div className="tw-flex tw-items-center tw-gap-1"> <div className="tw-flex tw-items-center tw-gap-1">
<input <input
@ -553,8 +552,10 @@ const TeamDetails = ({
</div> </div>
</div> </div>
) : ( ) : (
<div className="tw-flex tw-group"> <div className="tw-flex tw-group" data-testid="team-heading">
<span data-testid="team-heading">{heading}</span> <Ellipses tooltip className="tw-w-120" rows={1}>
{heading}
</Ellipses>
{isActionAllowed() && ( {isActionAllowed() && (
<div className={classNames('tw-w-5 tw-min-w-max')}> <div className={classNames('tw-w-5 tw-min-w-max')}>
<NonAdminAction <NonAdminAction

View File

@ -22,6 +22,7 @@ import AddUsersModal from '../../pages/teams/AddUsersModal';
import { getActiveCatClass, getCountBadge } from '../../utils/CommonUtils'; import { getActiveCatClass, getCountBadge } from '../../utils/CommonUtils';
import { getActiveUsers } from '../../utils/TeamUtils'; import { getActiveUsers } from '../../utils/TeamUtils';
import { Button } from '../buttons/Button/Button'; import { Button } from '../buttons/Button/Button';
import Ellipses from '../common/Ellipses/Ellipses';
import NonAdminAction from '../common/non-admin-action/NonAdminAction'; import NonAdminAction from '../common/non-admin-action/NonAdminAction';
import PageLayout, { leftPanelAntCardStyle } from '../containers/PageLayout'; import PageLayout, { leftPanelAntCardStyle } from '../containers/PageLayout';
import Loader from '../Loader/Loader'; import Loader from '../Loader/Loader';
@ -130,13 +131,14 @@ const TeamsAndUsers = ({
className={`tw-group tw-text-grey-body tw-cursor-pointer tw-text-body tw-flex tw-justify-between ${getActiveCatClass( className={`tw-group tw-text-grey-body tw-cursor-pointer tw-text-body tw-flex tw-justify-between ${getActiveCatClass(
team.name, team.name,
currentTeam?.name currentTeam?.name
)}`}> )}`}
<p data-testid="team-name">
className="tag-category label-category tw-self-center tw-truncate" <Ellipses
data-testid="team-name" tooltip
title={team.displayName ?? team.name}> className="tag-category label-category tw-self-center tw-w-32"
rows={1}>
{team.displayName ?? team.name} {team.displayName ?? team.name}
</p> </Ellipses>
</div> </div>
{getCountBadge( {getCountBadge(
getActiveUsers(team.users).length, getActiveUsers(team.users).length,

View File

@ -57,6 +57,7 @@ import ActivityFeedList from '../ActivityFeed/ActivityFeedList/ActivityFeedList'
import { filterListTasks } from '../ActivityFeed/ActivityFeedList/ActivityFeedList.util'; import { filterListTasks } from '../ActivityFeed/ActivityFeedList/ActivityFeedList.util';
import { Button } from '../buttons/Button/Button'; import { Button } from '../buttons/Button/Button';
import Description from '../common/description/Description'; import Description from '../common/description/Description';
import Ellipses from '../common/Ellipses/Ellipses';
import ProfilePicture from '../common/ProfilePicture/ProfilePicture'; import ProfilePicture from '../common/ProfilePicture/ProfilePicture';
import { reactSingleSelectCustomStyle } from '../common/react-select-component/reactSelectCustomStyle'; import { reactSingleSelectCustomStyle } from '../common/react-select-component/reactSelectCustomStyle';
import TabsPane from '../common/TabsPane/TabsPane'; import TabsPane from '../common/TabsPane/TabsPane';
@ -326,7 +327,9 @@ const Users = ({
data-testid={team.name} data-testid={team.name}
key={i}> key={i}>
<SVGIcons alt="icon" className="tw-w-4" icon={Icons.TEAMS_GREY} /> <SVGIcons alt="icon" className="tw-w-4" icon={Icons.TEAMS_GREY} />
<span>{getEntityName(team)}</span> <Ellipses tooltip className="tw-w-48">
{getEntityName(team)}
</Ellipses>
</div> </div>
))} ))}
{isEmpty(userData.teams) && ( {isEmpty(userData.teams) && (
@ -456,7 +459,9 @@ const Users = ({
{userData.roles?.map((role, i) => ( {userData.roles?.map((role, i) => (
<div className="tw-mb-2 tw-flex tw-items-center tw-gap-2" key={i}> <div className="tw-mb-2 tw-flex tw-items-center tw-gap-2" key={i}>
<SVGIcons alt="icon" className="tw-w-4" icon={Icons.USERS} /> <SVGIcons alt="icon" className="tw-w-4" icon={Icons.USERS} />
<span>{getEntityName(role)}</span> <Ellipses tooltip className="tw-w-48">
{getEntityName(role)}
</Ellipses>
</div> </div>
))} ))}
{!userData.isAdmin && isEmpty(userData.roles) && ( {!userData.isAdmin && isEmpty(userData.roles) && (
@ -593,7 +598,9 @@ const Users = ({
className="tw-mb-2 tw-flex tw-items-center tw-gap-2" className="tw-mb-2 tw-flex tw-items-center tw-gap-2"
key={i}> key={i}>
<SVGIcons alt="icon" className="tw-w-4" icon={Icons.USERS} /> <SVGIcons alt="icon" className="tw-w-4" icon={Icons.USERS} />
<span>{getEntityName(inheritedRole)}</span> <Ellipses tooltip className="tw-w-48">
{getEntityName(inheritedRole)}
</Ellipses>
</div> </div>
))} ))}
</div> </div>

View File

@ -45,6 +45,7 @@ import {
} from '../../utils/CommonUtils'; } from '../../utils/CommonUtils';
import SVGIcons, { Icons } from '../../utils/SvgUtils'; import SVGIcons, { Icons } from '../../utils/SvgUtils';
import { showErrorToast } from '../../utils/ToastUtils'; import { showErrorToast } from '../../utils/ToastUtils';
import Ellipses from '../common/Ellipses/Ellipses';
import { COOKIE_VERSION } from '../Modals/WhatsNewModal/whatsNewData'; import { COOKIE_VERSION } from '../Modals/WhatsNewModal/whatsNewData';
import NavBar from '../nav-bar/NavBar'; import NavBar from '../nav-bar/NavBar';
import { useWebSocketConnector } from '../web-scoket/web-scoket.provider'; import { useWebSocketConnector } from '../web-scoket/web-scoket.provider';
@ -151,9 +152,9 @@ const Appbar: React.FC = (): JSX.Element => {
<div> <div>
<div className="tw-text-grey-muted tw-text-xs">{name}</div> <div className="tw-text-grey-muted tw-text-xs">{name}</div>
{userRoleArr.map((userRole, i) => ( {userRoleArr.map((userRole, i) => (
<p className="tw-font-medium" key={i}> <Ellipses tooltip className="tw-font-medium" key={i}>
{userRole} {userRole}
</p> </Ellipses>
))} ))}
<hr className="tw-my-1.5" /> <hr className="tw-my-1.5" />
</div> </div>
@ -199,10 +200,12 @@ const Appbar: React.FC = (): JSX.Element => {
const teams = getNonDeletedTeams(currentUser?.teams ?? []); const teams = getNonDeletedTeams(currentUser?.teams ?? []);
return ( return (
<div data-testid="greeting-text"> <div className="tw-max-w-xs" data-testid="greeting-text">
<Link to={getUserPath(currentUser?.name as string)}> <Link to={getUserPath(currentUser?.name as string)}>
{' '} {' '}
<span className="tw-font-medium tw-cursor-pointer">{name}</span> <Ellipses tooltip className="tw-font-medium tw-cursor-pointer">
{name}
</Ellipses>
</Link> </Link>
<hr className="tw-my-1.5" /> <hr className="tw-my-1.5" />
{roles.length > 0 ? getUsersRoles(roles, 'Roles') : null} {roles.length > 0 ? getUsersRoles(roles, 'Roles') : null}
@ -213,11 +216,11 @@ const Appbar: React.FC = (): JSX.Element => {
<div> <div>
<span className="tw-text-grey-muted tw-text-xs">Teams</span> <span className="tw-text-grey-muted tw-text-xs">Teams</span>
{teams.map((t, i) => ( {teams.map((t, i) => (
<p key={i}> <Ellipses tooltip className="tw-text-xs" key={i}>
<Link to={getTeamAndUserDetailsPath(t.name as string)}> <Link to={getTeamAndUserDetailsPath(t.name as string)}>
{t.displayName || t.name} {t.displayName || t.name}
</Link> </Link>
</p> </Ellipses>
))} ))}
<hr className="tw-mt-1.5" /> <hr className="tw-mt-1.5" />
</div> </div>

View File

@ -13,6 +13,7 @@
import React from 'react'; import React from 'react';
import { TITLE_FOR_NON_ADMIN_ACTION } from '../../../constants/constants'; import { TITLE_FOR_NON_ADMIN_ACTION } from '../../../constants/constants';
import Ellipses from '../Ellipses/Ellipses';
import NonAdminAction from '../non-admin-action/NonAdminAction'; import NonAdminAction from '../non-admin-action/NonAdminAction';
type DeleteWidgetBodyProps = { type DeleteWidgetBodyProps = {
@ -35,13 +36,15 @@ const DeleteWidgetBody = ({
return ( return (
<div className="tw-flex tw-justify-between tw-px-5 tw-py-3"> <div className="tw-flex tw-justify-between tw-px-5 tw-py-3">
<div data-testid="danger-zone-text"> <div data-testid="danger-zone-text">
<p <Ellipses
className="tw-text-sm tw-mb-1 tw-font-medium" tooltip
data-testid="danger-zone-text-title"> className="tw-text-sm tw-mb-1 tw-font-medium tw-w-120"
data-testid="danger-zone-text-title"
rows={1}>
{header} {header}
</p> </Ellipses>
<p <p
className="tw-text-grey-muted tw-text-xs" className="tw-text-grey-muted tw-text-xs tw-break-all"
data-testid="danger-zone-text-para"> data-testid="danger-zone-text-para">
{description} {description}
</p> </p>

View File

@ -35,6 +35,7 @@ import { getTeams, patchTeamDetail } from '../../axiosAPIs/teamsAPI';
import { getUserCounts } from '../../axiosAPIs/userAPI'; import { getUserCounts } from '../../axiosAPIs/userAPI';
import { Button } from '../../components/buttons/Button/Button'; import { Button } from '../../components/buttons/Button/Button';
import Description from '../../components/common/description/Description'; import Description from '../../components/common/description/Description';
import Ellipses from '../../components/common/Ellipses/Ellipses';
import ErrorPlaceHolder from '../../components/common/error-with-placeholder/ErrorPlaceHolder'; import ErrorPlaceHolder from '../../components/common/error-with-placeholder/ErrorPlaceHolder';
import NonAdminAction from '../../components/common/non-admin-action/NonAdminAction'; import NonAdminAction from '../../components/common/non-admin-action/NonAdminAction';
import PageContainerV1 from '../../components/containers/PageContainerV1'; import PageContainerV1 from '../../components/containers/PageContainerV1';
@ -605,11 +606,12 @@ const RolesPage = () => {
data-testid="role-name-container" data-testid="role-name-container"
key={role.name} key={role.name}
onClick={() => setCurrentRole(role)}> onClick={() => setCurrentRole(role)}>
<span <Ellipses
className="tag-category label-category tw-self-center tw-truncate tw-w-52" tooltip
title={role.displayName}> className="tag-category label-category tw-self-center tw-w-52"
rows={1}>
<span>{role.displayName}</span>{' '} <span>{role.displayName}</span>{' '}
</span> </Ellipses>
{role.defaultRole ? getDefaultBadge() : null} {role.defaultRole ? getDefaultBadge() : null}
</div> </div>
))} ))}
@ -994,16 +996,16 @@ const RolesPage = () => {
const getRolesComponent = () => { const getRolesComponent = () => {
return ( return (
<Fragment> <Fragment>
<div <div className="tw-flex tw-justify-between" data-testid="header">
className="tw-flex tw-justify-between tw-items-center"
data-testid="header">
<div <div
className="tw-heading tw-text-link tw-text-base" className="tw-flex tw-items-start tw-max-w-75"
data-testid="header-title"> data-testid="header-title">
{currentRole?.displayName} <Ellipses tooltip className="tw-heading tw-text-link tw-text-base">
{currentRole?.displayName}
</Ellipses>
{currentRole?.defaultRole ? getDefaultBadge('tw-ml-2') : null} {currentRole?.defaultRole ? getDefaultBadge('tw-ml-2') : null}
</div> </div>
<div className="tw-flex"> <div className="tw-flex tw-items-start">
{!currentRole?.defaultRole ? ( {!currentRole?.defaultRole ? (
<NonAdminAction <NonAdminAction
position="bottom" position="bottom"

View File

@ -31,6 +31,7 @@ import {
} from '../../axiosAPIs/tagAPI'; } from '../../axiosAPIs/tagAPI';
import { Button } from '../../components/buttons/Button/Button'; import { Button } from '../../components/buttons/Button/Button';
import Description from '../../components/common/description/Description'; import Description from '../../components/common/description/Description';
import Ellipses from '../../components/common/Ellipses/Ellipses';
import ErrorPlaceHolder from '../../components/common/error-with-placeholder/ErrorPlaceHolder'; import ErrorPlaceHolder from '../../components/common/error-with-placeholder/ErrorPlaceHolder';
import NonAdminAction from '../../components/common/non-admin-action/NonAdminAction'; import NonAdminAction from '../../components/common/non-admin-action/NonAdminAction';
import RichTextEditorPreviewer from '../../components/common/rich-text-editor/RichTextEditorPreviewer'; import RichTextEditorPreviewer from '../../components/common/rich-text-editor/RichTextEditorPreviewer';
@ -50,11 +51,13 @@ import {
} from '../../generated/api/tags/createTagCategory'; } from '../../generated/api/tags/createTagCategory';
import { Operation } from '../../generated/entity/policies/accessControl/rule'; import { Operation } from '../../generated/entity/policies/accessControl/rule';
import { TagCategory, TagClass } from '../../generated/entity/tags/tagCategory'; import { TagCategory, TagClass } from '../../generated/entity/tags/tagCategory';
import { EntityReference } from '../../generated/type/entityReference';
import { useAuth } from '../../hooks/authHooks'; import { useAuth } from '../../hooks/authHooks';
import jsonData from '../../jsons/en'; import jsonData from '../../jsons/en';
import { import {
getActiveCatClass, getActiveCatClass,
getCountBadge, getCountBadge,
getEntityName,
isEven, isEven,
isUrlFriendlyName, isUrlFriendlyName,
} from '../../utils/CommonUtils'; } from '../../utils/CommonUtils';
@ -448,9 +451,13 @@ const TagsPage = () => {
onClick={() => { onClick={() => {
fetchCurrentCategory(category.name); fetchCurrentCategory(category.name);
}}> }}>
<p className="tw-text-center tw-self-center tag-category label-category"> <Ellipses
{category.displayName ?? category.name} tooltip
</p> className="tag-category label-category tw-self-center tw-w-32"
data-testid="tag-name"
rows={1}>
{getEntityName(category as unknown as EntityReference)}
</Ellipses>
{getCountBadge( {getCountBadge(
currentCategory?.name === category.name currentCategory?.name === category.name

View File

@ -14,6 +14,7 @@
import { toLower } from 'lodash'; import { toLower } from 'lodash';
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Button } from '../../components/buttons/Button/Button'; import { Button } from '../../components/buttons/Button/Button';
import Ellipses from '../../components/common/Ellipses/Ellipses';
import Searchbar from '../../components/common/searchbar/Searchbar'; import Searchbar from '../../components/common/searchbar/Searchbar';
import { EntityReference as UserTeams } from '../../generated/entity/teams/user'; import { EntityReference as UserTeams } from '../../generated/entity/teams/user';
import { getEntityName } from '../../utils/CommonUtils'; import { getEntityName } from '../../utils/CommonUtils';
@ -96,10 +97,10 @@ const AddUsersModal = ({
<dialog className="tw-modal " data-testid="modal-container"> <dialog className="tw-modal " data-testid="modal-container">
<div className="tw-modal-backdrop" /> <div className="tw-modal-backdrop" />
<div className="tw-modal-container tw-max-h-90vh tw-max-w-3xl"> <div className="tw-modal-container tw-max-h-90vh tw-max-w-3xl">
<div className="tw-modal-header"> <div className="tw-modal-header" data-testid="header">
<p className="tw-modal-title" data-testid="header"> <Ellipses tooltip className="tw-modal-title">
{header} {header}
</p> </Ellipses>
</div> </div>
<div className="tw-modal-body"> <div className="tw-modal-body">
<Searchbar <Searchbar

View File

@ -17,6 +17,7 @@ import { capitalize } from 'lodash';
import React, { Fragment } from 'react'; import React, { Fragment } from 'react';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { useAuthContext } from '../../authentication/auth-provider/AuthProvider'; import { useAuthContext } from '../../authentication/auth-provider/AuthProvider';
import Ellipses from '../../components/common/Ellipses/Ellipses';
import NonAdminAction from '../../components/common/non-admin-action/NonAdminAction'; import NonAdminAction from '../../components/common/non-admin-action/NonAdminAction';
import ProfilePicture from '../../components/common/ProfilePicture/ProfilePicture'; import ProfilePicture from '../../components/common/ProfilePicture/ProfilePicture';
import { AssetsType, FqnPart } from '../../enums/entity.enum'; import { AssetsType, FqnPart } from '../../enums/entity.enum';
@ -187,7 +188,7 @@ const UserCard = ({
<span <span
className={classNames( className={classNames(
'tw-font-normal', 'tw-font-normal',
isActionVisible ? 'tw-truncate tw-w-32' : null, isActionVisible ? 'tw-w-32' : 'tw-w-52',
{ {
'tw-cursor-pointer hover:tw-underline': 'tw-cursor-pointer hover:tw-underline':
Boolean(onTitleClick), Boolean(onTitleClick),
@ -197,15 +198,17 @@ const UserCard = ({
onClick={() => { onClick={() => {
onTitleClick?.(item.fqn); onTitleClick?.(item.fqn);
}}> }}>
{item.displayName} <Ellipses tooltip>{item.displayName}</Ellipses>
</span> </span>
{item.name && item.name !== item.displayName && ( {item.name && item.name !== item.displayName && (
<span <span
className={classNames( className={classNames(
isActionVisible ? 'tw-truncate tw-w-32' : null isActionVisible ? 'tw-w-32' : 'tw-w-52'
)} )}
title={isIconVisible ? item.name : capitalize(item.name)}> title={isIconVisible ? item.name : capitalize(item.name)}>
{isIconVisible ? item.name : capitalize(item.name)} <Ellipses tooltip>
{isIconVisible ? item.name : capitalize(item.name)}
</Ellipses>
</span> </span>
)} )}
</Fragment> </Fragment>

View File

@ -496,7 +496,7 @@
/* New Feed Button style */ /* New Feed Button style */
.tw-refreshButton { .tw-refreshButton {
@apply tw-w-full tw-rounded tw-text-info tw-w-full tw-py-1 tw-rounded tw-bg-feed-background tw-border tw-border-feed hover:tw-bg-feed-hover; @apply tw-w-full tw-rounded tw-text-info tw-py-1 tw-bg-feed-background tw-border tw-border-feed hover:tw-bg-feed-hover;
box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.1); box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.1);
transition: background-color 100ms linear; transition: background-color 100ms linear;
} }
@ -510,4 +510,8 @@
top: 0.4rem; top: 0.4rem;
left: 1.3rem; left: 1.3rem;
} }
.tw-max-w-75 {
max-width: 75%;
}
} }