Skip to content

Commit f685ad7

Browse files
authored
Change PeriodType values (0 = unqualified DoW, 1-7 = Sun-Sat). Fix DateRange bi-week periodType. Add tests for hasDayOfWeek(), getDayOfWeek(), and replaceDayOfWeek() (#217)
1 parent e4d0509 commit f685ad7

File tree

5 files changed

+191
-46
lines changed

5 files changed

+191
-46
lines changed

.changeset/sour-cougars-beg.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"svelte-ux": minor
3+
---
4+
5+
Change PeriodType values (0 = unqualified DoW, 1-7 = Sun-Sat)

packages/svelte-ux/src/lib/components/DateRange.svelte

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
getDateFuncsByPeriodType,
88
hasDayOfWeek,
99
replaceDayOfWeek,
10+
missingDayOfWeek,
1011
} from '../utils/date';
1112
import { getDateRangePresets } from '../utils/dateRange';
1213
import type { DateRange } from '../utils/dateRange';
@@ -48,7 +49,7 @@
4849
$: periodTypeOptions = periodTypes.map((pt) => {
4950
const value = adjustPeriodType(pt);
5051
return {
51-
label: $format.getPeriodTypeName(adjustPeriodType(pt)),
52+
label: $format.getPeriodTypeName(value),
5253
value,
5354
};
5455
});
@@ -150,8 +151,8 @@
150151
}
151152
152153
function adjustPeriodType(periodType: PeriodType) {
153-
// Adjust value for currently selected day of week
154-
return hasDayOfWeek(periodType)
154+
// Adjust value for currently selected day of week, if needed
155+
return missingDayOfWeek(periodType)
155156
? replaceDayOfWeek(periodType, selectedDayOfWeek) || periodType
156157
: periodType;
157158
}

