mirror of
https://github.com/kremalicious/umami.git
synced 2025-02-01 12:29:35 +01:00
add team manager role
This commit is contained in:
parent
ca2a7f3354
commit
9c06bc9893
@ -40,6 +40,9 @@ export function TeamMemberEditForm({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const renderValue = (value: string) => {
|
const renderValue = (value: string) => {
|
||||||
|
if (value === ROLES.teamManager) {
|
||||||
|
return formatMessage(labels.manager);
|
||||||
|
}
|
||||||
if (value === ROLES.teamMember) {
|
if (value === ROLES.teamMember) {
|
||||||
return formatMessage(labels.member);
|
return formatMessage(labels.member);
|
||||||
}
|
}
|
||||||
@ -58,6 +61,7 @@ export function TeamMemberEditForm({
|
|||||||
minWidth: '250px',
|
minWidth: '250px',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
<Item key={ROLES.teamManager}>{formatMessage(labels.manager)}</Item>
|
||||||
<Item key={ROLES.teamMember}>{formatMessage(labels.member)}</Item>
|
<Item key={ROLES.teamMember}>{formatMessage(labels.member)}</Item>
|
||||||
<Item key={ROLES.teamViewOnly}>{formatMessage(labels.viewOnly)}</Item>
|
<Item key={ROLES.teamViewOnly}>{formatMessage(labels.viewOnly)}</Item>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
|
@ -12,8 +12,10 @@ export function TeamMembersPage({ teamId }: { teamId: string }) {
|
|||||||
const { formatMessage, labels } = useMessages();
|
const { formatMessage, labels } = useMessages();
|
||||||
|
|
||||||
const canEdit =
|
const canEdit =
|
||||||
team?.teamUser?.find(({ userId, role }) => role === ROLES.teamOwner && userId === user.id) &&
|
team?.teamUser?.find(
|
||||||
user.role !== ROLES.viewOnly;
|
({ userId, role }) =>
|
||||||
|
(role === ROLES.teamOwner || role === ROLES.teamManager) && userId === user.id,
|
||||||
|
) && user.role !== ROLES.viewOnly;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
@ -19,6 +19,7 @@ export function TeamMembersTable({
|
|||||||
|
|
||||||
const roles = {
|
const roles = {
|
||||||
[ROLES.teamOwner]: formatMessage(labels.teamOwner),
|
[ROLES.teamOwner]: formatMessage(labels.teamOwner),
|
||||||
|
[ROLES.teamManager]: formatMessage(labels.teamManager),
|
||||||
[ROLES.teamMember]: formatMessage(labels.teamMember),
|
[ROLES.teamMember]: formatMessage(labels.teamMember),
|
||||||
[ROLES.teamViewOnly]: formatMessage(labels.viewOnly),
|
[ROLES.teamViewOnly]: formatMessage(labels.viewOnly),
|
||||||
};
|
};
|
||||||
|
@ -15,18 +15,24 @@ export function TeamDetails({ teamId }: { teamId: string }) {
|
|||||||
const { user } = useLogin();
|
const { user } = useLogin();
|
||||||
const [tab, setTab] = useState('details');
|
const [tab, setTab] = useState('details');
|
||||||
|
|
||||||
const canEdit =
|
const isTeamOwner =
|
||||||
!!team?.teamUser?.find(({ userId, role }) => role === ROLES.teamOwner && userId === user.id) &&
|
!!team?.teamUser?.find(({ userId, role }) => role === ROLES.teamOwner && userId === user.id) &&
|
||||||
user.role !== ROLES.viewOnly;
|
user.role !== ROLES.viewOnly;
|
||||||
|
|
||||||
|
const canEdit =
|
||||||
|
!!team?.teamUser?.find(
|
||||||
|
({ userId, role }) =>
|
||||||
|
(role === ROLES.teamOwner || role === ROLES.teamManager) && userId === user.id,
|
||||||
|
) && user.role !== ROLES.viewOnly;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flexbox direction="column">
|
<Flexbox direction="column">
|
||||||
<PageHeader title={team?.name} icon={<Icons.Users />}>
|
<PageHeader title={team?.name} icon={<Icons.Users />}>
|
||||||
{!canEdit && <TeamLeaveButton teamId={team.id} teamName={team.name} />}
|
{!isTeamOwner && <TeamLeaveButton teamId={team.id} teamName={team.name} />}
|
||||||
</PageHeader>
|
</PageHeader>
|
||||||
<Tabs selectedKey={tab} onSelect={(value: any) => setTab(value)} style={{ marginBottom: 30 }}>
|
<Tabs selectedKey={tab} onSelect={(value: any) => setTab(value)} style={{ marginBottom: 30 }}>
|
||||||
<Item key="details">{formatMessage(labels.details)}</Item>
|
<Item key="details">{formatMessage(labels.details)}</Item>
|
||||||
{canEdit && <Item key="manage">{formatMessage(labels.manage)}</Item>}
|
{isTeamOwner && <Item key="manage">{formatMessage(labels.manage)}</Item>}
|
||||||
</Tabs>
|
</Tabs>
|
||||||
{tab === 'details' && <TeamEditForm teamId={teamId} allowEdit={canEdit} />}
|
{tab === 'details' && <TeamEditForm teamId={teamId} allowEdit={canEdit} />}
|
||||||
{tab === 'manage' && <TeamManage teamId={teamId} />}
|
{tab === 'manage' && <TeamManage teamId={teamId} />}
|
||||||
|
@ -29,6 +29,7 @@ export const labels = defineMessages({
|
|||||||
createdBy: { id: 'label.created-by', defaultMessage: 'Created By' },
|
createdBy: { id: 'label.created-by', defaultMessage: 'Created By' },
|
||||||
edit: { id: 'label.edit', defaultMessage: 'Edit' },
|
edit: { id: 'label.edit', defaultMessage: 'Edit' },
|
||||||
name: { id: 'label.name', defaultMessage: 'Name' },
|
name: { id: 'label.name', defaultMessage: 'Name' },
|
||||||
|
manager: { id: 'label.manager', defaultMessage: 'Manager' },
|
||||||
member: { id: 'label.member', defaultMessage: 'Member' },
|
member: { id: 'label.member', defaultMessage: 'Member' },
|
||||||
members: { id: 'label.members', defaultMessage: 'Members' },
|
members: { id: 'label.members', defaultMessage: 'Members' },
|
||||||
accessCode: { id: 'label.access-code', defaultMessage: 'Access code' },
|
accessCode: { id: 'label.access-code', defaultMessage: 'Access code' },
|
||||||
@ -43,6 +44,7 @@ export const labels = defineMessages({
|
|||||||
settings: { id: 'label.settings', defaultMessage: 'Settings' },
|
settings: { id: 'label.settings', defaultMessage: 'Settings' },
|
||||||
owner: { id: 'label.owner', defaultMessage: 'Owner' },
|
owner: { id: 'label.owner', defaultMessage: 'Owner' },
|
||||||
teamOwner: { id: 'label.team-owner', defaultMessage: 'Team owner' },
|
teamOwner: { id: 'label.team-owner', defaultMessage: 'Team owner' },
|
||||||
|
teamManager: { id: 'label.team-manager', defaultMessage: 'Team manager' },
|
||||||
teamMember: { id: 'label.team-member', defaultMessage: 'Team member' },
|
teamMember: { id: 'label.team-member', defaultMessage: 'Team member' },
|
||||||
teamViewOnly: { id: 'label.team-view-only', defaultMessage: 'Team view only' },
|
teamViewOnly: { id: 'label.team-view-only', defaultMessage: 'Team view only' },
|
||||||
enableShareUrl: { id: 'label.enable-share-url', defaultMessage: 'Enable share URL' },
|
enableShareUrl: { id: 'label.enable-share-url', defaultMessage: 'Enable share URL' },
|
||||||
|
@ -38,7 +38,11 @@ export function PagesTable({ allowFilter, domainName, ...props }: PagesTableProp
|
|||||||
id={view}
|
id={view}
|
||||||
value={x}
|
value={x}
|
||||||
label={!x && formatMessage(labels.none)}
|
label={!x && formatMessage(labels.none)}
|
||||||
externalUrl={`${domainName.startsWith('http') ? domainName : `https://${domainName}`}${x}`}
|
externalUrl={
|
||||||
|
view === 'url'
|
||||||
|
? `${domainName.startsWith('http') ? domainName : `https://${domainName}`}${x}`
|
||||||
|
: null
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -132,6 +132,7 @@ export const ROLES = {
|
|||||||
user: 'user',
|
user: 'user',
|
||||||
viewOnly: 'view-only',
|
viewOnly: 'view-only',
|
||||||
teamOwner: 'team-owner',
|
teamOwner: 'team-owner',
|
||||||
|
teamManager: 'team-manager',
|
||||||
teamMember: 'team-member',
|
teamMember: 'team-member',
|
||||||
teamViewOnly: 'team-view-only',
|
teamViewOnly: 'team-view-only',
|
||||||
} as const;
|
} as const;
|
||||||
@ -162,6 +163,12 @@ export const ROLE_PERMISSIONS = {
|
|||||||
PERMISSIONS.websiteUpdate,
|
PERMISSIONS.websiteUpdate,
|
||||||
PERMISSIONS.websiteDelete,
|
PERMISSIONS.websiteDelete,
|
||||||
],
|
],
|
||||||
|
[ROLES.teamManager]: [
|
||||||
|
PERMISSIONS.teamUpdate,
|
||||||
|
PERMISSIONS.websiteCreate,
|
||||||
|
PERMISSIONS.websiteUpdate,
|
||||||
|
PERMISSIONS.websiteDelete,
|
||||||
|
],
|
||||||
[ROLES.teamMember]: [
|
[ROLES.teamMember]: [
|
||||||
PERMISSIONS.websiteCreate,
|
PERMISSIONS.websiteCreate,
|
||||||
PERMISSIONS.websiteUpdate,
|
PERMISSIONS.websiteUpdate,
|
||||||
|
@ -23,7 +23,7 @@ const schema = {
|
|||||||
POST: yup.object().shape({
|
POST: yup.object().shape({
|
||||||
role: yup
|
role: yup
|
||||||
.string()
|
.string()
|
||||||
.matches(/team-member|team-view-only/i)
|
.matches(/team-member|team-view-only|team-manager/i)
|
||||||
.required(),
|
.required(),
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
@ -25,7 +25,7 @@ const schema = {
|
|||||||
userId: yup.string().uuid().required(),
|
userId: yup.string().uuid().required(),
|
||||||
role: yup
|
role: yup
|
||||||
.string()
|
.string()
|
||||||
.matches(/team-member|team-view-only/i)
|
.matches(/team-member|team-view-only|team-manager/i)
|
||||||
.required(),
|
.required(),
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user