diff --git a/apps/web/playwright/fixtures/users.ts b/apps/web/playwright/fixtures/users.ts index 26a4488d3c..4e5186616b 100644 --- a/apps/web/playwright/fixtures/users.ts +++ b/apps/web/playwright/fixtures/users.ts @@ -94,6 +94,7 @@ const createTeamEventType = async ( teamEventLength?: number; seatsPerTimeSlot?: number; managedEventUnlockedFields?: Record; + assignAllTeamMembers?: boolean; } ) => { return await prisma.eventType.create({ @@ -138,6 +139,7 @@ const createTeamEventType = async ( }, } : undefined, + assignAllTeamMembers: scenario?.assignAllTeamMembers, }, }); }; @@ -154,6 +156,7 @@ const createTeamAndAddUser = async ( index, orgRequestedSlug, schedulingType, + assignAllTeamMembersForSubTeamEvents, }: { user: { id: number; email: string; username: string | null; role?: MembershipRole }; isUnpublished?: boolean; @@ -165,6 +168,7 @@ const createTeamAndAddUser = async ( index?: number; orgRequestedSlug?: string; schedulingType?: SchedulingType; + assignAllTeamMembersForSubTeamEvents?: boolean; }, workerInfo: WorkerInfo ) => { @@ -193,6 +197,7 @@ const createTeamAndAddUser = async ( const team = await createTeamAndAddUser({ user }, workerInfo); await createTeamEventType(user, team, { schedulingType: schedulingType, + assignAllTeamMembers: assignAllTeamMembersForSubTeamEvents, }); await createTeamWorkflow(user, team); data.children = { connect: [{ id: team.id }] }; @@ -282,6 +287,8 @@ export const createUsersFixture = ( addManagedEventToTeamMates?: boolean; managedEventUnlockedFields?: Record; orgRequestedSlug?: string; + assignAllTeamMembers?: boolean; + assignAllTeamMembersForSubTeamEvents?: boolean; } = {} ) => { const _user = await prisma.user.create({ @@ -537,6 +544,7 @@ export const createUsersFixture = ( organizationId: opts?.organizationId, orgRequestedSlug: scenario.orgRequestedSlug, schedulingType: scenario.schedulingType, + assignAllTeamMembersForSubTeamEvents: scenario.assignAllTeamMembersForSubTeamEvents, }, workerInfo ); diff --git a/apps/web/playwright/team/team-invitation.e2e.ts b/apps/web/playwright/team/team-invitation.e2e.ts index 89a6706b93..0405d8e108 100644 --- a/apps/web/playwright/team/team-invitation.e2e.ts +++ b/apps/web/playwright/team/team-invitation.e2e.ts @@ -1,6 +1,8 @@ import { expect } from "@playwright/test"; import { WEBAPP_URL } from "@calcom/lib/constants"; +import { prisma } from "@calcom/prisma"; +import { MembershipRole, SchedulingType } from "@calcom/prisma/enums"; import { test } from "../lib/fixtures"; import { getInviteLink, localize } from "../lib/testUtils"; @@ -121,4 +123,60 @@ test.describe("Team", () => { ).toHaveCount(1); }); }); + + test("Invited member is assigned to existing managed event, after invitation is accepted", async ({ + page, + users, + }) => { + const t = await localize("en"); + const teamEventSlugAndTitle = "managed-event-test"; + const teamMatesObj = [{ name: "teammate-1" }, { name: "teammate-2" }]; + const teamOwner = await users.create( + { name: `team-owner-${Date.now()}` }, + { + hasTeam: true, + teamRole: MembershipRole.ADMIN, + teammates: teamMatesObj, + schedulingType: SchedulingType.MANAGED, + teamEventSlug: teamEventSlugAndTitle, + teamEventTitle: teamEventSlugAndTitle, + teamEventLength: 30, + addManagedEventToTeamMates: true, + assignAllTeamMembers: true, + } + ); + const invitedMember = await users.create({ + name: `invited-member-${Date.now()}`, + email: `invited-member-${Date.now()}@example.com`, + }); + const { team } = await teamOwner.getFirstTeamMembership(); + + await teamOwner.apiLogin(); + await page.goto(`/settings/teams/${team.id}/members`); + await page.getByTestId("new-member-button").click(); + await page.locator('input[name="inviteUser"]').fill(invitedMember.email); + await page.locator(`button:text("${t("send_invite")}")`).click(); + + await invitedMember.apiLogin(); + await page.goto(`/teams`); + await page.getByTestId(`accept-invitation-${team.id}`).click(); + const response = await page.waitForResponse("/api/trpc/teams/acceptOrLeave?batch=1"); + expect(response.status()).toBe(200); + await page.goto(`/event-types`); + + //ensure managed event-type is created for the invited member + await expect(page.locator(`text="${teamEventSlugAndTitle}"`)).toBeVisible(); + + //ensure the new event-type created for invited member is child of team event-type + const parentEventType = await prisma.eventType.findFirst({ + where: { + slug: teamEventSlugAndTitle, + teamId: team.id, + }, + select: { + children: true, + }, + }); + expect(parentEventType?.children.find((et) => et.userId === invitedMember.id)).toBeTruthy(); + }); }); diff --git a/packages/lib/server/queries/teams/index.ts b/packages/lib/server/queries/teams/index.ts index 5332c64524..f3def55a35 100644 --- a/packages/lib/server/queries/teams/index.ts +++ b/packages/lib/server/queries/teams/index.ts @@ -419,7 +419,9 @@ export async function updateNewTeamMemberEventTypes(userId: number, teamId: numb }, }); - const allManagedEventTypePropsZod = _EventTypeModel.pick(allManagedEventTypeProps); + const allManagedEventTypePropsZod = _EventTypeModel.pick(allManagedEventTypeProps).extend({ + bookingFields: _EventTypeModel.shape.bookingFields.nullish(), + }); eventTypesToAdd.length > 0 && (await prisma.$transaction( @@ -454,7 +456,7 @@ export async function updateNewTeamMemberEventTypes(userId: number, teamId: numb users: { connect: [{ id: userId }], }, - parentId: eventType.parentId, + parentId: eventType.id, hidden: false, workflows: currentWorkflowIds && { create: currentWorkflowIds.map((wfId) => ({ workflowId: wfId })),