This commit refactor the role management, removing the dependencies on account ids throughout our system. Changes include removing account id related attributes in the roles table schema and functions, modifying seed data and simplifying the role data provider code. This makes role structure more generic and simplifies the role handling process.
137 lines
4.2 KiB
TypeScript
137 lines
4.2 KiB
TypeScript
import { PlusCircle } from 'lucide-react';
|
|
|
|
import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client';
|
|
import {
|
|
AccountInvitationsTable,
|
|
AccountMembersTable,
|
|
InviteMembersDialogContainer,
|
|
} from '@kit/team-accounts/components';
|
|
import { Button } from '@kit/ui/button';
|
|
import {
|
|
Card,
|
|
CardContent,
|
|
CardDescription,
|
|
CardHeader,
|
|
CardTitle,
|
|
} from '@kit/ui/card';
|
|
import { If } from '@kit/ui/if';
|
|
import { PageBody } from '@kit/ui/page';
|
|
import { Trans } from '@kit/ui/trans';
|
|
|
|
import { createI18nServerInstance } from '~/lib/i18n/i18n.server';
|
|
import { withI18n } from '~/lib/i18n/with-i18n';
|
|
|
|
import { AccountLayoutHeader } from '../_components/account-layout-header';
|
|
import { loadMembersPageData } from './_lib/server/members-page.loader';
|
|
|
|
interface Params {
|
|
params: {
|
|
account: string;
|
|
};
|
|
}
|
|
|
|
export const generateMetadata = async () => {
|
|
const i18n = await createI18nServerInstance();
|
|
const title = i18n.t('teams:members.pageTitle');
|
|
|
|
return {
|
|
title,
|
|
};
|
|
};
|
|
|
|
async function TeamAccountMembersPage({ params }: Params) {
|
|
const client = getSupabaseServerComponentClient();
|
|
|
|
const [{ account }, members, invitations, user, canAddMember] =
|
|
await loadMembersPageData(client, params.account);
|
|
|
|
const canManageRoles = account.permissions.includes('roles.manage');
|
|
const canManageInvitations = account.permissions.includes('invites.manage');
|
|
|
|
const isPrimaryOwner = account.primary_owner_user_id === user.id;
|
|
const currentUserRoleHierarchy = account.role_hierarchy_level;
|
|
|
|
return (
|
|
<>
|
|
<AccountLayoutHeader
|
|
title={<Trans i18nKey={'common:membersTabLabel'} />}
|
|
description={<Trans i18nKey={'common:membersTabDescription'} />}
|
|
account={params.account}
|
|
/>
|
|
|
|
<PageBody>
|
|
<div
|
|
className={'mx-auto flex w-full max-w-3xl flex-col space-y-6 pb-32'}
|
|
>
|
|
<Card>
|
|
<CardHeader className={'flex flex-row justify-between'}>
|
|
<div className={'flex flex-col space-y-1.5'}>
|
|
<CardTitle>
|
|
<Trans i18nKey={'common:membersTabLabel'} />
|
|
</CardTitle>
|
|
|
|
<CardDescription>
|
|
<Trans i18nKey={'common:membersTabDescription'} />
|
|
</CardDescription>
|
|
</div>
|
|
|
|
<If condition={canManageInvitations && canAddMember}>
|
|
<InviteMembersDialogContainer
|
|
userRoleHierarchy={currentUserRoleHierarchy}
|
|
accountSlug={account.slug}
|
|
>
|
|
<Button size={'sm'} data-test={'invite-members-form-trigger'}>
|
|
<PlusCircle className={'mr-2 w-4'} />
|
|
|
|
<span>
|
|
<Trans i18nKey={'teams:inviteMembersButton'} />
|
|
</span>
|
|
</Button>
|
|
</InviteMembersDialogContainer>
|
|
</If>
|
|
</CardHeader>
|
|
|
|
<CardContent>
|
|
<AccountMembersTable
|
|
userRoleHierarchy={currentUserRoleHierarchy}
|
|
currentUserId={user.id}
|
|
currentAccountId={account.id}
|
|
members={members}
|
|
isPrimaryOwner={isPrimaryOwner}
|
|
canManageRoles={canManageRoles}
|
|
/>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
<Card>
|
|
<CardHeader className={'flex flex-row justify-between'}>
|
|
<div className={'flex flex-col space-y-1.5'}>
|
|
<CardTitle>
|
|
<Trans i18nKey={'teams:pendingInvitesHeading'} />
|
|
</CardTitle>
|
|
|
|
<CardDescription>
|
|
<Trans i18nKey={'teams:pendingInvitesDescription'} />
|
|
</CardDescription>
|
|
</div>
|
|
</CardHeader>
|
|
|
|
<CardContent>
|
|
<AccountInvitationsTable
|
|
permissions={{
|
|
canUpdateInvitation: canManageRoles,
|
|
canRemoveInvitation: canManageRoles,
|
|
currentUserRoleHierarchy,
|
|
}}
|
|
invitations={invitations}
|
|
/>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
</PageBody>
|
|
</>
|
|
);
|
|
}
|
|
|
|
export default withI18n(TeamAccountMembersPage);
|