diff --git a/apps/web/playwright/availability.e2e.ts b/apps/web/playwright/availability.e2e.ts index 591ee0b532..e07b553896 100644 --- a/apps/web/playwright/availability.e2e.ts +++ b/apps/web/playwright/availability.e2e.ts @@ -88,6 +88,29 @@ test.describe("Availablity", () => { await expect(await page.getByTitle(deleteButtonTitle).isVisible()).toBe(false); }); + test("Can create date override on current day in a negative timezone", async ({ page }) => { + await page.getByTestId("schedules").first().click(); + // set time zone to New York + await page + .locator("#availability-form div") + .filter({ hasText: "TimezoneEurope/London" }) + .locator("svg") + .click(); + await page.locator("[id=timeZone-lg-viewport]").fill("New"); + await page.getByTestId("select-option-America/New_York").click(); + + // Add override for today + await page.getByTestId("add-override").click(); + await page.locator('[id="modal-title"]').waitFor(); + await page.locator('[data-testid="day"][data-disabled="false"]').first().click(); + await page.getByTestId("add-override-submit-btn").click(); + await page.getByTestId("dialog-rejection").click(); + + await page.locator('[form="availability-form"][type="submit"]').click(); + await page.reload(); + await expect(page.locator('[data-testid="date-overrides-list"] > li')).toHaveCount(1); + }); + test("Schedule listing", async ({ page }) => { await test.step("Can add a new schedule", async () => { await page.getByTestId("new-schedule").click(); diff --git a/packages/features/timezone-buddy/components/AvailabilityEditSheet.tsx b/packages/features/timezone-buddy/components/AvailabilityEditSheet.tsx index 91ad504136..b2d8bba01f 100644 --- a/packages/features/timezone-buddy/components/AvailabilityEditSheet.tsx +++ b/packages/features/timezone-buddy/components/AvailabilityEditSheet.tsx @@ -194,6 +194,7 @@ export function AvailabilityEditSheetForm(props: Props & { data: Data; isPending id="timezone" isDisabled={!hasEditPermission || !data.hasDefaultSchedule} value={watchTimezone ?? "Europe/London"} + data-testid="timezone-select" onChange={(event) => { if (event) form.setValue("timeZone", event.value, { shouldDirty: true }); }} diff --git a/packages/lib/schedules/client/transformers.ts b/packages/lib/schedules/client/transformers.ts index c3afe15999..1a8ba47d23 100644 --- a/packages/lib/schedules/client/transformers.ts +++ b/packages/lib/schedules/client/transformers.ts @@ -37,8 +37,11 @@ export function transformAvailabilityForClient(schedule: ScheduleWithAvailabilit export function transformDateOverridesForClient(schedule: ScheduleWithAvailabilities, timeZone: string) { return schedule.availability.reduce((acc, override) => { - // only iff future date override - if (!override.date || dayjs.tz(override.date, timeZone).isBefore(dayjs(), "day")) { + // only if future date override + const currentUtcOffset = dayjs().tz(timeZone).utcOffset(); + const currentTimeInTz = dayjs().utc().add(currentUtcOffset, "minute"); + + if (!override.date || dayjs(override.date).isBefore(currentTimeInTz, "day")) { return acc; } const newValue = {