Skip to content

Commit a775bec

Browse files
authored
fix: Disable round robin reassignment if reroute is available (#19192)
* If booking is routed from form, disable round robin reassign * Pass `bookingFromRoutingForm` prop from `BookingListItem` * Add `ReassignType` enum * Refactor `isBookingReroutable`
1 parent 75ff5f6 commit a775bec

File tree

2 files changed

+36
-15
lines changed

2 files changed

+36
-15
lines changed

apps/web/components/booking/BookingListItem.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ function BookingListItem(booking: BookingItemProps) {
145145
const isRecurring = booking.recurringEventId !== null;
146146
const isTabRecurring = booking.listingStatus === "recurring";
147147
const isTabUnconfirmed = booking.listingStatus === "unconfirmed";
148+
const isBookingFromRoutingForm = isBookingReroutable(parsedBooking);
148149

149150
const paymentAppData = getPaymentAppData(booking.eventType);
150151

@@ -237,7 +238,7 @@ function BookingListItem(booking: BookingItemProps) {
237238
},
238239
},
239240
]),
240-
...(isBookingReroutable(parsedBooking)
241+
...(isBookingFromRoutingForm
241242
? [
242243
{
243244
id: "reroute",
@@ -444,6 +445,7 @@ function BookingListItem(booking: BookingItemProps) {
444445
setIsOpenDialog={setIsOpenReassignDialog}
445446
bookingId={booking.id}
446447
teamId={booking.eventType?.team?.id || 0}
448+
bookingFromRoutingForm={isBookingFromRoutingForm}
447449
/>
448450
)}
449451
<EditLocationDialog
@@ -691,7 +693,7 @@ function BookingListItem(booking: BookingItemProps) {
691693
/>
692694
</div>
693695

694-
{isBookingReroutable(parsedBooking) && (
696+
{isBookingFromRoutingForm && (
695697
<RerouteDialog
696698
isOpenDialog={rerouteDialogIsOpen}
697699
setIsOpenDialog={setRerouteDialogIsOpen}

apps/web/components/dialog/ReassignDialog.tsx

+32-13
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,27 @@ import {
2727
TextAreaField,
2828
} from "@calcom/ui";
2929

30+
enum ReassignType {
31+
ROUND_ROBIN = "round_robin",
32+
TEAM_MEMBER = "team_member",
33+
}
34+
3035
type ReassignDialog = {
3136
isOpenDialog: boolean;
3237
setIsOpenDialog: Dispatch<SetStateAction<boolean>>;
3338
teamId: number;
3439
bookingId: number;
40+
bookingFromRoutingForm: boolean;
3541
};
3642

3743
type FormValues = {
38-
reassignType: "round_robin" | "team_member";
44+
reassignType: ReassignType.ROUND_ROBIN | ReassignType.TEAM_MEMBER;
3945
teamMemberId?: number;
4046
reassignReason?: string;
4147
};
4248

4349
const formSchema = z.object({
44-
reassignType: z.enum(["round_robin", "team_member"]),
50+
reassignType: z.nativeEnum(ReassignType),
4551
teamMemberId: z.number().optional(),
4652
reassignReason: z
4753
.string()
@@ -57,7 +63,13 @@ interface TeamMemberOption {
5763
status: string;
5864
}
5965

60-
export const ReassignDialog = ({ isOpenDialog, setIsOpenDialog, teamId, bookingId }: ReassignDialog) => {
66+
export const ReassignDialog = ({
67+
isOpenDialog,
68+
setIsOpenDialog,
69+
teamId,
70+
bookingId,
71+
bookingFromRoutingForm,
72+
}: ReassignDialog) => {
6173
const { t } = useLocale();
6274
const utils = trpc.useUtils();
6375
const [animationParentRef] = useAutoAnimate<HTMLFormElement>({
@@ -101,7 +113,7 @@ export const ReassignDialog = ({ isOpenDialog, setIsOpenDialog, teamId, bookingI
101113
const form = useForm<FormValues>({
102114
resolver: zodResolver(formSchema),
103115
defaultValues: {
104-
reassignType: "round_robin",
116+
reassignType: bookingFromRoutingForm ? ReassignType.TEAM_MEMBER : ReassignType.ROUND_ROBIN,
105117
},
106118
});
107119

@@ -144,7 +156,7 @@ export const ReassignDialog = ({ isOpenDialog, setIsOpenDialog, teamId, bookingI
144156
});
145157

146158
const handleSubmit = (values: FormValues) => {
147-
if (values.reassignType === "round_robin") {
159+
if (values.reassignType === ReassignType.ROUND_ROBIN) {
148160
roundRobinReassignMutation.mutate({ teamId, bookingId });
149161
} else {
150162
if (values.teamMemberId) {
@@ -176,23 +188,30 @@ export const ReassignDialog = ({ isOpenDialog, setIsOpenDialog, teamId, bookingI
176188
<Form form={form} handleSubmit={handleSubmit} ref={animationParentRef}>
177189
<RadioArea.Group
178190
onValueChange={(val) => {
179-
form.setValue("reassignType", val as "team_member" | "round_robin");
191+
form.setValue("reassignType", val as ReasonEnum);
180192
}}
193+
defaultValue={bookingFromRoutingForm ? ReassignType.TEAM_MEMBER : ReassignType.ROUND_ROBIN}
181194
className="mt-1 flex flex-col gap-4">
195+
{!bookingFromRoutingForm ? (
196+
<RadioArea.Item
197+
value={ReassignType.ROUND_ROBIN}
198+
className="w-full text-sm"
199+
classNames={{ container: "w-full" }}
200+
disabled={bookingFromRoutingForm}>
201+
<strong className="mb-1 block">{t("round_robin")}</strong>
202+
<p>{t("round_robin_reassign_description")}</p>
203+
</RadioArea.Item>
204+
) : null}
182205
<RadioArea.Item
183-
value="round_robin"
184-
className="w-full text-sm"
206+
value={ReassignType.TEAM_MEMBER}
207+
className="text-sm"
185208
classNames={{ container: "w-full" }}>
186-
<strong className="mb-1 block">{t("round_robin")}</strong>
187-
<p>{t("round_robin_reassign_description")}</p>
188-
</RadioArea.Item>
189-
<RadioArea.Item value="team_member" className="text-sm" classNames={{ container: "w-full" }}>
190209
<strong className="mb-1 block">{t("team_member_round_robin_reassign")}</strong>
191210
<p>{t("team_member_round_robin_reassign_description")}</p>
192211
</RadioArea.Item>
193212
</RadioArea.Group>
194213

195-
{watchedReassignType === "team_member" && (
214+
{watchedReassignType === ReassignType.TEAM_MEMBER && (
196215
<div className="mb-2">
197216
<Label className="text-emphasis mt-6">{t("select_team_member")}</Label>
198217
<div className="mt-2">

0 commit comments

Comments
 (0)