You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
2.8 KiB
141 lines
2.8 KiB
import { observable } from "mobx"; |
|
import { Moment } from "moment"; |
|
|
|
export class TimeOfDay { |
|
static fromMoment(m: Moment): TimeOfDay { |
|
return new TimeOfDay(m.hour(), m.minute(), m.second(), m.millisecond()); |
|
} |
|
|
|
static fromDate(date: Date): TimeOfDay { |
|
return new TimeOfDay( |
|
date.getHours(), |
|
date.getMinutes(), |
|
date.getSeconds(), |
|
date.getMilliseconds() |
|
); |
|
} |
|
|
|
static equals( |
|
a: TimeOfDay | null | undefined, |
|
b: TimeOfDay | null | undefined |
|
): boolean { |
|
return ( |
|
a === b || |
|
(a != null && |
|
b != null && |
|
a.hour === b.hour && |
|
a.minute === b.minute && |
|
a.second === b.second && |
|
a.millisecond === b.millisecond) |
|
); |
|
} |
|
|
|
readonly hour: number; |
|
readonly minute: number; |
|
readonly second: number; |
|
readonly millisecond: number; |
|
|
|
constructor( |
|
hour: number = 0, |
|
minute: number = 0, |
|
second: number = 0, |
|
millisecond: number = 0 |
|
) { |
|
this.hour = hour; |
|
this.minute = minute; |
|
this.second = second; |
|
this.millisecond = millisecond; |
|
} |
|
} |
|
|
|
export enum Weekday { |
|
Sunday, |
|
Monday, |
|
Tuesday, |
|
Wednesday, |
|
Thursday, |
|
Friday, |
|
Saturday |
|
} |
|
|
|
export const WEEKDAYS: Weekday[] = Object.keys(Weekday) |
|
.map(weekday => Number(weekday)) |
|
.filter(weekday => !isNaN(weekday)); |
|
|
|
export enum Month { |
|
January = 1, |
|
February = 2, |
|
March = 3, |
|
April = 4, |
|
May = 5, |
|
June = 6, |
|
July = 7, |
|
August = 8, |
|
September = 9, |
|
October = 10, |
|
November = 11, |
|
December = 12 |
|
} |
|
|
|
export class DateOfYear { |
|
static readonly DEFAULT = new DateOfYear({ |
|
day: 1, |
|
month: Month.January, |
|
year: 0 |
|
}); |
|
|
|
static equals( |
|
a: DateOfYear | null | undefined, |
|
b: DateOfYear | null | undefined |
|
): boolean { |
|
return ( |
|
a === b || |
|
(a instanceof DateOfYear && |
|
b instanceof DateOfYear && |
|
a.day === b.day && |
|
a.month === b.month && |
|
a.year === b.year) |
|
); |
|
} |
|
|
|
static fromMoment(m: Moment): DateOfYear { |
|
return new DateOfYear({ day: m.date(), month: m.month(), year: m.year() }); |
|
} |
|
|
|
readonly day!: number; |
|
readonly month!: Month; |
|
readonly year!: number; |
|
|
|
constructor(data?: Partial<DateOfYear>) { |
|
Object.assign(this, DateOfYear.DEFAULT, data); |
|
} |
|
|
|
with(data: Partial<DateOfYear>): DateOfYear { |
|
return new DateOfYear(Object.assign({}, this, data)); |
|
} |
|
|
|
toString() { |
|
return `${Month[this.month]} ${this.day}, ${this.year}`; |
|
} |
|
} |
|
|
|
export class Schedule { |
|
@observable |
|
times: TimeOfDay[] = []; |
|
@observable |
|
weekdays: Weekday[] = []; |
|
@observable |
|
from: DateOfYear | null = null; |
|
@observable |
|
to: DateOfYear | null = null; |
|
|
|
constructor(data?: Partial<Schedule>) { |
|
if (typeof data === "object") { |
|
Object.assign(this, data); |
|
} |
|
} |
|
|
|
clone(): Schedule { |
|
return new Schedule(this); |
|
} |
|
}
|
|
|