mirror of
https://github.com/documenso/documenso.git
synced 2025-11-13 08:13:56 +10:00
## Description Add support for teams which will allow users to collaborate on documents. Teams features allows users to: - Create, manage and transfer teams - Manage team members - Manage team emails - Manage a shared team inbox and documents These changes do NOT include the following, which are planned for a future release: - Team templates - Team API - Search menu integration ## Testing Performed - Added E2E tests for general team management - Added E2E tests to validate document counts ## Checklist - [X] I have tested these changes locally and they work as expected. - [X] I have added/updated tests that prove the effectiveness of these changes. - [ ] I have updated the documentation to reflect these changes, if applicable. - [X] I have followed the project's coding style guidelines.
85 lines
2.3 KiB
TypeScript
85 lines
2.3 KiB
TypeScript
'use client';
|
|
|
|
import * as React from 'react';
|
|
|
|
import * as AvatarPrimitive from '@radix-ui/react-avatar';
|
|
|
|
import { cn } from '../lib/utils';
|
|
|
|
const Avatar = React.forwardRef<
|
|
React.ElementRef<typeof AvatarPrimitive.Root>,
|
|
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>
|
|
>(({ className, ...props }, ref) => (
|
|
<AvatarPrimitive.Root
|
|
ref={ref}
|
|
className={cn('relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full', className)}
|
|
{...props}
|
|
/>
|
|
));
|
|
|
|
Avatar.displayName = AvatarPrimitive.Root.displayName;
|
|
|
|
const AvatarImage = React.forwardRef<
|
|
React.ElementRef<typeof AvatarPrimitive.Image>,
|
|
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>
|
|
>(({ className, ...props }, ref) => (
|
|
<AvatarPrimitive.Image
|
|
ref={ref}
|
|
className={cn('aspect-square h-full w-full', className)}
|
|
{...props}
|
|
/>
|
|
));
|
|
|
|
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
|
|
|
|
const AvatarFallback = React.forwardRef<
|
|
React.ElementRef<typeof AvatarPrimitive.Fallback>,
|
|
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>
|
|
>(({ className, ...props }, ref) => (
|
|
<AvatarPrimitive.Fallback
|
|
ref={ref}
|
|
className={cn(
|
|
'bg-muted flex h-full w-full items-center justify-center rounded-full',
|
|
className,
|
|
)}
|
|
{...props}
|
|
/>
|
|
));
|
|
|
|
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
|
|
|
|
type AvatarWithTextProps = {
|
|
avatarClass?: string;
|
|
avatarFallback: string;
|
|
className?: string;
|
|
primaryText: React.ReactNode;
|
|
secondaryText?: React.ReactNode;
|
|
rightSideComponent?: React.ReactNode;
|
|
};
|
|
|
|
const AvatarWithText = ({
|
|
avatarClass,
|
|
avatarFallback,
|
|
className,
|
|
primaryText,
|
|
secondaryText,
|
|
rightSideComponent,
|
|
}: AvatarWithTextProps) => (
|
|
<div className={cn('flex w-full max-w-xs items-center gap-2', className)}>
|
|
<Avatar
|
|
className={cn('dark:border-border h-10 w-10 border-2 border-solid border-white', avatarClass)}
|
|
>
|
|
<AvatarFallback className="text-xs text-gray-400">{avatarFallback}</AvatarFallback>
|
|
</Avatar>
|
|
|
|
<div className="flex flex-col text-left text-sm font-normal">
|
|
<span className="text-foreground truncate">{primaryText}</span>
|
|
<span className="text-muted-foreground truncate text-xs">{secondaryText}</span>
|
|
</div>
|
|
|
|
{rightSideComponent}
|
|
</div>
|
|
);
|
|
|
|
export { Avatar, AvatarImage, AvatarFallback, AvatarWithText };
|