diff --git a/apps/web/components/dialog/ReassignDialog.tsx b/apps/web/components/dialog/ReassignDialog.tsx index 20d2766e2b..e966c397ac 100644 --- a/apps/web/components/dialog/ReassignDialog.tsx +++ b/apps/web/components/dialog/ReassignDialog.tsx @@ -135,7 +135,13 @@ export const ReassignDialog = ({ isOpenDialog, setIsOpenDialog, teamId, bookingI }, }); - const [showConfirmation, setShowConfirmation] = useState(false); + const [confirmationModal, setConfirmationModal] = useState<{ + show: boolean; + membersStatus: "unavailable" | "available" | null; + }>({ + show: false, + membersStatus: null, + }); const handleSubmit = (values: FormValues) => { if (values.reassignType === "round_robin") { @@ -143,13 +149,10 @@ export const ReassignDialog = ({ isOpenDialog, setIsOpenDialog, teamId, bookingI } else { if (values.teamMemberId) { const selectedMember = teamMemberOptions?.find((member) => member.value === values.teamMemberId); - if (selectedMember && selectedMember.status === "unavailable") { - setShowConfirmation(true); - } else { - roundRobinManualReassignMutation.mutate({ - bookingId, - teamMemberId: values.teamMemberId, - reassignReason: values.reassignReason, + if (selectedMember) { + setConfirmationModal({ + show: true, + membersStatus: selectedMember.status as "available" | "unavailable", }); } } @@ -263,10 +266,16 @@ export const ReassignDialog = ({ isOpenDialog, setIsOpenDialog, teamId, bookingI - + setConfirmationModal({ ...confirmationModal, show: open })}> { @@ -279,14 +288,21 @@ export const ReassignDialog = ({ isOpenDialog, setIsOpenDialog, teamId, bookingI teamMemberId, reassignReason: form.getValues("reassignReason"), }); - setShowConfirmation(false); + setConfirmationModal({ + show: false, + membersStatus: null, + }); }}> -

{t("reassign_unavailable_team_member_description")}

+

+ {confirmationModal?.membersStatus === "unavailable" + ? t("reassign_unavailable_team_member_description") + : t("reassign_available_team_member_description")} +

form.setValue("reassignReason", e.target.value)} - required + required={confirmationModal?.membersStatus === "unavailable"} />
diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index 06e4989743..4d8639b0e1 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -2708,7 +2708,9 @@ "you_dont_have_access_to_reroute_this_booking": "You don't have access to reroute this booking", "form_response_not_found": "Form response not found", "confirm_reassign_unavailable": "Host unavailable", + "confirm_reassign_available": "Host available", "reassign_unavailable_team_member_description": "Are you sure you want to reassign this booking to an unavailable host?", + "reassign_available_team_member_description": "Are you sure you want to reassign this booking?", "yes_reassign": "Yes, reassign", "reassign_reason": "Reason for reassigning", "reassigned_by": "Reassigned by", diff --git a/packages/features/ee/round-robin/roundRobinManualReassignment.ts b/packages/features/ee/round-robin/roundRobinManualReassignment.ts index e46f957d2a..3184cc906f 100644 --- a/packages/features/ee/round-robin/roundRobinManualReassignment.ts +++ b/packages/features/ee/round-robin/roundRobinManualReassignment.ts @@ -42,11 +42,13 @@ export const roundRobinManualReassignment = async ({ newUserId, orgId, reassignReason, + reassignedById, }: { bookingId: number; newUserId: number; orgId: number | null; reassignReason?: string; + reassignedById: number; }) => { const roundRobinReassignLogger = logger.getSubLogger({ prefix: ["roundRobinManualReassign", `${bookingId}`], @@ -164,6 +166,7 @@ export const roundRobinManualReassignment = async ({ title: newBookingTitle, userPrimaryEmail: newUser.email, reassignReason, + reassignById: reassignedById, }, select: bookingSelect, }); diff --git a/packages/lib/test/builder.ts b/packages/lib/test/builder.ts index b040bc001e..cb4101d752 100644 --- a/packages/lib/test/builder.ts +++ b/packages/lib/test/builder.ts @@ -64,6 +64,7 @@ export const buildBooking = ( fromReschedule: null, recurringEventId: null, smsReminderNumber: null, + reassignById: null, scheduledJobs: [], metadata: null, responses: null, diff --git a/packages/prisma/migrations/20241031084229_add_reassign_by_column_to_booking/migration.sql b/packages/prisma/migrations/20241031084229_add_reassign_by_column_to_booking/migration.sql new file mode 100644 index 0000000000..2041ecde88 --- /dev/null +++ b/packages/prisma/migrations/20241031084229_add_reassign_by_column_to_booking/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "Booking" ADD COLUMN "reassignById" INTEGER; + +-- AddForeignKey +ALTER TABLE "Booking" ADD CONSTRAINT "Booking_reassignById_fkey" FOREIGN KEY ("reassignById") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index b22feb3781..af37489223 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -343,6 +343,7 @@ model User { NotificationsSubscriptions NotificationsSubscriptions[] referralLinkId String? features UserFeatures[] + reassignedBookings Booking[] @relation("reassignByUser") @@unique([email]) @@unique([email, username]) @@ -608,6 +609,8 @@ model Booking { cancellationReason String? rejectionReason String? reassignReason String? + reassignBy User? @relation("reassignByUser", fields: [reassignById], references: [id]) + reassignById Int? dynamicEventSlugRef String? dynamicGroupSlugRef String? rescheduled Boolean? diff --git a/packages/trpc/server/routers/viewer/teams/roundRobin/roundRobinManualReassign.handler.ts b/packages/trpc/server/routers/viewer/teams/roundRobin/roundRobinManualReassign.handler.ts index f0d794bfe1..2629b65b80 100644 --- a/packages/trpc/server/routers/viewer/teams/roundRobin/roundRobinManualReassign.handler.ts +++ b/packages/trpc/server/routers/viewer/teams/roundRobin/roundRobinManualReassign.handler.ts @@ -28,6 +28,7 @@ export const roundRobinManualReassignHandler = async ({ ctx, input }: RoundRobin newUserId: teamMemberId, orgId: ctx.user.organizationId, reassignReason, + reassignedById: ctx.user.id, }); return { success: true }; diff --git a/packages/ui/components/dialog/ConfirmationDialogContent.tsx b/packages/ui/components/dialog/ConfirmationDialogContent.tsx index d196324dd1..5b011f1192 100644 --- a/packages/ui/components/dialog/ConfirmationDialogContent.tsx +++ b/packages/ui/components/dialog/ConfirmationDialogContent.tsx @@ -64,7 +64,7 @@ export const ConfirmationContent = (props: PropsWithChildren )} -
+
{title}