diff --git a/apps/web/pages/availability/index.tsx b/apps/web/pages/availability/index.tsx index 3acb557a55..742f3b3a9c 100644 --- a/apps/web/pages/availability/index.tsx +++ b/apps/web/pages/availability/index.tsx @@ -92,14 +92,9 @@ export function AvailabilityList({ schedules }: RouterOutputs["viewer"]["availab }} key={schedule.id} schedule={schedule} + isDeletable={schedules.length !== 1} updateDefault={updateMutation.mutate} - deleteFunction={() => { - if (schedules.length === 1) { - showToast(t("requires_at_least_one_schedule"), "error"); - } else { - deleteMutation.mutate; - } - }} + deleteFunction={deleteMutation.mutate} /> ))} diff --git a/apps/web/playwright/availability.e2e.ts b/apps/web/playwright/availability.e2e.ts index 4bebb0f0d8..abee0f3a49 100644 --- a/apps/web/playwright/availability.e2e.ts +++ b/apps/web/playwright/availability.e2e.ts @@ -43,12 +43,29 @@ test.describe("Availablity tests", () => { }); }); - test("Availablity pages", async ({ page }) => { + test("Availability pages", async ({ page }) => { await test.step("Can add a new schedule", async () => { await page.locator('[data-testid="new-schedule"]').click(); await page.locator('[id="name"]').fill("More working hours"); page.locator('[type="submit"]').click(); await expect(page.locator("[data-testid=availablity-title]")).toHaveValue("More working hours"); }); + await test.step("Can delete a schedule", async () => { + await page.getByRole("button", { name: /Go Back/i }).click(); + await page.locator('[data-testid="schedules"] > li').nth(1).getByTestId("schedule-more").click(); + await page.locator('[data-testid="delete-schedule"]').click(); + const toast = await page.waitForSelector('[data-testid="toast-success"]'); + expect(toast).toBeTruthy(); + + await expect(page.locator('[data-testid="schedules"] > li').nth(1)).toHaveCount(0); + }); + await test.step("Cannot delete a schedule if a single schedule is present", async () => { + await page.locator('[data-testid="schedules"] > li').nth(0).getByTestId("schedule-more").click(); + await page.locator('[data-testid="delete-schedule"]').click(); + const toast = await page.waitForSelector('[data-testid="toast-error"]'); + expect(toast).toBeTruthy(); + + await expect(page.locator('[data-testid="schedules"] > li').nth(0)).toHaveCount(1); + }); }); }); diff --git a/packages/features/schedules/components/ScheduleListItem.tsx b/packages/features/schedules/components/ScheduleListItem.tsx index 67799ae0ad..dff3602541 100644 --- a/packages/features/schedules/components/ScheduleListItem.tsx +++ b/packages/features/schedules/components/ScheduleListItem.tsx @@ -13,6 +13,7 @@ import { DropdownMenuItem, DropdownItem, DropdownMenuTrigger, + showToast, } from "@calcom/ui"; import { FiGlobe, FiMoreHorizontal, FiTrash, FiClock } from "@calcom/ui/components/icon"; @@ -21,6 +22,7 @@ export function ScheduleListItem({ deleteFunction, displayOptions, updateDefault, + isDeletable, }: { schedule: RouterOutputs["viewer"]["availability"]["list"]["schedules"][number]; deleteFunction: ({ scheduleId }: { scheduleId: number }) => void; @@ -28,6 +30,7 @@ export function ScheduleListItem({ timeZone?: string; hour12?: boolean; }; + isDeletable: boolean; updateDefault: ({ scheduleId, isDefault }: { scheduleId: number; isDefault: boolean }) => void; }) { const { t, i18n } = useLocale(); @@ -74,6 +77,7 @@ export function ScheduleListItem({