From ef7569b63b2570da900766ee99ea735f51c3fd6d Mon Sep 17 00:00:00 2001 From: Gregor Vostrak Date: Wed, 11 Mar 2026 18:09:50 +0100 Subject: [PATCH] only show calendar toolbar after load complete to avoid layout shift --- e2e/calendar-settings.spec.ts | 5 +- e2e/time.spec.ts | 5 +- .../ui/src/FullCalendar/TimeEntryCalendar.vue | 403 +++++++++--------- .../ui/src/Input/EstimatedTimeInput.vue | 6 +- 4 files changed, 216 insertions(+), 203 deletions(-) diff --git a/e2e/calendar-settings.spec.ts b/e2e/calendar-settings.spec.ts index b0deb16d..8b274008 100644 --- a/e2e/calendar-settings.spec.ts +++ b/e2e/calendar-settings.spec.ts @@ -497,10 +497,13 @@ test.describe('Visual Snapping', () => { await page.getByRole('option', { name: '5 min', exact: true }).click(); await page.keyboard.press('Escape'); + // Scroll so both the event (9:00) and target (14:00) are in viewport + await scrollCalendarToTime(page, '08:00:00'); + const event = page.locator('.fc-event').first(); await expect(event).toBeVisible(); - // Drag event + // Capture target coordinates after scroll is settled const targetSlot = page.locator('.fc-timegrid-slot-lane[data-time="14:00:00"]').first(); const targetBox = await targetSlot.boundingBox(); expect(targetBox).not.toBeNull(); diff --git a/e2e/time.spec.ts b/e2e/time.spec.ts index 58edc62e..93abb9f8 100644 --- a/e2e/time.spec.ts +++ b/e2e/time.spec.ts @@ -1427,10 +1427,7 @@ test('test that bare integer in inline duration input with decimal format is int }); }); -test('test that bare integer in create modal is interpreted as minutes', async ({ - page, - ctx, -}) => { +test('test that bare integer in create modal is interpreted as minutes', async ({ page, ctx }) => { await updateOrganizationSettingViaApi(ctx, { interval_format: 'hours-minutes', number_format: 'comma-point', diff --git a/resources/js/packages/ui/src/FullCalendar/TimeEntryCalendar.vue b/resources/js/packages/ui/src/FullCalendar/TimeEntryCalendar.vue index 16ead3f4..0b4bf057 100644 --- a/resources/js/packages/ui/src/FullCalendar/TimeEntryCalendar.vue +++ b/resources/js/packages/ui/src/FullCalendar/TimeEntryCalendar.vue @@ -440,216 +440,233 @@ function getEventDurationSeconds(dayEvent: DayEvent, dayStr: string): number { :currency="currency" :can-create-project="canCreateProject" /> - + diff --git a/resources/js/packages/ui/src/Input/EstimatedTimeInput.vue b/resources/js/packages/ui/src/Input/EstimatedTimeInput.vue index 1f901ad0..cf927843 100644 --- a/resources/js/packages/ui/src/Input/EstimatedTimeInput.vue +++ b/resources/js/packages/ui/src/Input/EstimatedTimeInput.vue @@ -26,11 +26,7 @@ function updateDuration() { return; } - const seconds = parseTimeInput( - input, - organization?.value?.number_format, - 'hours' - ); + const seconds = parseTimeInput(input, organization?.value?.number_format, 'hours'); if (seconds !== null && seconds > 0) { model.value = seconds; }