change emailVerified column to icon

This commit is contained in:
Zai Shi 2024-05-16 23:01:40 +02:00
parent ca5dab17fa
commit 7a21ee2907
4 changed files with 44 additions and 15 deletions

View File

@ -15,10 +15,13 @@ import { Badge } from "@/components/ui/badge";
import { cn } from "@/lib/utils";
export function TextCell(props: { children: React.ReactNode, size?: number }) {
export function TextCell(props: { children: React.ReactNode, size?: number, icon?: React.ReactNode }) {
return (
<div className="text-ellipsis text-nowrap overflow-x-hidden" style={{ width: props.size }}>
{props.children}
<div className="flex items-center gap-2" style={{ width: props.size }}>
<div className="text-ellipsis text-nowrap overflow-x-hidden">
{props.children}
</div>
{props.icon && <div>{props.icon}</div>}
</div>
);
}

View File

@ -33,15 +33,17 @@ interface DataTableProps<TData, TValue> {
columns: ColumnDef<TData, TValue>[],
data: TData[],
toolbarRender?: (table: TableType<TData>) => React.ReactNode,
defaultVisibility?: VisibilityState,
}
export function DataTable<TData, TValue>({
columns,
data,
toolbarRender,
defaultVisibility,
}: DataTableProps<TData, TValue>) {
const [rowSelection, setRowSelection] = React.useState({});
const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({});
const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>(defaultVisibility || {});
const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>([]);
const [sorting, setSorting] = React.useState<SortingState>([]);

View File

@ -34,7 +34,7 @@ function RemoveUserDialog(props: {
onOpenChange={props.onOpenChange}
okButton={{
label: "Remove user from team",
onClick: async () => await props.team.removeUser(props.user.id)
onClick: async () => { await props.team.removeUser(props.user.id); }
}}
cancelButton
confirmText="I understand this will cause the user to lose access to the team."
@ -99,5 +99,10 @@ export function TeamMemberTable(props: { members: ServerTeamMember[], team: Serv
}).catch(console.error);
}, [props.members, props.team]);
return <DataTable data={extendedUsers} columns={teamMemberColumns} toolbarRender={teamMemberToolbarRender} />;
return <DataTable
data={extendedUsers}
columns={teamMemberColumns}
toolbarRender={teamMemberToolbarRender}
defaultVisibility={{ emailVerified: false }}
/>;
}

View File

@ -14,6 +14,8 @@ import { DateField, InputField, SwitchField } from "../form-fields";
import { ActionDialog } from "../action-dialog";
import Typography from "../ui/typography";
import { standardFilterFn } from "./elements/utils";
import { CircleAlert } from "lucide-react";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../ui/tooltip";
export type ExtendedServerUser = ServerUser & {
authType: string,
@ -85,7 +87,7 @@ function EditUserDialog(props: {
<DateField control={form.control} label="Signed Up At" name="signedUpAt" />
</>
)}
onSubmit={async (values) => await props.user.update(values)}
onSubmit={async (values) => { await props.user.update(values); }}
cancelButton
/>;
}
@ -153,18 +155,30 @@ export const commonUserColumns: ColumnDef<ExtendedServerUser>[] = [
{
accessorKey: "primaryEmail",
header: ({ column }) => <DataTableColumnHeader column={column} title="Primary Email" />,
cell: ({ row }) => <TextCell size={180}>{row.original.primaryEmail}</TextCell>,
cell: ({ row }) => <TextCell size={180} icon={row.original.emailVerified === "unverified" &&
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<CircleAlert className="text-zinc-500 h-4 w-4" />
</TooltipTrigger>
<TooltipContent>
Email not verified
</TooltipContent>
</Tooltip>
</TooltipProvider>}>
{row.original.primaryEmail}
</TextCell>,
},
{
accessorKey: "emailVerified",
header: ({ column }) => <DataTableColumnHeader column={column} title="Email Verified" />,
cell: ({ row }) => <TextCell>{row.original.emailVerified === 'verified' ? '✓' : '✗'}</TextCell>,
filterFn: standardFilterFn
},
];
const columns: ColumnDef<ExtendedServerUser>[] = [
...commonUserColumns,
{
accessorKey: "emailVerified",
header: ({ column }) => <DataTableColumnHeader column={column} title="Email Verified" />,
cell: ({ row }) => <TextCell>{row.original.emailVerified === 'verified' ? '✓' : ''}</TextCell>,
filterFn: standardFilterFn
},
{
accessorKey: "authType",
header: ({ column }) => <DataTableColumnHeader column={column} title="Auth Method" />,
@ -192,5 +206,10 @@ export function extendUsers(users: ServerUser[]): ExtendedServerUser[] {
export function UserTable(props: { users: ServerUser[] }) {
const extendedUsers: ExtendedServerUser[] = useMemo(() => extendUsers(props.users), [props.users]);
return <DataTable data={extendedUsers} columns={columns} toolbarRender={userToolbarRender} />;
return <DataTable
data={extendedUsers}
columns={columns}
toolbarRender={userToolbarRender}
defaultVisibility={{ emailVerified: false }}
/>;
}