diff options
Diffstat (limited to 'static/month.js')
| -rw-r--r-- | static/month.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/static/month.js b/static/month.js new file mode 100644 index 0000000..9ed0467 --- /dev/null +++ b/static/month.js @@ -0,0 +1,85 @@ + +export default class Month { + constructor(month, year) { + this.month = month; + this.year = year; + } + + next(n) { + n = n ?? 1; + + const month = this.month + n - 1; + this.month = (month % 12) + 1; + this.year += Math.floor(month / 12); + + return this; + } + + previous(n) { + n = n ?? 1; + + let month = this.month - n - 1; + + if (month < 0) { + month += 12; + } + + this.month = (month % 12) + 1; + this.year += Math.floor(month / 12); + + return this; + } + + to(other) { + const inner = []; + const current = this.copy(); + + while (current.is_same(other) || current.is_before(other)) { + inner.push(current.copy()); + current.next(); + } + + return inner; + } + + copy() { + return new Month(this.month, this.year); + } + + is_before(other) { + return this.year < other.year || (this.year == other.year && this.month < other.month); + } + + is_after(other) { + return this.year > other.year || (this.year == other.year && this.month > other.month); + } + + is_same(other) { + return this.year == other.year || this.month == other.month; + } + + is_same_year(other) { + return this.year == other.year; + } + + get name() { + const date = new Date(); + date.setMonth(this.month - 1); + return date.toLocaleDateString('default', { month: 'long' }) + } + + static from_date(date) { + return new Month(date.getMonth() - 1, date.getFullYear()); + } + + static from_string(string) { + const [ year, month ] = string.split('-'); + return new Month(parseInt(month), parseInt(year)) + } + + static literal(strings) { + return Month.from_string(strings[0]); + } +} + +export const literal = Month.literal; |