fix: truncation of titles to fix UI breaks (#1162)

Updates various areas of the application to handle longer titles and content
more gracefully.
This commit is contained in:
rhit-daviscl
2024-07-28 23:13:35 -04:00
committed by GitHub
parent 71a8a3eaa6
commit f31caaab08
9 changed files with 43 additions and 17 deletions

View File

@ -133,7 +133,12 @@ export const DocumentPageViewRecentActivity = ({
))} ))}
</div> </div>
<p className="text-muted-foreground dark:text-muted-foreground/70 flex-auto py-0.5 text-xs leading-5"> <p
className="text-muted-foreground dark:text-muted-foreground/70 flex-auto truncate py-0.5 text-xs leading-5"
title={`${formatDocumentAuditLogAction(auditLog, userId).prefix} ${
formatDocumentAuditLogAction(auditLog, userId).description
}`}
>
<span className="text-foreground font-medium"> <span className="text-foreground font-medium">
{formatDocumentAuditLogAction(auditLog, userId).prefix} {formatDocumentAuditLogAction(auditLog, userId).prefix}
</span>{' '} </span>{' '}

View File

@ -110,7 +110,7 @@ export const DocumentPageView = async ({ params, team }: DocumentPageViewProps)
Documents Documents
</Link> </Link>
<div className="flex flex-row justify-between"> <div className="flex flex-row justify-between truncate">
<div> <div>
<h1 className="mt-4 truncate text-2xl font-semibold md:text-3xl" title={document.title}> <h1 className="mt-4 truncate text-2xl font-semibold md:text-3xl" title={document.title}>
{document.title} {document.title}

View File

