@bash-app/bash-common 30.50.1 → 30.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -0
- package/dist/definitions.d.ts +668 -0
- package/dist/definitions.d.ts.map +1 -0
- package/dist/definitions.js +467 -0
- package/dist/definitions.js.map +1 -0
- package/dist/extendedSchemas.d.ts +2206 -0
- package/dist/extendedSchemas.d.ts.map +1 -0
- package/dist/extendedSchemas.js +429 -0
- package/dist/extendedSchemas.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/addressUtils.d.ts +14 -0
- package/dist/utils/addressUtils.d.ts.map +1 -0
- package/dist/utils/addressUtils.js +177 -0
- package/dist/utils/addressUtils.js.map +1 -0
- package/dist/utils/apiUtils.d.ts +14 -0
- package/dist/utils/apiUtils.d.ts.map +1 -0
- package/dist/utils/apiUtils.js +61 -0
- package/dist/utils/apiUtils.js.map +1 -0
- package/dist/utils/arrayUtils.d.ts +2 -0
- package/dist/utils/arrayUtils.d.ts.map +1 -0
- package/dist/utils/arrayUtils.js +5 -0
- package/dist/utils/arrayUtils.js.map +1 -0
- package/dist/utils/awsS3Utils.d.ts +10 -0
- package/dist/utils/awsS3Utils.d.ts.map +1 -0
- package/dist/utils/awsS3Utils.js +89 -0
- package/dist/utils/awsS3Utils.js.map +1 -0
- package/dist/utils/badgeUtils.d.ts +33 -0
- package/dist/utils/badgeUtils.d.ts.map +1 -0
- package/dist/utils/badgeUtils.js +57 -0
- package/dist/utils/badgeUtils.js.map +1 -0
- package/dist/utils/blog/blogDbUtils.d.ts +48 -0
- package/dist/utils/blog/blogDbUtils.d.ts.map +1 -0
- package/dist/utils/blog/blogDbUtils.js +218 -0
- package/dist/utils/blog/blogDbUtils.js.map +1 -0
- package/dist/utils/blogUtils.d.ts +19 -0
- package/dist/utils/blogUtils.d.ts.map +1 -0
- package/dist/utils/blogUtils.js +118 -0
- package/dist/utils/blogUtils.js.map +1 -0
- package/dist/utils/dateTimeUtils.d.ts +38 -0
- package/dist/utils/dateTimeUtils.d.ts.map +1 -0
- package/dist/utils/dateTimeUtils.js +207 -0
- package/dist/utils/dateTimeUtils.js.map +1 -0
- package/dist/utils/entityUtils.d.ts +5 -0
- package/dist/utils/entityUtils.d.ts.map +1 -0
- package/dist/utils/entityUtils.js +5 -0
- package/dist/utils/entityUtils.js.map +1 -0
- package/dist/utils/generalDateTimeUtils.d.ts +15 -0
- package/dist/utils/generalDateTimeUtils.d.ts.map +1 -0
- package/dist/utils/generalDateTimeUtils.js +38 -0
- package/dist/utils/generalDateTimeUtils.js.map +1 -0
- package/dist/utils/luxonUtils.d.ts +95 -0
- package/dist/utils/luxonUtils.d.ts.map +1 -0
- package/dist/utils/luxonUtils.js +623 -0
- package/dist/utils/luxonUtils.js.map +1 -0
- package/dist/utils/mathUtils.d.ts +2 -0
- package/dist/utils/mathUtils.d.ts.map +1 -0
- package/dist/utils/mathUtils.js +4 -0
- package/dist/utils/mathUtils.js.map +1 -0
- package/dist/utils/objUtils.d.ts +3 -0
- package/dist/utils/objUtils.d.ts.map +1 -0
- package/dist/utils/objUtils.js +29 -0
- package/dist/utils/objUtils.js.map +1 -0
- package/dist/utils/paymentUtils.d.ts +18 -0
- package/dist/utils/paymentUtils.d.ts.map +1 -0
- package/dist/utils/paymentUtils.js +50 -0
- package/dist/utils/paymentUtils.js.map +1 -0
- package/dist/utils/promoCodesUtils.d.ts +6 -0
- package/dist/utils/promoCodesUtils.d.ts.map +1 -0
- package/dist/utils/promoCodesUtils.js +23 -0
- package/dist/utils/promoCodesUtils.js.map +1 -0
- package/dist/utils/qrCodeUtils.d.ts +4 -0
- package/dist/utils/qrCodeUtils.d.ts.map +1 -0
- package/dist/utils/qrCodeUtils.js +22 -0
- package/dist/utils/qrCodeUtils.js.map +1 -0
- package/dist/utils/recurrenceUtils.d.ts +8 -0
- package/dist/utils/recurrenceUtils.d.ts.map +1 -0
- package/dist/utils/recurrenceUtils.js +153 -0
- package/dist/utils/recurrenceUtils.js.map +1 -0
- package/dist/utils/reviewUtils.d.ts +29 -0
- package/dist/utils/reviewUtils.d.ts.map +1 -0
- package/dist/utils/reviewUtils.js +65 -0
- package/dist/utils/reviewUtils.js.map +1 -0
- package/dist/utils/service/apiServiceBookingApiUtils.d.ts +21 -0
- package/dist/utils/service/apiServiceBookingApiUtils.d.ts.map +1 -0
- package/dist/utils/service/apiServiceBookingApiUtils.js +131 -0
- package/dist/utils/service/apiServiceBookingApiUtils.js.map +1 -0
- package/dist/utils/service/attendeeOptionUtils.d.ts +11 -0
- package/dist/utils/service/attendeeOptionUtils.d.ts.map +1 -0
- package/dist/utils/service/attendeeOptionUtils.js +9 -0
- package/dist/utils/service/attendeeOptionUtils.js.map +1 -0
- package/dist/utils/service/frontendServiceBookingUtils.d.ts +53 -0
- package/dist/utils/service/frontendServiceBookingUtils.d.ts.map +1 -0
- package/dist/utils/service/frontendServiceBookingUtils.js +134 -0
- package/dist/utils/service/frontendServiceBookingUtils.js.map +1 -0
- package/dist/utils/service/regexUtils.d.ts +6 -0
- package/dist/utils/service/regexUtils.d.ts.map +1 -0
- package/dist/utils/service/regexUtils.js +16 -0
- package/dist/utils/service/regexUtils.js.map +1 -0
- package/dist/utils/service/serviceBookingStatusUtils.d.ts +21 -0
- package/dist/utils/service/serviceBookingStatusUtils.d.ts.map +1 -0
- package/dist/utils/service/serviceBookingStatusUtils.js +130 -0
- package/dist/utils/service/serviceBookingStatusUtils.js.map +1 -0
- package/dist/utils/service/serviceBookingTypes.d.ts +19 -0
- package/dist/utils/service/serviceBookingTypes.d.ts.map +1 -0
- package/dist/utils/service/serviceBookingTypes.js +2 -0
- package/dist/utils/service/serviceBookingTypes.js.map +1 -0
- package/dist/utils/service/serviceDBUtils.d.ts +5 -0
- package/dist/utils/service/serviceDBUtils.d.ts.map +1 -0
- package/dist/utils/service/serviceDBUtils.js +48 -0
- package/dist/utils/service/serviceDBUtils.js.map +1 -0
- package/dist/utils/service/serviceRateDBUtils.d.ts +1 -0
- package/dist/utils/service/serviceRateDBUtils.d.ts.map +1 -0
- package/dist/utils/service/serviceRateDBUtils.js +159 -0
- package/dist/utils/service/serviceRateDBUtils.js.map +1 -0
- package/dist/utils/service/serviceRateTypes.d.ts +9 -0
- package/dist/utils/service/serviceRateTypes.d.ts.map +1 -0
- package/dist/utils/service/serviceRateTypes.js +2 -0
- package/dist/utils/service/serviceRateTypes.js.map +1 -0
- package/dist/utils/service/serviceRateUtils.d.ts +24 -0
- package/dist/utils/service/serviceRateUtils.d.ts.map +1 -0
- package/dist/utils/service/serviceRateUtils.js +183 -0
- package/dist/utils/service/serviceRateUtils.js.map +1 -0
- package/dist/utils/service/serviceUtils.d.ts +83 -0
- package/dist/utils/service/serviceUtils.d.ts.map +1 -0
- package/dist/utils/service/serviceUtils.js +311 -0
- package/dist/utils/service/serviceUtils.js.map +1 -0
- package/dist/utils/service/venueUtils.d.ts +13 -0
- package/dist/utils/service/venueUtils.d.ts.map +1 -0
- package/dist/utils/service/venueUtils.js +18 -0
- package/dist/utils/service/venueUtils.js.map +1 -0
- package/dist/utils/slugUtils.d.ts +9 -0
- package/dist/utils/slugUtils.d.ts.map +1 -0
- package/dist/utils/slugUtils.js +47 -0
- package/dist/utils/slugUtils.js.map +1 -0
- package/dist/utils/sortUtils.d.ts +7 -0
- package/dist/utils/sortUtils.d.ts.map +1 -0
- package/dist/utils/sortUtils.js +26 -0
- package/dist/utils/sortUtils.js.map +1 -0
- package/dist/utils/stringUtils.d.ts +2 -0
- package/dist/utils/stringUtils.d.ts.map +1 -0
- package/dist/utils/stringUtils.js +6 -0
- package/dist/utils/stringUtils.js.map +1 -0
- package/dist/utils/stripeAccountUtils.d.ts +3 -0
- package/dist/utils/stripeAccountUtils.d.ts.map +1 -0
- package/dist/utils/stripeAccountUtils.js +10 -0
- package/dist/utils/stripeAccountUtils.js.map +1 -0
- package/dist/utils/ticketListUtils.d.ts +12 -0
- package/dist/utils/ticketListUtils.d.ts.map +1 -0
- package/dist/utils/ticketListUtils.js +78 -0
- package/dist/utils/ticketListUtils.js.map +1 -0
- package/dist/utils/typeUtils.d.ts +11 -0
- package/dist/utils/typeUtils.d.ts.map +1 -0
- package/dist/utils/typeUtils.js +8 -0
- package/dist/utils/typeUtils.js.map +1 -0
- package/dist/utils/urlUtils.d.ts +10 -0
- package/dist/utils/urlUtils.d.ts.map +1 -0
- package/dist/utils/urlUtils.js +66 -0
- package/dist/utils/urlUtils.js.map +1 -0
- package/dist/utils/userPromoCodeUtils.d.ts +21 -0
- package/dist/utils/userPromoCodeUtils.d.ts.map +1 -0
- package/dist/utils/userPromoCodeUtils.js +13 -0
- package/dist/utils/userPromoCodeUtils.js.map +1 -0
- package/dist/utils/userSubscriptionUtils.d.ts +36 -0
- package/dist/utils/userSubscriptionUtils.d.ts.map +1 -0
- package/dist/utils/userSubscriptionUtils.js +56 -0
- package/dist/utils/userSubscriptionUtils.js.map +1 -0
- package/dist/utils/userUtils.d.ts +2 -0
- package/dist/utils/userUtils.d.ts.map +1 -0
- package/dist/utils/userUtils.js +2 -0
- package/dist/utils/userUtils.js.map +1 -0
- package/package.json +4 -2
- package/prisma/schema.prisma +247 -94
- package/src/definitions.ts +52 -1
- package/src/extendedSchemas.ts +180 -13
- package/src/index.ts +32 -21
- package/src/utils/apiUtils.ts +0 -0
- package/src/utils/arrayUtils.ts +0 -0
- package/src/utils/awsS3Utils.ts +0 -0
- package/src/utils/blog/blogDbUtils.ts +343 -0
- package/src/utils/blogUtils.ts +134 -0
- package/src/utils/entityUtils.ts +0 -0
- package/src/utils/generalDateTimeUtils.ts +0 -0
- package/src/utils/mathUtils.ts +0 -0
- package/src/utils/objUtils.ts +0 -0
- package/src/utils/paymentUtils.ts +0 -0
- package/src/utils/promoCodesUtils.ts +0 -0
- package/src/utils/qrCodeUtils.ts +4 -2
- package/src/utils/service/attendeeOptionUtils.ts +0 -0
- package/src/utils/service/regexUtils.ts +0 -0
- package/src/utils/service/serviceBookingStatusUtils.ts +6 -18
- package/src/utils/service/serviceDBUtils.ts +0 -0
- package/src/utils/service/serviceRateDBUtils.ts +0 -0
- package/src/utils/service/serviceUtils.ts +0 -0
- package/src/utils/service/venueUtils.ts +0 -0
- package/src/utils/slugUtils.ts +60 -0
- package/src/utils/sortUtils.ts +0 -0
- package/src/utils/stringUtils.ts +0 -0
- package/src/utils/stripeAccountUtils.ts +0 -0
- package/src/utils/ticketListUtils.ts +24 -6
- package/src/utils/urlUtils.ts +0 -0
- package/src/utils/userPromoCodeUtils.ts +0 -0
- package/src/utils/userSubscriptionUtils.ts +0 -0
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
import { DateTime, Interval } from "luxon";
|
|
2
|
+
import { dayOfWeekIdxToDay, dayOfWeekIdxToDayOfWeek, dayOfWeekToIdx, } from "./generalDateTimeUtils";
|
|
3
|
+
import { roundToNearestDivisor } from "./mathUtils";
|
|
4
|
+
const PARSE_TIME_REG = /^(\d{1,2}):(\d{2}) ?([APM]{0,2})$/i;
|
|
5
|
+
// export const LUXON_DATETIME_FORMAT_STANDARD = "MM/dd/yyyy - hh:mm a";
|
|
6
|
+
export const LUXON_DATETIME_FORMAT_STANDARD = "D t";
|
|
7
|
+
export const LUXON_DATETIME_FORMAT_ISO_LIKE = "D t"; //"D t";
|
|
8
|
+
// export const LUXON_DATE_FORMAT_STANDARD = "yyyy/MM/dd";
|
|
9
|
+
// export const LUXON_DATE_FORMAT_ISO = "yyyy/MM/dd";
|
|
10
|
+
export const LUXON_DATETIME_FORMAT_DATE = "D"; //"D t";
|
|
11
|
+
export const LUXON_TIME_FORMAT_AM_PM = "h:mm a";
|
|
12
|
+
export const MINUTES_PER_DAY = 1440;
|
|
13
|
+
export function dayOfWeekGetIdx(dayOfWeek) {
|
|
14
|
+
if (typeof dayOfWeek === "number") {
|
|
15
|
+
return dayOfWeek;
|
|
16
|
+
}
|
|
17
|
+
else if (typeof dayOfWeek === "string") {
|
|
18
|
+
return dayOfWeekToIdx[dayOfWeek];
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
throw new Error(`dayOfWeekToIdx: unhandled case`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function dateTimeFromDayTime(dayOfWeek, hour = 0, minute = 0, interpretAsTimezone, timezoneToConvertTo) {
|
|
25
|
+
//use date where first day of month is a known sunday
|
|
26
|
+
let res = DateTime.fromObject({
|
|
27
|
+
year: 2023,
|
|
28
|
+
month: 1,
|
|
29
|
+
// weekday: dayOfWeekGetIdx(dayOfWeek),
|
|
30
|
+
day: dayOfWeekIdxToDay[dayOfWeekGetIdx(dayOfWeek)],
|
|
31
|
+
hour: hour,
|
|
32
|
+
minute: minute,
|
|
33
|
+
}, {
|
|
34
|
+
zone: interpretAsTimezone,
|
|
35
|
+
});
|
|
36
|
+
if (timezoneToConvertTo) {
|
|
37
|
+
res = res.setZone(timezoneToConvertTo);
|
|
38
|
+
}
|
|
39
|
+
return res;
|
|
40
|
+
}
|
|
41
|
+
export function dateTimeFromDate(date, interpretAsTimezone, timezoneToConvertTo) {
|
|
42
|
+
let res = typeof date === "string"
|
|
43
|
+
? DateTime.fromISO(date, { zone: interpretAsTimezone })
|
|
44
|
+
: DateTime.fromJSDate(date, { zone: interpretAsTimezone });
|
|
45
|
+
if (timezoneToConvertTo) {
|
|
46
|
+
res = res.setZone(timezoneToConvertTo);
|
|
47
|
+
}
|
|
48
|
+
return res;
|
|
49
|
+
}
|
|
50
|
+
export function dateTimeToTimeComponents(dateTime) {
|
|
51
|
+
return {
|
|
52
|
+
hour: dateTime.hour,
|
|
53
|
+
minute: dateTime.minute,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function dateTimeToDateComponents(dateTime) {
|
|
57
|
+
return {
|
|
58
|
+
year: dateTime.year,
|
|
59
|
+
month: dateTime.month,
|
|
60
|
+
day: dateTime.day,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function dateTimeFromTime(time, interpretAsTimezone, timezoneToConvertTo) {
|
|
64
|
+
let res = typeof time === "string"
|
|
65
|
+
? DateTime.fromFormat(time, LUXON_TIME_FORMAT_AM_PM, {
|
|
66
|
+
zone: interpretAsTimezone,
|
|
67
|
+
})
|
|
68
|
+
: DateTime.fromJSDate(time, { zone: interpretAsTimezone });
|
|
69
|
+
if (!res.isValid) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
if (timezoneToConvertTo) {
|
|
73
|
+
res = res.setZone(timezoneToConvertTo);
|
|
74
|
+
}
|
|
75
|
+
return res;
|
|
76
|
+
}
|
|
77
|
+
export function dateTimeFromComponents(date, time, interpretAsTimezone, timezoneToConvertTo) {
|
|
78
|
+
let res = date
|
|
79
|
+
? DateTime.isDateTime(date)
|
|
80
|
+
? date.setZone(interpretAsTimezone)
|
|
81
|
+
: dateTimeFromDate(date, interpretAsTimezone, timezoneToConvertTo)
|
|
82
|
+
: DateTime.now().setZone(timezoneToConvertTo ?? interpretAsTimezone ?? undefined);
|
|
83
|
+
const timeComp = DateTime.isDateTime(time)
|
|
84
|
+
? time.setZone(interpretAsTimezone)
|
|
85
|
+
: dateTimeFromTime(time ?? "12:00 AM", interpretAsTimezone, timezoneToConvertTo);
|
|
86
|
+
if (!timeComp) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
res = dateTimeSetTime(res, timeComp);
|
|
90
|
+
if (timezoneToConvertTo) {
|
|
91
|
+
res = res.setZone(timezoneToConvertTo);
|
|
92
|
+
}
|
|
93
|
+
return res;
|
|
94
|
+
}
|
|
95
|
+
export function dateTimeGetDateTimeTime(dateTime) {
|
|
96
|
+
return DateTime.fromObject({
|
|
97
|
+
// day: dayOfWeekIdxToDay[dateTime.weekday as DayOfWeekIdx],
|
|
98
|
+
hour: dateTime.hour,
|
|
99
|
+
minute: dateTime.minute,
|
|
100
|
+
}, {
|
|
101
|
+
zone: dateTime.zone,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export function dateTimeSetTime(dateTime, time = { hour: 0, minute: 0 }) {
|
|
105
|
+
const timeComp = DateTime.isDateTime(time)
|
|
106
|
+
? dateTimeToTimeComponents(time)
|
|
107
|
+
: time;
|
|
108
|
+
return dateTime.set(timeComp);
|
|
109
|
+
}
|
|
110
|
+
export function dateTimeSetDate(dateTime, date = { year: 2020, month: 1, day: 1 }) {
|
|
111
|
+
const dateComp = DateTime.isDateTime(date)
|
|
112
|
+
? dateTimeToDateComponents(date)
|
|
113
|
+
: date;
|
|
114
|
+
return dateTime.set(dateComp);
|
|
115
|
+
}
|
|
116
|
+
export function dateRangeGetDateTimeTIme(dateRange) {
|
|
117
|
+
return {
|
|
118
|
+
start: dateTimeGetDateTimeTime(dateRange.start),
|
|
119
|
+
end: dateTimeGetDateTimeTime(dateRange.end),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function dateTimeFormat(dateTime) {
|
|
123
|
+
return dateTime?.toFormat(LUXON_DATETIME_FORMAT_STANDARD) ?? "";
|
|
124
|
+
}
|
|
125
|
+
export function dateTimeFormatLong(dateTime) {
|
|
126
|
+
return `${dateTime?.weekdayLong} ${dateTimeFormatWeek(dateTime)}`;
|
|
127
|
+
}
|
|
128
|
+
export function dateTimeFormatWeek(dateTime) {
|
|
129
|
+
return dateTime?.toFormat(LUXON_DATETIME_FORMAT_STANDARD) ?? "";
|
|
130
|
+
}
|
|
131
|
+
export function dateTimeFormatDate(dateTime) {
|
|
132
|
+
return dateTime?.toFormat(LUXON_DATETIME_FORMAT_DATE) ?? "";
|
|
133
|
+
}
|
|
134
|
+
export function dateTimeFormatTime(dateTime) {
|
|
135
|
+
return dateTime?.toFormat(LUXON_TIME_FORMAT_AM_PM) ?? "";
|
|
136
|
+
}
|
|
137
|
+
export function dateTimeWithinRange(dateTime, dateRange) {
|
|
138
|
+
return Interval.fromDateTimes(dateRange.start, dateRange.end).contains(dateTime);
|
|
139
|
+
}
|
|
140
|
+
export function dateTimeRangeIntersection(lhs, rhs) {
|
|
141
|
+
const intervalFirst = Interval.fromDateTimes(lhs.start, lhs.end);
|
|
142
|
+
const intervalSecond = Interval.fromDateTimes(rhs.start, rhs.end);
|
|
143
|
+
return intervalFirst.intersection(intervalSecond);
|
|
144
|
+
}
|
|
145
|
+
export function dateRangeWithinDateRange(dateRange, withinRange) {
|
|
146
|
+
const withinInterval = Interval.fromDateTimes(withinRange.start, withinRange.end);
|
|
147
|
+
return (withinInterval.contains(dateRange.start) &&
|
|
148
|
+
withinInterval.contains(dateRange.end));
|
|
149
|
+
}
|
|
150
|
+
export function dateTimeRangeToInterval(dateTimeRange) {
|
|
151
|
+
return Interval.fromDateTimes(dateTimeRange.start, dateTimeRange.end);
|
|
152
|
+
}
|
|
153
|
+
export function dateRangeDurationMatch(lhs, rhs, withinSeconds = 60) {
|
|
154
|
+
return (Math.abs(lhs.end.diff(lhs.start).toMillis() - rhs.end.diff(rhs.end).toMillis()) <=
|
|
155
|
+
withinSeconds * 1000);
|
|
156
|
+
}
|
|
157
|
+
export function utcOffsetMinutesToTimezone(utcOffsetMinutes) {
|
|
158
|
+
const hours = Math.floor(Math.abs(utcOffsetMinutes) / 60);
|
|
159
|
+
const minutes = Math.abs(utcOffsetMinutes) % 60;
|
|
160
|
+
const sign = utcOffsetMinutes >= 0 ? "+" : "-";
|
|
161
|
+
const offsetString = `UTC${sign}${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`;
|
|
162
|
+
return offsetString;
|
|
163
|
+
}
|
|
164
|
+
// export function getLocalTimezone() {
|
|
165
|
+
// const localDateTime = DateTime.local();
|
|
166
|
+
// return utcOffsetMinutesToTimezone(localDateTime.offset);
|
|
167
|
+
// }
|
|
168
|
+
export function dateTimeFormatDateRange(startDateTimeArg, endDateTimeArg) {
|
|
169
|
+
if (startDateTimeArg?.day === endDateTimeArg?.day) {
|
|
170
|
+
return `${dateTimeFormat(startDateTimeArg)} to ${dateTimeFormatTime(endDateTimeArg)}`;
|
|
171
|
+
}
|
|
172
|
+
return `${dateTimeFormat(startDateTimeArg)} to ${dateTimeFormat(endDateTimeArg)}`;
|
|
173
|
+
}
|
|
174
|
+
export function dateTimeFormatDateRangeDate(startDateTimeArg, endDateTimeArg) {
|
|
175
|
+
if (startDateTimeArg?.day === endDateTimeArg?.day) {
|
|
176
|
+
return `${dateTimeFormatDate(startDateTimeArg)} to ${dateTimeFormatDate(endDateTimeArg)}`;
|
|
177
|
+
}
|
|
178
|
+
return `${dateTimeFormatDate(startDateTimeArg)} to ${dateTimeFormatDate(endDateTimeArg)}`;
|
|
179
|
+
}
|
|
180
|
+
export function dateTimeFormatDateRangeList(startDateTimeArg, endDateTimeArg) {
|
|
181
|
+
if (startDateTimeArg?.day === endDateTimeArg?.day) {
|
|
182
|
+
return {
|
|
183
|
+
start: dateTimeFormat(startDateTimeArg),
|
|
184
|
+
end: dateTimeFormatTime(endDateTimeArg),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
start: dateTimeFormat(startDateTimeArg),
|
|
189
|
+
end: dateTimeFormat(endDateTimeArg),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
export function formatDayOfWeekHours(hours) {
|
|
193
|
+
return Object.entries(hours).map(([dayIdx, ranges]) => {
|
|
194
|
+
const dayName = dayOfWeekIdxToDayOfWeek[parseInt(dayIdx, 10)]; // Convert index to day name
|
|
195
|
+
const formattedRanges = ranges
|
|
196
|
+
.map(({ start, end }) => `${start.toFormat("h:mm a")} – ${end.toFormat("h:mm a")}`)
|
|
197
|
+
.join(", ");
|
|
198
|
+
return `${dayName}: ${formattedRanges}`;
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
export function mergeCrossDayHours(hours) {
|
|
202
|
+
if (hours.length === 0)
|
|
203
|
+
return [];
|
|
204
|
+
// Sort by start time
|
|
205
|
+
const sortedHours = hours.sort((a, b) => a.start.toMillis() - b.start.toMillis());
|
|
206
|
+
const mergedHours = [];
|
|
207
|
+
for (const range of sortedHours) {
|
|
208
|
+
if (mergedHours.length === 0) {
|
|
209
|
+
mergedHours.push(range);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const lastMerged = mergedHours[mergedHours.length - 1];
|
|
213
|
+
// Calculate the time difference between last merged range end and current range start
|
|
214
|
+
const gapInMinutes = range.start.diff(lastMerged.end, "minutes").minutes;
|
|
215
|
+
// If the gap is 1 minute or less, merge the ranges
|
|
216
|
+
if (gapInMinutes <= 1) {
|
|
217
|
+
lastMerged.end = range.end; // Extend the end time
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
mergedHours.push(range); // Otherwise, treat it as a new separate range
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return mergedHours;
|
|
224
|
+
}
|
|
225
|
+
export function dateTimeHoursByDay(hours) {
|
|
226
|
+
return hours.reduce((sofar, curr) => {
|
|
227
|
+
sofar[curr.start.weekday].push(curr);
|
|
228
|
+
sofar[curr.start.weekday] = mergeCrossDayHours(sofar[curr.start.weekday]);
|
|
229
|
+
return sofar;
|
|
230
|
+
}, Object.keys(dayOfWeekIdxToDayOfWeek).reduce((sofar, curr) => {
|
|
231
|
+
return {
|
|
232
|
+
...sofar,
|
|
233
|
+
[Number(curr)]: [],
|
|
234
|
+
};
|
|
235
|
+
}, {}));
|
|
236
|
+
}
|
|
237
|
+
export function normalizeLuxonInterval(interval) {
|
|
238
|
+
const setArgs = { year: 0, month: 1, day: 1 };
|
|
239
|
+
const timezone = interval?.start?.zone || interval?.end?.zone || "local";
|
|
240
|
+
const originalStart = interval?.start;
|
|
241
|
+
const originalEnd = interval?.end;
|
|
242
|
+
const start = originalStart?.set(setArgs) ??
|
|
243
|
+
DateTime.fromObject(setArgs, { zone: timezone });
|
|
244
|
+
let end = originalEnd?.set(setArgs) ??
|
|
245
|
+
DateTime.fromObject(setArgs, { zone: timezone });
|
|
246
|
+
if (originalEnd &&
|
|
247
|
+
originalStart &&
|
|
248
|
+
originalEnd.hasSame(originalStart, "day") === false) {
|
|
249
|
+
end = end.set({ hour: 23, minute: 59 });
|
|
250
|
+
}
|
|
251
|
+
return Interval.fromDateTimes(start, end);
|
|
252
|
+
}
|
|
253
|
+
export function dateRangeIntervalFromWeekdayTime(dateRange) {
|
|
254
|
+
return Interval.fromDateTimes(dateRange.start, dateRange.end);
|
|
255
|
+
}
|
|
256
|
+
// Helper function to calculate overlaps for a single day's array of hours
|
|
257
|
+
function getOverlappingIntervalsList(ranges, inputInterval) {
|
|
258
|
+
// Convert LuxonDateRange objects to Interval objects
|
|
259
|
+
const rangeIntervals = ranges.map(({ start, end }) => Interval.fromDateTimes(start, end));
|
|
260
|
+
// Find overlapping intervals between the range intervals and the single input interval
|
|
261
|
+
return rangeIntervals
|
|
262
|
+
.map((rangeInterval) => rangeInterval.intersection(inputInterval))
|
|
263
|
+
.filter((interval) => interval !== null);
|
|
264
|
+
}
|
|
265
|
+
//returns common horus that are overlapping with input Interval on everyday (with valid hours) within weekHours
|
|
266
|
+
export function dateTimeGetOverlappingHoursCommonHelper(weekHours, inputInterval) {
|
|
267
|
+
console.log(`dateTimeGetOverlappingHoursCommonHelper weekHours: ${JSON.stringify(weekHours)}, inputInterval: ${JSON.stringify(inputInterval)}`);
|
|
268
|
+
let commonInterval = null;
|
|
269
|
+
// const inputIntervalNormalized = normalizeLuxonInterval(inputInterval);
|
|
270
|
+
for (const dayIdx in weekHours) {
|
|
271
|
+
const dayKey = parseInt(dayIdx);
|
|
272
|
+
// console.log(`dateTimeGetCommonOverlappingHours dayIdx: ${dayIdx}`);
|
|
273
|
+
if (weekHours[dayKey] == null) {
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
// Calculate overlapping intervals for the current day
|
|
277
|
+
const dailyIntervals = getOverlappingIntervalsList(weekHours[dayKey], inputInterval);
|
|
278
|
+
console.log(`dateTimeGetOverlappingHoursCommonHelper dayIdx: ${dayIdx}, dailyIntervals: ${JSON.stringify(dailyIntervals)}`);
|
|
279
|
+
if (dailyIntervals.length === 0) {
|
|
280
|
+
// No overlap for this day, so no common interval is possible
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
// Treat each daily interval separately
|
|
284
|
+
const dailyTimeIntervals = dailyIntervals
|
|
285
|
+
.filter((dailyInterval) => dailyInterval.start !== null && dailyInterval.end !== null)
|
|
286
|
+
.map((dailyInterval) => {
|
|
287
|
+
return normalizeLuxonInterval(dailyInterval);
|
|
288
|
+
});
|
|
289
|
+
// Find the intersection of all daily intervals with the current common interval
|
|
290
|
+
for (const dailyTimeInterval of dailyTimeIntervals) {
|
|
291
|
+
if (commonInterval === null) {
|
|
292
|
+
commonInterval = dailyTimeInterval;
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
commonInterval = commonInterval.intersection(dailyTimeInterval);
|
|
296
|
+
if (commonInterval === null) {
|
|
297
|
+
// If no common interval remains, return null early
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// console.log(
|
|
304
|
+
// `dateTimeGetCommonOverlappingHours commonInterval: ${JSON.stringify(
|
|
305
|
+
// commonInterval
|
|
306
|
+
// )}`
|
|
307
|
+
// );
|
|
308
|
+
// Convert the common interval to a LuxonDateRange if it exists
|
|
309
|
+
if (commonInterval == null ||
|
|
310
|
+
commonInterval.start == null ||
|
|
311
|
+
commonInterval.end == null) {
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
start: commonInterval.start,
|
|
316
|
+
end: commonInterval.end,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
export function dateTimeGetOverlappingHoursCommon(weekHours, inputHours) {
|
|
320
|
+
const inputInterval = Interval.fromDateTimes(inputHours.start, inputHours.end);
|
|
321
|
+
return dateTimeGetOverlappingHoursCommonHelper(weekHours, inputInterval);
|
|
322
|
+
}
|
|
323
|
+
// Returns a list of overlapping hours for any dateRange in weekHours[startDay of inputRange]
|
|
324
|
+
export function dateTimeGetOverlappingHoursContinuousHelper(weekHours, inputInterval) {
|
|
325
|
+
console.log(`dateTimeGetOverlappingHoursContinuousHelper weekHours: ${JSON.stringify(weekHours)}, inputRange: ${JSON.stringify(inputInterval)}`);
|
|
326
|
+
if (!inputInterval.start) {
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
const startDayIdx = inputInterval.start.weekday;
|
|
330
|
+
if (!weekHours[startDayIdx]) {
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
// Calculate overlapping intervals for the start day of inputRange
|
|
334
|
+
const overlappingIntervals = getOverlappingIntervalsList(weekHours[startDayIdx], inputInterval);
|
|
335
|
+
console.log(`dateTimeGetOverlappingHoursContinuousHelper startDayIdx: ${startDayIdx}, overlappingIntervals: ${JSON.stringify(overlappingIntervals)}`);
|
|
336
|
+
// Convert overlapping intervals back to LuxonDateRange[]
|
|
337
|
+
return overlappingIntervals
|
|
338
|
+
.filter((interval) => interval.start !== null && interval.end !== null)
|
|
339
|
+
.map((interval) => ({
|
|
340
|
+
start: interval.start,
|
|
341
|
+
end: interval.end,
|
|
342
|
+
}));
|
|
343
|
+
}
|
|
344
|
+
export function dateTimeGetOverlappingHoursContinuous(weekHours, inputHours) {
|
|
345
|
+
const inputInterval = Interval.fromDateTimes(inputHours.start, inputHours.end);
|
|
346
|
+
return dateTimeGetOverlappingHoursContinuousHelper(weekHours, inputInterval);
|
|
347
|
+
}
|
|
348
|
+
export function filterConflictingIntervals(availableHours, blockedHours) {
|
|
349
|
+
// Convert available hours into an array of Intervals
|
|
350
|
+
let remainingIntervals = availableHours.map(({ start, end }) => Interval.fromDateTimes(start, end));
|
|
351
|
+
// Convert blocked hours into Intervals and subtract them from each available interval
|
|
352
|
+
blockedHours
|
|
353
|
+
.map(({ start, end }) => Interval.fromDateTimes(start, end))
|
|
354
|
+
.forEach((blockedInterval) => {
|
|
355
|
+
remainingIntervals = remainingIntervals.flatMap((availableInterval) => availableInterval.difference(blockedInterval));
|
|
356
|
+
});
|
|
357
|
+
// Convert the resulting Intervals back to LuxonDateRange[]
|
|
358
|
+
return remainingIntervals.map((interval) => ({
|
|
359
|
+
start: interval.start,
|
|
360
|
+
end: interval.end,
|
|
361
|
+
}));
|
|
362
|
+
}
|
|
363
|
+
export function getConflictingIntervals(availableHours, blockedHours) {
|
|
364
|
+
// Convert available hours and blocked hours into arrays of Luxon Intervals
|
|
365
|
+
const availableIntervals = availableHours.map(({ start, end }) => Interval.fromDateTimes(start, end));
|
|
366
|
+
const blockedIntervals = blockedHours.map(({ start, end }) => Interval.fromDateTimes(start, end));
|
|
367
|
+
// For each available interval, find intersections with each blocked interval
|
|
368
|
+
const conflictingIntervals = [];
|
|
369
|
+
availableIntervals.forEach((availableInterval) => {
|
|
370
|
+
blockedIntervals.forEach((blockedInterval) => {
|
|
371
|
+
const intersection = availableInterval.intersection(blockedInterval);
|
|
372
|
+
if (intersection) {
|
|
373
|
+
conflictingIntervals.push(intersection);
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
// Convert the resulting conflicting Intervals back to LuxonDateRange[]
|
|
378
|
+
return conflictingIntervals.map((interval) => ({
|
|
379
|
+
start: interval.start,
|
|
380
|
+
end: interval.end,
|
|
381
|
+
}));
|
|
382
|
+
}
|
|
383
|
+
// export function generateTimeSlots(
|
|
384
|
+
// filteredHours: LuxonDateRange[],
|
|
385
|
+
// bookedRange: LuxonDateRange,
|
|
386
|
+
// businessHours: LuxonDayOfWeekHours
|
|
387
|
+
// ): TimeSlots {
|
|
388
|
+
// const timeSlotsStart: string[] = [];
|
|
389
|
+
// let timeSlotsEnd: string[] = [];
|
|
390
|
+
// let currentTime = bookedRange.start;
|
|
391
|
+
// const endTime = bookedRange.end;
|
|
392
|
+
// while (currentTime < endTime) {
|
|
393
|
+
// const currentDayOfWeek = currentTime.weekday as DayOfWeekIdx;
|
|
394
|
+
// const businessDayHours = businessHours[currentDayOfWeek]?.[0];
|
|
395
|
+
// if (!businessDayHours) {
|
|
396
|
+
// throw new Error("No business hours found for the current day.");
|
|
397
|
+
// }
|
|
398
|
+
// const { start: dayStart, end: dayEnd } = businessDayHours;
|
|
399
|
+
// // Ensure the current time is within today's business hours
|
|
400
|
+
// if (currentTime < dayStart) {
|
|
401
|
+
// currentTime = dayStart;
|
|
402
|
+
// }
|
|
403
|
+
// // If adding 30 minutes exceeds today's boundary, jump to the next day's start
|
|
404
|
+
// if (currentTime.plus({ minutes: 30 }) > dayEnd) {
|
|
405
|
+
// const nextDayOfWeek = currentTime.plus({ days: 1 })
|
|
406
|
+
// .weekday as DayOfWeekIdx;
|
|
407
|
+
// const nextDayHours = businessHours[nextDayOfWeek]?.[0];
|
|
408
|
+
// if (!nextDayHours) {
|
|
409
|
+
// throw new Error("No business hours for the next day.");
|
|
410
|
+
// }
|
|
411
|
+
// currentTime = nextDayHours.start;
|
|
412
|
+
// } else {
|
|
413
|
+
// timeSlotsStart.push(dateTimeFormatTime(currentTime));
|
|
414
|
+
// currentTime = currentTime.plus({ minutes: 30 });
|
|
415
|
+
// }
|
|
416
|
+
// }
|
|
417
|
+
// // The last slot should match the end time, respecting endDayOfWeek business hours
|
|
418
|
+
// const endDayOfWeek = bookedRange.end.weekday as DayOfWeekIdx;
|
|
419
|
+
// const endDayHours = businessHours[endDayOfWeek]?.[0];
|
|
420
|
+
// if (!endDayHours) {
|
|
421
|
+
// throw new Error("No business hours for the final day.");
|
|
422
|
+
// }
|
|
423
|
+
// const finalEndTime =
|
|
424
|
+
// bookedRange.end > endDayHours.end ? endDayHours.end : bookedRange.end;
|
|
425
|
+
// timeSlotsEnd = [...timeSlotsStart.slice(1), dateTimeFormatTime(finalEndTime)];
|
|
426
|
+
// return {
|
|
427
|
+
// start: timeSlotsStart,
|
|
428
|
+
// end: timeSlotsEnd,
|
|
429
|
+
// } as TimeSlots;
|
|
430
|
+
// }
|
|
431
|
+
// export function generateTimeSlots(filteredHours: LuxonDateRange[]): TimeSlots {
|
|
432
|
+
// const timeSlotsStart: string[] = [];
|
|
433
|
+
// let timeSlotsEnd: string[] = [];
|
|
434
|
+
// filteredHours.forEach(({ start, end }) => {
|
|
435
|
+
// let currentTime = start;
|
|
436
|
+
// while (currentTime < end) {
|
|
437
|
+
// timeSlotsStart.push(dateTimeFormatTime(currentTime)); // Add the time in "HH:mm" format
|
|
438
|
+
// currentTime = currentTime.plus({ minutes: 30 }); // Increment by 30 minutes
|
|
439
|
+
// }
|
|
440
|
+
// const finalTime =
|
|
441
|
+
// currentTime.hour == 0 && currentTime.minute == 0
|
|
442
|
+
// ? currentTime.set({ hour: 23, minute: 59 })
|
|
443
|
+
// : currentTime;
|
|
444
|
+
// timeSlotsEnd = [...timeSlotsStart, dateTimeFormatTime(finalTime)];
|
|
445
|
+
// });
|
|
446
|
+
// return {
|
|
447
|
+
// start: timeSlotsStart,
|
|
448
|
+
// end: timeSlotsEnd,
|
|
449
|
+
// } as TimeSlots;
|
|
450
|
+
// }
|
|
451
|
+
export function generateTimeSlots(filteredHours, incMin = 15) {
|
|
452
|
+
const timeSlotsStart = [];
|
|
453
|
+
let timeSlotsEnd = [];
|
|
454
|
+
filteredHours.forEach(({ start, end }) => {
|
|
455
|
+
let currentTime = start;
|
|
456
|
+
const startEnd = start.set({ hour: 23, minute: 59 });
|
|
457
|
+
const endEnd = end.set({ hour: 23, minute: 59 });
|
|
458
|
+
while (currentTime < startEnd) {
|
|
459
|
+
timeSlotsStart.push(dateTimeFormatTime(currentTime)); // Add the time in "HH:mm" format
|
|
460
|
+
currentTime = currentTime.plus({ minutes: incMin }); // Increment by 30 minutes
|
|
461
|
+
}
|
|
462
|
+
currentTime = end;
|
|
463
|
+
while (currentTime < endEnd) {
|
|
464
|
+
timeSlotsEnd.push(dateTimeFormatTime(currentTime)); // Add the time in "HH:mm" format
|
|
465
|
+
currentTime = currentTime.plus({ minutes: incMin }); // Increment by 30 minutes
|
|
466
|
+
}
|
|
467
|
+
const finalTime = currentTime.hour == 0 && currentTime.minute == 0
|
|
468
|
+
? currentTime.set({ hour: 23, minute: 59 })
|
|
469
|
+
: currentTime;
|
|
470
|
+
timeSlotsEnd = [...timeSlotsEnd, dateTimeFormatTime(finalTime)];
|
|
471
|
+
});
|
|
472
|
+
return {
|
|
473
|
+
start: timeSlotsStart,
|
|
474
|
+
end: timeSlotsEnd,
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
export function dateTimeNormalizeToMWY(srcDate, referenceDate) {
|
|
478
|
+
const srcWeekday = srcDate.weekday;
|
|
479
|
+
const firstDayOfReferenceMonth = DateTime.fromObject({
|
|
480
|
+
year: referenceDate.year,
|
|
481
|
+
month: referenceDate.month,
|
|
482
|
+
day: 1,
|
|
483
|
+
}, { zone: srcDate.zone });
|
|
484
|
+
const weekdayOffset = (srcWeekday - firstDayOfReferenceMonth.weekday + 7) % 7;
|
|
485
|
+
const referenceWeekday = firstDayOfReferenceMonth.plus({
|
|
486
|
+
days: weekdayOffset,
|
|
487
|
+
});
|
|
488
|
+
const referenceWeek = Math.ceil((referenceDate.day - 1 - weekdayOffset) / 7); //ceil instead of floor to ensure week wraps around forward and not backwards
|
|
489
|
+
const normalizedDate = referenceWeekday.plus({ weeks: referenceWeek }).set({
|
|
490
|
+
hour: srcDate.hour,
|
|
491
|
+
minute: srcDate.minute,
|
|
492
|
+
});
|
|
493
|
+
// console.log(
|
|
494
|
+
// `dateTimeNormalizeToMWY: srcDate: ${JSON.stringify(
|
|
495
|
+
// srcDate
|
|
496
|
+
// )}, referenceDate: ${JSON.stringify(
|
|
497
|
+
// referenceDate
|
|
498
|
+
// )}, referenceDate: ${JSON.stringify(normalizedDate)}`
|
|
499
|
+
// );
|
|
500
|
+
return normalizedDate;
|
|
501
|
+
}
|
|
502
|
+
export function dateRangeNormalizeToMWY(srcRange, referenceRange) {
|
|
503
|
+
// Calculate the original duration between start and end
|
|
504
|
+
const originalDuration = srcRange.end.diff(srcRange.start, [
|
|
505
|
+
"weeks",
|
|
506
|
+
"days",
|
|
507
|
+
"hours",
|
|
508
|
+
]);
|
|
509
|
+
// Normalize the start date
|
|
510
|
+
const newStart = dateTimeNormalizeToMWY(srcRange.start, referenceRange.start);
|
|
511
|
+
// Apply the duration to the normalized start to compute the new end
|
|
512
|
+
let newEnd = newStart.plus(originalDuration);
|
|
513
|
+
// Check if the end date wraps around to the next week
|
|
514
|
+
if (newEnd.weekNumber < newStart.weekNumber) {
|
|
515
|
+
// Adjust to the next week by adding one week
|
|
516
|
+
newEnd = newEnd.plus({ weeks: 1 });
|
|
517
|
+
}
|
|
518
|
+
const newRange = {
|
|
519
|
+
start: newStart,
|
|
520
|
+
end: newEnd,
|
|
521
|
+
};
|
|
522
|
+
// console.log(
|
|
523
|
+
// `dateRangeNormalizeToMWY srcRange: ${JSON.stringify(
|
|
524
|
+
// srcRange
|
|
525
|
+
// )}, referenceRange: ${JSON.stringify(
|
|
526
|
+
// referenceRange
|
|
527
|
+
// )}, newRange: ${JSON.stringify(newRange)}`
|
|
528
|
+
// );
|
|
529
|
+
return newRange;
|
|
530
|
+
}
|
|
531
|
+
//need function to extend out businesshours until the date of the reference range
|
|
532
|
+
//need function to merge overlap[startDate] if they continue onto the next day
|
|
533
|
+
export function luxonDateRangeSort(dateRanges) {
|
|
534
|
+
return dateRanges.sort((a, b) => a.start.toMillis() - b.start.toMillis());
|
|
535
|
+
}
|
|
536
|
+
export function dateTimeDiffHours(startTime, endTime) {
|
|
537
|
+
// console.log(
|
|
538
|
+
// `calculateHoursBetweenTimes startTime: ${JSON.stringify(
|
|
539
|
+
// startTime
|
|
540
|
+
// )}, endTime: ${JSON.stringify(endTime)}`
|
|
541
|
+
// );
|
|
542
|
+
if (startTime == null || endTime == null) {
|
|
543
|
+
return 0;
|
|
544
|
+
}
|
|
545
|
+
const diff = endTime.diff(startTime, ["minutes", "days"]).toObject();
|
|
546
|
+
const hours = ((diff.minutes ?? 0) + 1) / 60;
|
|
547
|
+
const days = (diff.days ?? 0) + 1;
|
|
548
|
+
// console.log(`calculateHoursBetweenTimes diff: ${JSON.stringify(diff)}`);
|
|
549
|
+
return roundToNearestDivisor(hours * days, 4); //round to nearest quarter hour
|
|
550
|
+
}
|
|
551
|
+
export function dateTimeRangeHours(dateTimeRange) {
|
|
552
|
+
return roundToNearestDivisor(dateTimeRangeToInterval(dateTimeRange).toDuration("hours").toObject()
|
|
553
|
+
?.hours ?? 0, 4); //round to nearest quarter hour
|
|
554
|
+
}
|
|
555
|
+
export function dateTimeRangeCrossesMidnight(range) {
|
|
556
|
+
return (range.start.hour > range.end.hour ||
|
|
557
|
+
(range.start.hour === range.end.hour &&
|
|
558
|
+
range.start.minute >= range.end.minute));
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Given an overall range, split it into segments that use the input's
|
|
562
|
+
* start time as the daily "start" and the input's end time as the daily "end."
|
|
563
|
+
*
|
|
564
|
+
* Each segment will run from a day's daily start to the next day's daily end.
|
|
565
|
+
*
|
|
566
|
+
* For example, if the overall range is:
|
|
567
|
+
* start: March 5, 2025 11:00 am
|
|
568
|
+
* end: March 9, 2025 9:00 pm
|
|
569
|
+
*
|
|
570
|
+
* then the segments produced are:
|
|
571
|
+
* March 5, 11:00 am – March 6, 9:00 pm
|
|
572
|
+
* March 6, 11:00 am – March 7, 9:00 pm
|
|
573
|
+
* March 7, 11:00 am – March 8, 9:00 pm
|
|
574
|
+
* March 8, 11:00 am – March 9, 9:00 pm
|
|
575
|
+
*
|
|
576
|
+
* (You can then filter out partial segments if you want only full "days.")
|
|
577
|
+
*/
|
|
578
|
+
export function splitRangeByInputTimes(range) {
|
|
579
|
+
const startTime = dateTimeToTimeComponents(range.start);
|
|
580
|
+
const endTime = dateTimeToTimeComponents(range.end);
|
|
581
|
+
const segments = [];
|
|
582
|
+
// Determine if the range crosses midnight.
|
|
583
|
+
const crossesMidnight = dateTimeRangeCrossesMidnight(range);
|
|
584
|
+
// Set the first segment's start.
|
|
585
|
+
let currentStart = range.start.set(startTime);
|
|
586
|
+
if (currentStart < range.start) {
|
|
587
|
+
currentStart = currentStart.plus({ days: 1 });
|
|
588
|
+
}
|
|
589
|
+
while (true) {
|
|
590
|
+
// Determine current segment's end depending on whether we cross midnight.
|
|
591
|
+
const currentEnd = crossesMidnight
|
|
592
|
+
? currentStart.plus({ days: 1 }).set(endTime)
|
|
593
|
+
: currentStart.set(endTime);
|
|
594
|
+
if (currentEnd > range.end) {
|
|
595
|
+
// segments.push({ start: currentStart, end: range.end });
|
|
596
|
+
break;
|
|
597
|
+
}
|
|
598
|
+
segments.push({ start: currentStart, end: currentEnd });
|
|
599
|
+
// Move to the next segment's start:
|
|
600
|
+
// (Always add one day and then snap to the start time.)
|
|
601
|
+
currentStart = currentStart.plus({ days: 1 }).set(startTime);
|
|
602
|
+
}
|
|
603
|
+
return segments;
|
|
604
|
+
}
|
|
605
|
+
export function dateTimeRangeFromDates(startDate, endDate, interpretAsTimezone, timezoneToConvertTo) {
|
|
606
|
+
return {
|
|
607
|
+
start: dateTimeFromDate(startDate, interpretAsTimezone, timezoneToConvertTo),
|
|
608
|
+
end: dateTimeFromDate(endDate, interpretAsTimezone, timezoneToConvertTo),
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
export function dateTimeFromString(str) {
|
|
612
|
+
return DateTime.fromISO(str);
|
|
613
|
+
}
|
|
614
|
+
export function dateTimeToString(dateTime) {
|
|
615
|
+
return dateTime.toISO();
|
|
616
|
+
}
|
|
617
|
+
export function dateRangesFormat(dateRanges) {
|
|
618
|
+
const result = dateRanges
|
|
619
|
+
.map((dateRange) => dateTimeFormatDateRange(dateRange.start, dateRange.end))
|
|
620
|
+
.join(", ");
|
|
621
|
+
return result;
|
|
622
|
+
}
|
|
623
|
+
//# sourceMappingURL=luxonUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"luxonUtils.js","sourceRoot":"","sources":["../../src/utils/luxonUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mathUtils.d.ts","sourceRoot":"","sources":["../../src/utils/mathUtils.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtE"}
|