Fix selection in calendar
This commit is contained in:
@@ -10,6 +10,9 @@ vi.mock('@/context', () => ({
|
|||||||
|
|
||||||
vi.mock('@/hooks', () => ({
|
vi.mock('@/hooks', () => ({
|
||||||
usePlannedDays: vi.fn(),
|
usePlannedDays: vi.fn(),
|
||||||
|
useShowWeekNumbers: vi.fn(() => [false]),
|
||||||
|
getLastLeaveType: vi.fn(() => 'vacation'),
|
||||||
|
setLastLeaveType: vi.fn(),
|
||||||
}))
|
}))
|
||||||
|
|
||||||
vi.mock('@/components/layout/Layout', () => ({
|
vi.mock('@/components/layout/Layout', () => ({
|
||||||
@@ -143,4 +146,32 @@ describe('Calendar', () => {
|
|||||||
|
|
||||||
expect(screen.getByTestId('calendar')).toBeInTheDocument()
|
expect(screen.getByTestId('calendar')).toBeInTheDocument()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('highlights date range live while dragging, before pointerup', () => {
|
||||||
|
;(useWorkspace as any).mockReturnValue(mockWorkspace)
|
||||||
|
;(usePlannedDays as any).mockReturnValue(mockPlannedDays)
|
||||||
|
|
||||||
|
render(<Calendar />)
|
||||||
|
|
||||||
|
const calendarDays = screen.getAllByTestId('calendar-day')
|
||||||
|
const currentMonthDays = calendarDays.filter((el) => !el.classList.contains('calendar-day--disabled'))
|
||||||
|
|
||||||
|
expect(currentMonthDays.length).toBeGreaterThanOrEqual(2)
|
||||||
|
|
||||||
|
const startDay = currentMonthDays[0] as HTMLElement
|
||||||
|
const endDay = currentMonthDays[3] as HTMLElement
|
||||||
|
|
||||||
|
// Fire pointerdown on first day
|
||||||
|
fireEvent.pointerDown(startDay)
|
||||||
|
|
||||||
|
// Fire pointerenter on later day WITHOUT firing pointerup
|
||||||
|
fireEvent.pointerEnter(endDay)
|
||||||
|
|
||||||
|
// The range should now have the --selected class before pointerup fires
|
||||||
|
const selectedDaysInRange = Array.from(calendarDays).filter((el) =>
|
||||||
|
el.classList.contains('calendar-day--selected')
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(selectedDaysInRange.length).toBeGreaterThan(0)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -184,6 +184,13 @@ export function Calendar(): ReactNode {
|
|||||||
const defaultLeaveType = getLastLeaveType() ?? 'vacation'
|
const defaultLeaveType = getLastLeaveType() ?? 'vacation'
|
||||||
const firstSelectedDate = Array.from(selectedDates).sort()[0]
|
const firstSelectedDate = Array.from(selectedDates).sort()[0]
|
||||||
|
|
||||||
|
// Dates to highlight in the grid. While dragging, show a live preview of the
|
||||||
|
// range under the cursor; otherwise show the committed selection.
|
||||||
|
const highlightedDates =
|
||||||
|
isDragging && dragAnchor && dragCurrent
|
||||||
|
? new Set(datesInRange(dragAnchor, dragCurrent))
|
||||||
|
: selectedDates
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout>
|
<Layout>
|
||||||
<div data-testid="calendar" className="calendar">
|
<div data-testid="calendar" className="calendar">
|
||||||
@@ -215,7 +222,7 @@ export function Calendar(): ReactNode {
|
|||||||
key={weekIdx}
|
key={weekIdx}
|
||||||
weekDates={week}
|
weekDates={week}
|
||||||
plannedDays={plannedDays ?? []}
|
plannedDays={plannedDays ?? []}
|
||||||
selectedDates={selectedDates}
|
selectedDates={highlightedDates}
|
||||||
parentName={parentName ?? 'Du'}
|
parentName={parentName ?? 'Du'}
|
||||||
personalDataUuid={personalDataUuid ?? ''}
|
personalDataUuid={personalDataUuid ?? ''}
|
||||||
isCurrentMonth={weekMonth === month}
|
isCurrentMonth={weekMonth === month}
|
||||||
|
|||||||
@@ -62,6 +62,8 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
transition: all 0.2s;
|
transition: all 0.2s;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
user-select: none;
|
||||||
|
-webkit-user-select: none; /* Safari */
|
||||||
}
|
}
|
||||||
|
|
||||||
.calendar-day:hover {
|
.calendar-day:hover {
|
||||||
|
|||||||
Reference in New Issue
Block a user