Skip to content

Commit

Permalink
fix: calendar selection store min/max range with filter fix
Browse files Browse the repository at this point in the history
  • Loading branch information
dereekb committed May 18, 2023
1 parent de888a1 commit 865ef18
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { CalendarEvent } from 'angular-calendar';
import { dateScheduleRangeField } from '@dereekb/dbx-form/calendar';
import { of } from 'rxjs';
import { DOC_EXTENSION_CALENDAR_SCHEDULE_TEST_FILTER } from '../component/selection.filter.calendar.component';
import { addHours, endOfDay } from 'date-fns';

export interface TestCalendarEventData extends DateBlock {
value: string;
Expand Down Expand Up @@ -61,6 +62,21 @@ export class DocExtensionCalendarComponent implements OnInit {
computeSelectionResultRelativeToFilter: true,
exclusions: [0, 2, 4],
initialSelectionState: 'all'
}),
dateScheduleRangeField({
key: 'dateScheduleWithMinDateRange',
required: true,
description: 'Date schedule with a filter applied to it and additional exclusions.',
filter: {
//
start: addHours(startOfDay(addDays(new Date(), 1)), 6), // tomorrow at 6AM
end: addHours(startOfDay(addDays(new Date(), 1)), 18), // tomorrow at 6PM
w: '89',
ex: []
},
minMaxDateRange: { start: new Date() },
computeSelectionResultRelativeToFilter: true,
initialSelectionState: 'all'
})
];

Expand Down
13 changes: 10 additions & 3 deletions packages/date/src/lib/date/date.schedule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -384,14 +384,20 @@ export function dateScheduleDateFilter(config: DateScheduleDateFilterConfig): Da
const { w, start: firstDate = new Date(), setStartAsMinDate = true, end, minMaxDateRange } = config;
const allowedDays: Set<DayOfWeek> = expandDateScheduleDayCodesToDayOfWeekSet(w);

// Start date is either now or the filter's start date. It is never the minMax's start date, since that is irrelevant to the filter's range.

const firstDateDay = getDay(firstDate);
const dayForIndex = dateBlockDayOfWeekFactory(firstDateDay);
const dateIndexForDate = dateTimingRelativeIndexFactory({ start: firstDate });
const minIndex = minMaxDateRange?.start != null ? dateIndexForDate(minMaxDateRange.start) : setStartAsMinDate ? 0 : Number.MIN_SAFE_INTEGER;
const maxIndex = end != null ? dateIndexForDate(end) : minMaxDateRange?.end != null ? dateIndexForDate(minMaxDateRange.end) : Number.MAX_SAFE_INTEGER; // max "to" value

const indexFloor = setStartAsMinDate ? 0 : Number.MIN_SAFE_INTEGER;
const minAllowedIndex = minMaxDateRange?.start != null ? Math.max(indexFloor, dateIndexForDate(minMaxDateRange.start)) : indexFloor; // start date should be the min inde
const maxAllowedIndex = end != null ? dateIndexForDate(end) : minMaxDateRange?.end != null ? dateIndexForDate(minMaxDateRange.end) : Number.MAX_SAFE_INTEGER; // max "to" value

const includedIndexes = new Set(config.d);
const excludedIndexes = new Set(config.ex);


return (input: DateScheduleDateFilterInput) => {
let i: DateBlockIndex;
let day: DayOfWeek;
Expand All @@ -404,7 +410,8 @@ export function dateScheduleDateFilter(config: DateScheduleDateFilterConfig): Da
day = dayOfWeek(input);
}

return (i >= minIndex && i <= maxIndex && allowedDays.has(day) && !excludedIndexes.has(i)) || includedIndexes.has(i);

return (i >= minAllowedIndex && i <= maxAllowedIndex && allowedDays.has(day) && !excludedIndexes.has(i)) || includedIndexes.has(i);
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,15 +153,15 @@ export function initialCalendarScheduleSelectionState(): CalendarScheduleSelecti
};
}

export function calendarScheduleMinDate(x: CalendarScheduleSelectionState): Maybe<Date> {
export function calendarScheduleMinDate(x: Pick<CalendarScheduleSelectionState, 'filter' | 'minMaxDateRange'>): Maybe<Date> {
return findMaxDate([x.filter?.start, x.minMaxDateRange?.start]);
}

export function calendarScheduleMaxDate(x: CalendarScheduleSelectionState): Maybe<Date> {
export function calendarScheduleMaxDate(x: Pick<CalendarScheduleSelectionState, 'filter' | 'minMaxDateRange'>): Maybe<Date> {
return findMinDate([x.filter?.end, x.minMaxDateRange?.end]);
}

export function calendarScheduleMinAndMaxDateRange(x: CalendarScheduleSelectionState): Partial<DateRange> {
export function calendarScheduleMinAndMaxDateRange(x: Pick<CalendarScheduleSelectionState, 'filter' | 'minMaxDateRange'>): Partial<DateRange> {
return {
start: calendarScheduleMinDate(x) || undefined,
end: calendarScheduleMaxDate(x) || undefined
Expand Down Expand Up @@ -426,7 +426,7 @@ export function updateStateWithFilter(state: CalendarScheduleSelectionState, inp

if (minMaxDateRange) {
enabledFilter.minMaxDateRange = minMaxDateRange;
enabledFilter.setStartAsMinDate = false;
enabledFilter.setStartAsMinDate = Boolean(filter?.start) ? true : false; // If a start date is set, then it becomes the floor.
}

/**
Expand Down

0 comments on commit 865ef18

Please sign in to comment.