mirror of
https://github.com/documenso/documenso.git
synced 2025-11-13 08:13:56 +10:00
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:
@ -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>{' '}
|
||||||
|
|||||||
@ -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}
|
||||||
|
|||||||
@ -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}
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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="">
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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}
|
||||||
/>
|
/>
|
||||||
));
|
));
|
||||||
|
|||||||
Reference in New Issue
Block a user