packages/svelte-ux/src/lib/utils/date.test.ts

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import {
88
formatDateWithLocale,
99
getPeriodTypeByCode,
1010
getPeriodTypeCode,
11+
getDayOfWeek,
12+
hasDayOfWeek,
13+
replaceDayOfWeek,
1114
} from './date';
1215
import { formatWithLocale } from '.';
1316
import { createLocaleSettings, defaultLocale } from './locale';
@@ -538,3 +541,132 @@ describe('getPeriodTypeCode()', () => {
538541
expect(val).toBe('BIWEEK1-SAT');
539542
});
540543
});
544+
545+
describe('hasDayOfWeek()', () => {
546+
const data = [
547+
// Week
548+
[PeriodType.Week, false],
549+
[PeriodType.WeekSun, true],
550+
[PeriodType.WeekMon, true],
551+
[PeriodType.WeekTue, true],
552+
[PeriodType.WeekWed, true],
553+
[PeriodType.WeekThu, true],
554+
[PeriodType.WeekFri, true],
555+
[PeriodType.WeekSat, true],
556+
// BiWeek1
557+
[PeriodType.BiWeek1, false],
558+
[PeriodType.BiWeek1Sun, true],
559+
[PeriodType.BiWeek1Mon, true],
560+
[PeriodType.BiWeek1Tue, true],
561+
[PeriodType.BiWeek1Wed, true],
562+
[PeriodType.BiWeek1Thu, true],
563+
[PeriodType.BiWeek1Fri, true],
564+
[PeriodType.BiWeek1Sat, true],
565+
// BiWeek2
566+
[PeriodType.BiWeek2, false],
567+
[PeriodType.BiWeek2Sun, true],
568+
[PeriodType.BiWeek2Mon, true],
569+
[PeriodType.BiWeek2Tue, true],
570+
[PeriodType.BiWeek2Wed, true],
571+
[PeriodType.BiWeek2Thu, true],
572+
[PeriodType.BiWeek2Fri, true],
573+
[PeriodType.BiWeek2Sat, true],
574+
// Other
575+
[PeriodType.Day, false],
576+
[PeriodType.Month, false],
577+
[PeriodType.CalendarYear, false],
578+
] as const;
579+
580+
data.forEach(([periodType, dayOfWeek]) => {
581+
it(PeriodType[periodType], () => {
582+
const val = hasDayOfWeek(periodType);
583+
expect(val).toBe(dayOfWeek);
584+
});
585+
});
586+
});
587+
588+
describe('getDayOfWeek()', () => {
589+
const data = [
590+
// Week
591+
[PeriodType.Week, null],
592+
[PeriodType.WeekSun, DayOfWeek.Sunday],
593+
[PeriodType.WeekMon, DayOfWeek.Monday],
594+
[PeriodType.WeekTue, DayOfWeek.Tuesday],
595+
[PeriodType.WeekWed, DayOfWeek.Wednesday],
596+
[PeriodType.WeekThu, DayOfWeek.Thursday],
597+
[PeriodType.WeekFri, DayOfWeek.Friday],
598+
[PeriodType.WeekSat, DayOfWeek.Saturday],
599+
// BiWeek1
600+
[PeriodType.BiWeek1, null],
601+
[PeriodType.BiWeek1Sun, DayOfWeek.Sunday],
602+
[PeriodType.BiWeek1Mon, DayOfWeek.Monday],
603+
[PeriodType.BiWeek1Tue, DayOfWeek.Tuesday],
604+
[PeriodType.BiWeek1Wed, DayOfWeek.Wednesday],
605+
[PeriodType.BiWeek1Thu, DayOfWeek.Thursday],
606+
[PeriodType.BiWeek1Fri, DayOfWeek.Friday],
607+
[PeriodType.BiWeek1Sat, DayOfWeek.Saturday],
608+
// BiWeek2
609+
[PeriodType.BiWeek2, null],
610+
[PeriodType.BiWeek2Sun, DayOfWeek.Sunday],
611+
[PeriodType.BiWeek2Mon, DayOfWeek.Monday],
612+
[PeriodType.BiWeek2Tue, DayOfWeek.Tuesday],
613+
[PeriodType.BiWeek2Wed, DayOfWeek.Wednesday],
614+
[PeriodType.BiWeek2Thu, DayOfWeek.Thursday],
615+
[PeriodType.BiWeek2Fri, DayOfWeek.Friday],
616+
[PeriodType.BiWeek2Sat, DayOfWeek.Saturday],
617+
// Other
618+
[PeriodType.Day, null],
619+
[PeriodType.Month, null],
620+
[PeriodType.CalendarYear, null],
621+
] as const;
622+
623+
data.forEach(([periodType, dayOfWeek]) => {
624+
it(PeriodType[periodType], () => {
625+
const val = getDayOfWeek(periodType);
626+
expect(val).toBe(dayOfWeek);
627+
});
628+
});
629+
});
630+
631+
describe('replaceDayOfWeek()', () => {
632+
const data = [
633+
// Week
634+
[PeriodType.Week, DayOfWeek.Sunday, PeriodType.WeekSun],
635+
[PeriodType.WeekSun, DayOfWeek.Sunday, PeriodType.WeekSun],
636+
[PeriodType.WeekSun, DayOfWeek.Monday, PeriodType.WeekMon],
637+
[PeriodType.WeekSun, DayOfWeek.Tuesday, PeriodType.WeekTue],
638+
[PeriodType.WeekSun, DayOfWeek.Wednesday, PeriodType.WeekWed],
639+
[PeriodType.WeekWed, DayOfWeek.Thursday, PeriodType.WeekThu],
640+
[PeriodType.WeekWed, DayOfWeek.Friday, PeriodType.WeekFri],
641+
[PeriodType.WeekSat, DayOfWeek.Saturday, PeriodType.WeekSat],
642+
// BiWeek1
643+
[PeriodType.BiWeek1, DayOfWeek.Sunday, PeriodType.BiWeek1Sun],
644+
[PeriodType.BiWeek1Sun, DayOfWeek.Sunday, PeriodType.BiWeek1Sun],
645+
[PeriodType.BiWeek1Sun, DayOfWeek.Monday, PeriodType.BiWeek1Mon],
646+
[PeriodType.BiWeek1Sun, DayOfWeek.Tuesday, PeriodType.BiWeek1Tue],
647+
[PeriodType.BiWeek1Sun, DayOfWeek.Wednesday, PeriodType.BiWeek1Wed],
648+
[PeriodType.BiWeek1Wed, DayOfWeek.Thursday, PeriodType.BiWeek1Thu],
649+
[PeriodType.BiWeek1Wed, DayOfWeek.Friday, PeriodType.BiWeek1Fri],
650+
[PeriodType.BiWeek1Sat, DayOfWeek.Saturday, PeriodType.BiWeek1Sat],
651+
// BiWeek2
652+
[PeriodType.BiWeek2, DayOfWeek.Sunday, PeriodType.BiWeek2Sun],
653+
[PeriodType.BiWeek2Sun, DayOfWeek.Sunday, PeriodType.BiWeek2Sun],
654+
[PeriodType.BiWeek2Sun, DayOfWeek.Monday, PeriodType.BiWeek2Mon],
655+
[PeriodType.BiWeek2Sun, DayOfWeek.Tuesday, PeriodType.BiWeek2Tue],
656+
[PeriodType.BiWeek2Sun, DayOfWeek.Wednesday, PeriodType.BiWeek2Wed],
657+
[PeriodType.BiWeek2Wed, DayOfWeek.Thursday, PeriodType.BiWeek2Thu],
658+
[PeriodType.BiWeek2Wed, DayOfWeek.Friday, PeriodType.BiWeek2Fri],
659+
[PeriodType.BiWeek2Sat, DayOfWeek.Saturday, PeriodType.BiWeek2Sat],
660+
// Other
661+
[PeriodType.Day, DayOfWeek.Sunday, PeriodType.Day],
662+
[PeriodType.Month, DayOfWeek.Sunday, PeriodType.Month],
663+
[PeriodType.CalendarYear, DayOfWeek.Sunday, PeriodType.CalendarYear],
664+
] as const;
665+
666+
data.forEach(([periodType, dayOfWeek, expected]) => {
667+
it(`${PeriodType[periodType]} / ${DayOfWeek[dayOfWeek]}`, () => {
668+
const val = replaceDayOfWeek(periodType, dayOfWeek);
669+
expect(val).toBe(expected);
670+
});
671+
});
672+
});

