Browse Source
fix date range behavior to be more strongly typed, last 7 days is not an alias for a static date range.
main
fix date range behavior to be more strongly typed, last 7 days is not an alias for a static date range.
main
Gisle Aune
3 years ago
12 changed files with 5317 additions and 19983 deletions
-
24896svelte-ui/package-lock.json
-
2svelte-ui/package.json
-
2svelte-ui/src/components/Composition.svelte
-
198svelte-ui/src/components/DateRangeSelect.svelte
-
2svelte-ui/src/components/GoalEntry.svelte
-
4svelte-ui/src/components/ProgressNumbers.svelte
-
25svelte-ui/src/forms/GoalForm.svelte
-
17svelte-ui/src/pages/FrontPage.svelte
-
16svelte-ui/src/pages/GoalPage.svelte
-
24svelte-ui/src/pages/LogsPage.svelte
-
102svelte-ui/src/utils/date-range.ts
-
12svelte-ui/src/utils/time.ts
24896
svelte-ui/package-lock.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,102 @@ |
|||||
|
import pluralize from "pluralize"; |
||||
|
|
||||
|
import { |
||||
|
addDays, addMonths, addYears, |
||||
|
endOfDay, endOfMonth, endOfWeek, endOfYear, |
||||
|
startOfDay, startOfMonth, startOfWeek, startOfYear |
||||
|
} from "./time"; |
||||
|
|
||||
|
export interface DateRange { |
||||
|
name: string |
||||
|
calculate(date: Date): [Date, Date] |
||||
|
} |
||||
|
|
||||
|
function dateRangeCallback(name: string, calculate: (date: Date) => [Date, Date]): DateRange { |
||||
|
return {name, calculate}; |
||||
|
} |
||||
|
|
||||
|
export class RelativeDateRange { |
||||
|
private duration: number |
||||
|
private unit: "day" | "month" | "year" |
||||
|
public name: string |
||||
|
|
||||
|
constructor(duration: number, unit: "day" | "month" | "year") { |
||||
|
this.duration = duration; |
||||
|
this.unit = unit; |
||||
|
|
||||
|
if (this.duration < 0) { |
||||
|
this.name = `Last ${-this.duration} ${pluralize(this.unit, -this.duration)}`; |
||||
|
} else { |
||||
|
this.name = `Next ${this.duration} ${pluralize(this.unit, this.duration)}`; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
calculate(date: Date): [Date, Date] { |
||||
|
switch (this.unit) { |
||||
|
case "day": { |
||||
|
return this.duration < 0 |
||||
|
? [ startOfDay(addDays(date, this.duration)), endOfDay(date) ] |
||||
|
: [ startOfDay(date), endOfDay(addDays(date, this.duration)) ]; |
||||
|
} |
||||
|
case "month": { |
||||
|
return this.duration < 0 |
||||
|
? [ startOfDay(addMonths(date, this.duration)), endOfDay(date) ] |
||||
|
: [ startOfDay(date), endOfDay(addMonths(date, this.duration)) ]; |
||||
|
} |
||||
|
case "year": { |
||||
|
return this.duration < 0 |
||||
|
? [ startOfDay(addYears(date, this.duration)), endOfDay(date) ] |
||||
|
: [ startOfDay(date), endOfDay(addYears(date, this.duration)) ]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
export function customDateRange(from: Date, to: Date): DateRange { |
||||
|
return {name: "Specific Dates", calculate: () => [from, to]} |
||||
|
} |
||||
|
|
||||
|
const thisWeek = dateRangeCallback("This week", date => [startOfWeek(date), endOfWeek(date)]); |
||||
|
const nextWeek = dateRangeCallback("Next week", date => [startOfWeek(addDays(date, 7)), endOfWeek(addDays(date, 7))]); |
||||
|
const lastWeek = dateRangeCallback("Last week", date => [startOfWeek(addDays(date, -7)), endOfWeek(addDays(date, -7))]); |
||||
|
|
||||
|
const thisMonth = dateRangeCallback("This month", date => [startOfMonth(date), endOfMonth(date)]); |
||||
|
const nextMonth = dateRangeCallback("Next month", date => [startOfMonth(addMonths(date, 1)), endOfMonth(addMonths(date, 1))]); |
||||
|
const lastMonth = dateRangeCallback("Last month", date => [startOfMonth(addMonths(date, -1)), endOfMonth(addMonths(date, -1))]); |
||||
|
|
||||
|
const thisYear = dateRangeCallback("This year", date => [startOfYear(date), endOfYear(date)]); |
||||
|
const nextYear = dateRangeCallback("Next year", date => [startOfYear(addYears(date, 1)), endOfYear(addYears(date, 1))]); |
||||
|
const lastYear = dateRangeCallback("Last year", date => [startOfYear(addYears(date, -1)), endOfYear(addYears(date, -1))]); |
||||
|
|
||||
|
export const allOffsets: DateRange[] = [ |
||||
|
thisWeek, |
||||
|
nextWeek, |
||||
|
new RelativeDateRange(7, "day"), |
||||
|
lastWeek, |
||||
|
new RelativeDateRange(-7, "day"), |
||||
|
thisMonth, |
||||
|
nextMonth, |
||||
|
new RelativeDateRange(30, "day"), |
||||
|
new RelativeDateRange(90, "day"), |
||||
|
lastMonth, |
||||
|
new RelativeDateRange(-30, "day"), |
||||
|
new RelativeDateRange(-90, "day"), |
||||
|
thisYear, |
||||
|
nextYear, |
||||
|
new RelativeDateRange(1, "year"), |
||||
|
lastYear, |
||||
|
new RelativeDateRange(-1, "year"), |
||||
|
]; |
||||
|
|
||||
|
export function rangeFromDates(from: Date, to: Date, options: DateRange[]): DateRange { |
||||
|
for (const option of options) { |
||||
|
const [from2, to2] = option.calculate(new Date()); |
||||
|
if (from2.getTime() == from.getTime() && to2.getTime() === to.getTime()) { |
||||
|
return option; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return customDateRange(from, to); |
||||
|
} |
||||
|
|
||||
|
export const pastOffsets: DateRange[] = allOffsets.filter(r => !r.name.startsWith("Next")); |
Write
Preview
Loading…
Cancel
Save
Reference in new issue