Skip to content

Commit c336370

Browse files
authored
Merge branch 'main' into chore-companion-oidc-fix
2 parents f0533c1 + 2a7439b commit c336370

File tree

43 files changed

+1708
-345
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1708
-345
lines changed

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/SettingsLayoutAppDirClient.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ const getTabs = (orgBranding: OrganizationBranding | null) => {
9191
href: "/settings/organizations/general",
9292
trackingMetadata: { section: "organization", page: "general" },
9393
},
94+
{
95+
name: "guest_notifications",
96+
href: "/settings/organizations/guest-notifications",
97+
},
9498
...(orgBranding
9599
? [
96100
{
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { _generateMetadata, getTranslate } from "app/_utils";
2+
import { redirect } from "next/navigation";
3+
4+
import GuestNotificationsView from "@calcom/features/ee/organizations/pages/settings/guest-notifications";
5+
import { Resource } from "@calcom/features/pbac/domain/types/permission-registry";
6+
import { getResourcePermissions } from "@calcom/features/pbac/lib/resource-permissions";
7+
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
8+
import { MembershipRole } from "@calcom/prisma/enums";
9+
10+
import { validateUserHasOrg } from "../../actions/validateUserHasOrg";
11+
12+
export const generateMetadata = async () =>
13+
await _generateMetadata(
14+
(t) => t("guest_notifications"),
15+
(t) => t("guest_notifications_description"),
16+
undefined,
17+
undefined,
18+
"/settings/organizations/guest-notifications"
19+
);
20+
21+
const Page = async () => {
22+
const session = await validateUserHasOrg();
23+
const t = await getTranslate();
24+
25+
if (!session?.user.id || !session?.user.profile?.organizationId || !session?.user.org) {
26+
return redirect("/settings/profile");
27+
}
28+
29+
const { canRead, canEdit } = await getResourcePermissions({
30+
userId: session.user.id,
31+
teamId: session.user.profile.organizationId,
32+
resource: Resource.Organization,
33+
userRole: session.user.org.role,
34+
fallbackRoles: {
35+
read: {
36+
roles: [MembershipRole.MEMBER, MembershipRole.ADMIN, MembershipRole.OWNER],
37+
},
38+
update: {
39+
roles: [MembershipRole.ADMIN, MembershipRole.OWNER],
40+
},
41+
},
42+
});
43+
44+
if (!canRead) {
45+
return redirect("/settings/profile");
46+
}
47+
48+
return (
49+
<SettingsHeader title={t("guest_notifications")} description={t("guest_notifications_description")}>
50+
<GuestNotificationsView permissions={{ canRead, canEdit }} />
51+
</SettingsHeader>
52+
);
53+
};
54+
55+
export default Page;

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/teams/[id]/members/page.tsx

Lines changed: 8 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@ import { headers, cookies } from "next/headers";
55
import { redirect } from "next/navigation";
66

77
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
8-
import { Resource, CustomAction } from "@calcom/features/pbac/domain/types/permission-registry";
9-
import { getSpecificPermissions } from "@calcom/features/pbac/lib/resource-permissions";
8+
import { getTeamMemberPermissions } from "@calcom/features/pbac/lib/team-member-permissions";
109
import { RoleManagementFactory } from "@calcom/features/pbac/services/role-management.factory";
1110
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
1211
import { PrismaAttributeRepository } from "@calcom/lib/server/repository/PrismaAttributeRepository";
1312
import { prisma } from "@calcom/prisma";
14-
import { MembershipRole } from "@calcom/prisma/enums";
1513
import { viewerTeamsRouter } from "@calcom/trpc/server/routers/viewer/teams/_router";
1614

1715
import { buildLegacyRequest } from "@lib/buildLegacyCtx";
@@ -33,7 +31,7 @@ const getCachedTeamRoles = unstable_cache(
3331
try {
3432
const roleManager = await RoleManagementFactory.getInstance().createRoleManager(organizationId);
3533
return await roleManager.getTeamRoles(teamId);
36-
} catch (error) {
34+
} catch {
3735
// PBAC not enabled or error occurred, return empty array
3836
return [];
3937
}
@@ -49,7 +47,7 @@ const getCachedTeamAttributes = unstable_cache(
4947

5048
try {
5149
return await attributeRepo.findAllByOrgIdWithOptions({ orgId: organizationId });
52-
} catch (error) {
50+
} catch {
5351
return [];
5452
}
5553
},
@@ -79,65 +77,15 @@ const Page = async ({ params }: { params: Promise<{ id: string }> }) => {
7977
const organizationId = team.parentId || teamId;
8078

8179
// Load PBAC roles and attributes if available
82-
const [roles, attributes] = await Promise.all([
80+
const [roles, attributes, memberPermissions] = await Promise.all([
8381
getCachedTeamRoles(teamId, organizationId),
8482
getCachedTeamAttributes(organizationId),
83+
getTeamMemberPermissions({
84+
userId: session.user.id,
85+
team,
86+
}),
8587
]);
8688

87-
const fallbackRolesCanListMembers: MembershipRole[] = [MembershipRole.ADMIN, MembershipRole.OWNER];
88-
89-
// If the team is not private we allow members to list other members
90-
if (!team.isPrivate) {
91-
fallbackRolesCanListMembers.push(MembershipRole.MEMBER);
92-
}
93-
94-
// Get specific PBAC permissions for team member actions
95-
const permissions = await getSpecificPermissions({
96-
userId: session.user.id,
97-
teamId: teamId,
98-
resource: Resource.Team,
99-
userRole: team.membership.role,
100-
actions: [
101-
CustomAction.Invite,
102-
CustomAction.ChangeMemberRole,
103-
CustomAction.Remove,
104-
CustomAction.ListMembers,
105-
CustomAction.ListMembersPrivate,
106-
CustomAction.Impersonate,
107-
],
108-
fallbackRoles: {
109-
[CustomAction.Invite]: {
110-
roles: [MembershipRole.ADMIN, MembershipRole.OWNER],
111-
},
112-
[CustomAction.ChangeMemberRole]: {
113-
roles: [MembershipRole.ADMIN, MembershipRole.OWNER],
114-
},
115-
[CustomAction.Remove]: {
116-
roles: [MembershipRole.ADMIN, MembershipRole.OWNER],
117-
},
118-
[CustomAction.ListMembers]: {
119-
roles: fallbackRolesCanListMembers,
120-
},
121-
[CustomAction.Impersonate]: {
122-
roles: [MembershipRole.ADMIN, MembershipRole.OWNER],
123-
},
124-
[CustomAction.ListMembersPrivate]: {
125-
roles: fallbackRolesCanListMembers,
126-
},
127-
},
128-
});
129-
130-
// Map specific permissions to member actions
131-
const memberPermissions = {
132-
canListMembers: team.isPrivate
133-
? permissions[CustomAction.ListMembersPrivate]
134-
: permissions[CustomAction.ListMembers],
135-
canInvite: permissions[CustomAction.Invite],
136-
canChangeMemberRole: permissions[CustomAction.ChangeMemberRole],
137-
canRemove: permissions[CustomAction.Remove],
138-
canImpersonate: permissions[CustomAction.Impersonate],
139-
};
140-
14189
const facetedTeamValues = {
14290
roles,
14391
teams: [team],

apps/web/modules/videos/views/videos-single-view.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,8 @@ export function LogInOverlay(props: LogInOverlayProps) {
445445
<DialogContent
446446
title={t("join_video_call")}
447447
description={t("choose_how_you_d_like_to_appear_on_the_call")}
448-
className="p-6 sm:max-w-lg">
448+
className="p-6 sm:max-w-lg"
449+
onInteractOutside={(e) => e.preventDefault()}>
449450
<div className="mt-2 pb-4">
450451
<div className="stack-y-4">
451452
<div>
@@ -516,7 +517,7 @@ export function LogInOverlay(props: LogInOverlayProps) {
516517
{/* Divider */}
517518
<hr className="my-6 h-0.5 border-t-0 bg-neutral-100 dark:bg-white/10" />
518519

519-
<div className="mt-5 stack-y-4">
520+
<div className="stack-y-4 mt-5">
520521
<div>
521522
<h4 className="text-base font-semibold text-black dark:text-white">
522523
{t("sign_in_to_cal_com")}
@@ -568,7 +569,7 @@ export function VideoMeetingInfo(props: VideoMeetingInfo) {
568569
"no-scrollbar fixed left-0 top-0 z-30 flex h-full w-64 transform justify-between overflow-x-hidden overflow-y-scroll transition-all duration-300 ease-in-out",
569570
open ? "translate-x-0" : "-translate-x-[232px]"
570571
)}>
571-
<main className="prose-sm prose max-w-64 prose-a:text-white prose-h3:text-white prose-h3:font-cal scroll-bar scrollbar-track-w-20 w-full overflow-scroll overflow-x-hidden! border-r border-gray-300/20 bg-default p-4 text-white shadow-sm backdrop-blur-lg">
572+
<main className="prose-sm prose max-w-64 prose-a:text-white prose-h3:text-white prose-h3:font-cal scroll-bar scrollbar-track-w-20 overflow-x-hidden! bg-default w-full overflow-scroll border-r border-gray-300/20 p-4 text-white shadow-sm backdrop-blur-lg">
572573
<h3>{t("what")}:</h3>
573574
<p>{booking.title}</p>
574575
<h3>{t("invitee_timezone")}:</h3>

0 commit comments

Comments
 (0)