{t("managed_event")}
{t("managed_event_description")}
diff --git a/packages/features/eventtypes/components/CreateEventTypeDialog.tsx b/packages/features/eventtypes/components/CreateEventTypeDialog.tsx
index 9b8147f65c..cae2fc70af 100644
--- a/packages/features/eventtypes/components/CreateEventTypeDialog.tsx
+++ b/packages/features/eventtypes/components/CreateEventTypeDialog.tsx
@@ -2,7 +2,6 @@ import { isValidPhoneNumber } from "libphonenumber-js";
import { useRouter } from "next/navigation";
import { z } from "zod";
-import { checkAdminOrOwner } from "@calcom/features/auth/lib/checkAdminOrOwner";
import { Dialog } from "@calcom/features/components/controlled-dialog";
import { useOrgBranding } from "@calcom/features/ee/organizations/context/provider";
import { TeamEventTypeForm } from "@calcom/features/ee/teams/components/TeamEventTypeForm";
@@ -28,6 +27,17 @@ export interface EventTypeParent {
image?: string | null;
}
+export interface ProfileOption {
+ teamId: number | null | undefined;
+ label: string | null;
+ image: string;
+ membershipRole: MembershipRole | null | undefined;
+ slug: string | null;
+ permissions: {
+ canCreateEventType: boolean;
+ };
+}
+
const locationFormSchema = z.array(
z.object({
locationType: z.string(),
@@ -55,16 +65,7 @@ const querySchema = z.object({
.optional(),
});
-export default function CreateEventTypeDialog({
- profileOptions,
-}: {
- profileOptions: {
- teamId: number | null | undefined;
- label: string | null;
- image: string | undefined;
- membershipRole: MembershipRole | null | undefined;
- }[];
-}) {
+export function CreateEventTypeDialog({ profileOptions }: { profileOptions: ProfileOption[] }) {
const { t } = useLocale();
const router = useRouter();
const orgBranding = useOrgBranding();
@@ -75,7 +76,7 @@ export default function CreateEventTypeDialog({
const teamProfile = profileOptions.find((profile) => profile.teamId === teamId);
- const isTeamAdminOrOwner = teamId !== undefined && checkAdminOrOwner(teamProfile?.membershipRole);
+ const permissions = teamProfile?.permissions ?? { canCreateEventType: false };
const onSuccessMutation = (eventType: EventType) => {
router.replace(`/event-types/${eventType.id}${teamId ? "?tabName=team" : ""}`);
@@ -124,7 +125,7 @@ export default function CreateEventTypeDialog({
import("./EventTypeDescription"));
diff --git a/packages/platform/atoms/event-types/wrappers/CreateEventTypePlatformWrapper.tsx b/packages/platform/atoms/event-types/wrappers/CreateEventTypePlatformWrapper.tsx
index f25cc8f676..2fca4b7232 100644
--- a/packages/platform/atoms/event-types/wrappers/CreateEventTypePlatformWrapper.tsx
+++ b/packages/platform/atoms/event-types/wrappers/CreateEventTypePlatformWrapper.tsx
@@ -77,12 +77,16 @@ export const CreateEventTypePlatformWrapper = ({
const team = teams?.find((t) => t.id === teamId);
const { t } = useLocale();
+ const permissions = {
+ canCreateEventType: team?.role === "ADMIN" || team?.role === "OWNER",
+ };
+
return teamId && team ? (
const profileProcessor = new ProfilePermissionProcessor();
const profiles = profileProcessor.processProfiles(eventTypeGroups, teamPermissionsMap);
+ const permissionCheckService = new PermissionCheckService();
+
+ const teamIdsToCheck = filteredEventTypeGroups
+ .map((group) => group.teamId)
+ .filter((teamId): teamId is number => teamId !== null && teamId !== undefined);
+
+ const teamPermissionChecks = teamIdsToCheck.map(async (teamId) => {
+ const canCreateEventType = await permissionCheckService.checkPermission({
+ userId: user.id,
+ teamId: teamId,
+ permission: "eventType.create",
+ fallbackRoles: [MembershipRole.OWNER, MembershipRole.ADMIN],
+ });
+ return {
+ teamId,
+ permissions: {
+ canCreateEventType,
+ },
+ };
+ });
+
+ const teamPermissionsArray = await Promise.all(teamPermissionChecks);
+ const teamPermissions = teamPermissionsArray.reduce((acc, item) => {
+ acc[item.teamId] = item.permissions;
+ return acc;
+ }, {} as Record);
+
return {
eventTypeGroups: filteredEventTypeGroups,
profiles,
+ teamPermissions,
};
};