packages/svelte-ux/src/lib/utils/date.ts

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -192,42 +192,49 @@ export function getPeriodTypeByCode(code: string): PeriodType {
192192
return parseInt(element?.[0] ?? '1');
193193
}
194194

195-
export function getDayOfWeek(periodType: PeriodType) {
196-
const periodTypeCode = getPeriodTypeCode(periodType);
197-
const matches = periodTypeCode.match(/\-(SUN|MON|TUE|WED|THU|FRI|SAT)/);
198-
if (matches) {
199-
return DayOfWeek[matches[1] as keyof typeof DayOfWeek];
195+
export function getDayOfWeek(periodType: PeriodType): DayOfWeek | null {
196+
if (
197+
(periodType >= PeriodType.WeekSun && periodType <= PeriodType.WeekSat) ||
198+
(periodType >= PeriodType.BiWeek1Sun && periodType <= PeriodType.BiWeek1Sat) ||
199+
(periodType >= PeriodType.BiWeek2Sun && periodType <= PeriodType.BiWeek2Sat)
200+
) {
201+
return (periodType % 10) - 1;
200202
} else {
201203
return null;
202204
}
203205
}
204206

205-
export function replaceDayOfWeek(periodType: PeriodType, dayOfWeek: DayOfWeek) {
206-
const periodTypeCode = getPeriodTypeCode(periodType);
207-
const dayOfWeekName = DayOfWeek[dayOfWeek];
208-
// Replace everything after `-` with new dayOfWeek
209-
const newPeriodTypeCode = periodTypeCode.replace(/\-(.*)/, `-${dayOfWeekName}`);
210-
return getPeriodTypeByCode(newPeriodTypeCode);
207+
/** Replace day of week for `periodType`, if applicable */
208+
export function replaceDayOfWeek(periodType: PeriodType, dayOfWeek: DayOfWeek): PeriodType {
209+
if (hasDayOfWeek(periodType)) {
210+
return periodType - (getDayOfWeek(periodType) ?? 0) + dayOfWeek;
211+
} else if (missingDayOfWeek(periodType)) {
212+
return periodType + dayOfWeek + 1;
213+
} else {
214+
return periodType;
215+
}
211216
}
212217

218+
/** Check if `periodType` has day of week (Sun-Sat) */
213219
export function hasDayOfWeek(periodType: PeriodType) {
214-
// It's more: is it week related and .Week, .BiWeek1 or .BiWeek2 don't contain a day...
215-
// const periodTypeCode = getPeriodTypeCode(periodType);
216-
// return /\-(SUN|MON|TUE|WED|THU|FRI|SAT)/.test(periodTypeCode);
217-
218-
if (periodType >= PeriodType.WeekSun && periodType <= PeriodType.Week) {
220+
if (periodType >= PeriodType.WeekSun && periodType <= PeriodType.WeekSat) {
219221
return true;
220222
}
221-
if (periodType >= PeriodType.BiWeek1Sun && periodType <= PeriodType.BiWeek1) {
223+
if (periodType >= PeriodType.BiWeek1Sun && periodType <= PeriodType.BiWeek1Sat) {
222224
return true;
223225
}
224-
if (periodType >= PeriodType.BiWeek2Sun && periodType <= PeriodType.BiWeek2) {
226+
if (periodType >= PeriodType.BiWeek2Sun && periodType <= PeriodType.BiWeek2Sat) {
225227
return true;
226228
}
227229

228230
return false;
229231
}
230232

233+
/** Is `periodType` missing day of week (Sun-Sat) */
234+
export function missingDayOfWeek(periodType: PeriodType) {
235+
return [PeriodType.Week, PeriodType.BiWeek1, PeriodType.BiWeek2].includes(periodType);
236+
}
237+
231238
export function getMonths(year = new Date().getFullYear()) {
232239
return Array.from({ length: 12 }, (_, i) => new Date(year, i, 1));
233240
}

packages/svelte-ux/src/lib/utils/date_types.ts

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,38 +15,38 @@ export enum PeriodType {
1515
DayTime = 11,
1616
TimeOnly = 15,
1717

18-
WeekSun = 20,
19-
WeekMon = 21,
20-
WeekTue = 22,
21-
WeekWed = 23,
22-
WeekThu = 24,
23-
WeekFri = 25,
24-
WeekSat = 26,
25-
Week = 27, // will be replaced by WeekSun, WeekMon, etc depending on weekStartsOn
18+
Week = 20, // will be replaced by WeekSun, WeekMon, etc depending on locale `weekStartsOn`
19+
WeekSun = 21,
20+
WeekMon = 22,
21+
WeekTue = 23,
22+
WeekWed = 24,
23+
WeekThu = 25,
24+
WeekFri = 26,
25+
WeekSat = 27,
2626

2727
Month = 30,
2828
MonthYear = 31,
2929
Quarter = 40,
3030
CalendarYear = 50,
3131
FiscalYearOctober = 60,
3232

33-
BiWeek1Sun = 70,
34-
BiWeek1Mon = 71,
35-
BiWeek1Tue = 72,
36-
BiWeek1Wed = 73,
37-
BiWeek1Thu = 74,
38-
BiWeek1Fri = 75,
39-
BiWeek1Sat = 76,
40-
BiWeek1 = 77, // will be replaced by BiWeek1Sun, BiWeek1Mon, etc depending on weekStartsOn
41-
42-
BiWeek2Sun = 80,
43-
BiWeek2Mon = 81,
44-
BiWeek2Tue = 82,
45-
BiWeek2Wed = 83,
46-
BiWeek2Thu = 84,
47-
BiWeek2Fri = 85,
48-
BiWeek2Sat = 86,
49-
BiWeek2 = 87, // will be replaced by BiWeek2Sun, BiWeek2Mon, etc depending on weekStartsOn
33+
BiWeek1 = 70, // will be replaced by BiWeek1Sun, BiWeek1Mon, etc depending on locale `weekStartsOn`
34+
BiWeek1Sun = 71,
35+
BiWeek1Mon = 72,
36+
BiWeek1Tue = 73,
37+
BiWeek1Wed = 74,
38+
BiWeek1Thu = 75,
39+
BiWeek1Fri = 76,
40+
BiWeek1Sat = 77,
41+
42+
BiWeek2 = 80, // will be replaced by BiWeek2Sun, BiWeek2Mon, etc depending on locale `weekStartsOn`
43+
BiWeek2Sun = 81,
44+
BiWeek2Mon = 82,
45+
BiWeek2Tue = 83,
46+
BiWeek2Wed = 84,
47+
BiWeek2Thu = 85,
48+
BiWeek2Fri = 86,
49+
BiWeek2Sat = 87,
5050
}
5151

5252
export enum DayOfWeek {

0 commit comments

Comments
 (0)