aboutsummaryrefslogtreecommitdiff
path: root/static/month.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/month.js')
-rw-r--r--static/month.js85
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;