@ -117,7 +117,7 @@ export const DocumentLogsPageView = async ({ params, team }: DocumentLogsPageVie
Document Document
</Link> </Link>
<div className="flex flex-col justify-between sm:flex-row"> <div className="flex flex-col justify-between truncate sm:flex-row">
<div> <div>
<h1 className="mt-4 truncate text-2xl font-semibold md:text-3xl" title={document.title}> <h1 className="mt-4 truncate text-2xl font-semibold md:text-3xl" title={document.title}>
{document.title} {document.title}

View File

@ -178,7 +178,7 @@ export const NameField = ({ field, recipient, onSignField, onUnsignField }: Name
<DialogContent> <DialogContent>
<DialogTitle> <DialogTitle>
Sign as {recipient.name}{' '} Sign as {recipient.name}{' '}
<span className="text-muted-foreground">({recipient.email})</span> <div className="text-muted-foreground">({recipient.email})</div>
</DialogTitle> </DialogTitle>
<div> <div>

View File

@ -214,7 +214,7 @@ export const SignatureField = ({
<DialogContent> <DialogContent>
<DialogTitle> <DialogTitle>
Sign as {recipient.name}{' '} Sign as {recipient.name}{' '}
<span className="text-muted-foreground">({recipient.email})</span> <div className="text-muted-foreground h-5">({recipient.email})</div>
</DialogTitle> </DialogTitle>
<div className=""> <div className="">

View File

@ -20,7 +20,6 @@ import { ElementVisible } from '@documenso/ui/primitives/element-visible';
import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer';
import { DocumentReadOnlyFields } from '~/components/document/document-read-only-fields'; import { DocumentReadOnlyFields } from '~/components/document/document-read-only-fields';
import { truncateTitle } from '~/helpers/truncate-title';
import { CheckboxField } from './checkbox-field'; import { CheckboxField } from './checkbox-field';
import { DateField } from './date-field'; import { DateField } from './date-field';
@ -46,24 +45,28 @@ export const SigningPageView = ({
fields, fields,
completedFields, completedFields,
}: SigningPageViewProps) => { }: SigningPageViewProps) => {
const truncatedTitle = truncateTitle(document.title);
const { documentData, documentMeta } = document; const { documentData, documentMeta } = document;
return ( return (
<div className="mx-auto w-full max-w-screen-xl"> <div className="mx-auto w-full max-w-screen-xl">
<h1 className="mt-4 truncate text-2xl font-semibold md:text-3xl" title={document.title}> <h1 className="mt-4 truncate text-2xl font-semibold md:text-3xl" title={document.title}>
{truncatedTitle} {document.title}
</h1> </h1>
<div className="mt-2.5 flex items-center gap-x-6"> <div className="mt-2.5 flex items-center gap-x-6">
<p
className="text-muted-foreground truncate"
title={document.User.name ? document.User.name : ''}
>
{document.User.name}
</p>
</div>
<p className="text-muted-foreground"> <p className="text-muted-foreground">
{document.User.name} ({document.User.email}) has invited you to{' '} ({document.User.email}) has invited you to{' '}
{recipient.role === RecipientRole.VIEWER && 'view'} {recipient.role === RecipientRole.VIEWER && 'view'}
{recipient.role === RecipientRole.SIGNER && 'sign'} {recipient.role === RecipientRole.SIGNER && 'sign'}
{recipient.role === RecipientRole.APPROVER && 'approve'} this document. {recipient.role === RecipientRole.APPROVER && 'approve'} this document.
</p> </p>
</div>
<div className="mt-8 grid grid-cols-12 gap-y-8 lg:gap-x-8 lg:gap-y-0"> <div className="mt-8 grid grid-cols-12 gap-y-8 lg:gap-x-8 lg:gap-y-0">
<Card <Card

View File

@ -4,6 +4,7 @@ import { type HTMLAttributes, useEffect, useState } from 'react';
import Link from 'next/link'; import Link from 'next/link';
import { useParams } from 'next/navigation'; import { useParams } from 'next/navigation';
import { usePathname } from 'next/navigation';
import { MenuIcon, SearchIcon } from 'lucide-react'; import { MenuIcon, SearchIcon } from 'lucide-react';
@ -41,6 +42,18 @@ export const Header = ({ className, user, teams, ...props }: HeaderProps) => {
return () => window.removeEventListener('scroll', onScroll); return () => window.removeEventListener('scroll', onScroll);
}, []); }, []);
const pathname = usePathname();
const isPathTeamUrl = (teamUrl: string) => {
if (!pathname || !pathname.startsWith(`/t/`)) {
return false;
}
return pathname.split('/')[2] === teamUrl;
};
const selectedTeam = teams?.find((team) => isPathTeamUrl(team.url));
return ( return (
<header <header
className={cn( className={cn(
@ -60,7 +73,10 @@ export const Header = ({ className, user, teams, ...props }: HeaderProps) => {
<DesktopNav setIsCommandMenuOpen={setIsCommandMenuOpen} /> <DesktopNav setIsCommandMenuOpen={setIsCommandMenuOpen} />
<div className="flex gap-x-4 md:ml-8"> <div
className="flex gap-x-4 md:ml-8"
title={selectedTeam ? selectedTeam.name : user.name ?? ''}
>
<MenuSwitcher user={user} teams={teams} /> <MenuSwitcher user={user} teams={teams} />
</div> </div>

View File

@ -78,7 +78,9 @@ const AvatarWithText = ({
<AvatarFallback className="text-xs text-gray-400">{avatarFallback}</AvatarFallback> <AvatarFallback className="text-xs text-gray-400">{avatarFallback}</AvatarFallback>
</Avatar> </Avatar>
<div className={cn('flex flex-col text-left text-sm font-normal', textSectionClassName)}> <div
className={cn('flex flex-col truncate text-left text-sm font-normal', textSectionClassName)}
>
<span className="text-foreground truncate">{primaryText}</span> <span className="text-foreground truncate">{primaryText}</span>
<span className="text-muted-foreground truncate text-xs">{secondaryText}</span> <span className="text-muted-foreground truncate text-xs">{secondaryText}</span>
</div> </div>

View File

@ -113,7 +113,7 @@ const DialogTitle = React.forwardRef<
>(({ className, ...props }, ref) => ( >(({ className, ...props }, ref) => (
<DialogPrimitive.Title <DialogPrimitive.Title
ref={ref} ref={ref}
className={cn('text-lg font-semibold leading-none tracking-tight', className)} className={cn('truncate text-lg font-semibold leading-none tracking-tight', className)}
{...props} {...props}
/> />
)); ));