forked from rubyforgood/human-essentials
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeadline_day_controller.js
More file actions
111 lines (101 loc) · 4.07 KB
/
deadline_day_controller.js
File metadata and controls
111 lines (101 loc) · 4.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import { Controller } from "@hotwired/stimulus"
import $ from 'jquery';
import { RRule } from 'rrule'
import 'tslib'
const WEEKDAY_NUM_TO_OBJ = {
0: RRule.SU,
1: RRule.MO,
2: RRule.TU,
3: RRule.WE,
4: RRule.TH,
5: RRule.FR,
6: RRule.SA
}
export default class extends Controller {
static targets = [
'byDayOfMonth', 'byDayOfWeek', 'dayOfMonthFields', 'dayOfMonth',
'dayOfWeekFields', 'everyNthDay', 'dayOfWeek', 'deadlineDay', 'reminderText', 'deadlineText'
]
static dateParser = /(\d{4})-(\d{2})-(\d{2})/;
getFirstOccurrenceAfterToday( occurrences, today ) {
let index = occurrences.length - 1
let firstOccurrence = null
while (index >= 0){
if (occurrences[index].getTime() > today.getTime()) {
firstOccurrence = occurrences[index]
index--
} else {
break
}
}
return firstOccurrence
}
sourceChange() {
let reminder_date = null;
let deadline_date = null;
// TODO: Add comment explaining assumptions about monthylInterval and today?
let monthlyInterval = 1;
let today = new Date();
let untilDate = new Date( today );
untilDate.setMonth( untilDate.getMonth() + monthlyInterval + 1 )
if (this.byDayOfMonthTarget.checked && this.dayOfMonthTarget.value) {
const rule = new RRule({
dtstart: today,
freq: RRule.MONTHLY,
interval: monthlyInterval,
bymonthday: parseInt(this.dayOfMonthTarget.value),
until: untilDate
})
reminder_date = this.getFirstOccurrenceAfterToday( rule.all(), today )
}
if (this.byDayOfWeekTarget.checked && this.everyNthDayTarget.value && (this.dayOfWeekTarget.value)) {
const rule = new RRule({
dtstart: today,
freq: RRule.MONTHLY,
interval: monthlyInterval,
byweekday: WEEKDAY_NUM_TO_OBJ[ parseInt(this.dayOfWeekTarget.value) ].nth( parseInt(this.everyNthDayTarget.value) ),
wkst: RRule.SU,
until: untilDate
})
reminder_date = this.getFirstOccurrenceAfterToday( rule.all(), today )
}
if (reminder_date && this.deadlineDayTarget.value) {
deadline_date = new Date(reminder_date.getTime());
deadline_date.setDate(parseInt(this.deadlineDayTarget.value))
if( reminder_date.getDate() >= parseInt(this.deadlineDayTarget.value)){
deadline_date.setMonth( deadline_date.getMonth() + 1 )
}
}
if (this.byDayOfMonthTarget.checked && this.dayOfMonthTarget.value
&& this.deadlineDayTarget.value && this.dayOfMonthTarget.value === this.deadlineDayTarget.value) {
$(this.reminderTextTarget).removeClass('text-muted').addClass('text-danger');
$(this.reminderTextTarget).text('Reminder day cannot be the same as deadline day.');
$(this.deadlineTextTarget).text("");
} else {
let dayOfMonth = parseInt(this.dayOfMonthTarget.value);
let deadlineDay = parseInt(this.deadlineDayTarget.value);
if (dayOfMonth < 1 || dayOfMonth > 28){
$(this.reminderTextTarget).removeClass('text-muted').addClass('text-danger');
$(this.reminderTextTarget).text("Reminder day must be between 1 and 28");
} else {
$(this.reminderTextTarget).removeClass('text-danger').addClass('text-muted');
$(this.reminderTextTarget).text(reminder_date ? `Your next reminder date is ${reminder_date.toDateString()}.` : "");
}
if (deadlineDay < 1 || deadlineDay > 28){
$(this.deadlineTextTarget).removeClass('text-muted').addClass('text-danger');
$(this.deadlineTextTarget).text("Deadline day must be between 1 and 28");
} else {
$(this.deadlineTextTarget).removeClass('text-danger').addClass('text-muted');
$(this.deadlineTextTarget).text(deadline_date ? `The deadline on your next reminder email will be ${deadline_date.toDateString()}.` : "");
}
}
}
monthOrWeekChanged() {
$(this.dayOfMonthFieldsTarget).toggleClass("d-none", !this.byDayOfMonthTarget.checked );
$(this.dayOfWeekFieldsTarget).toggleClass("d-none", !this.byDayOfWeekTarget.checked );
}
connect() {
this.monthOrWeekChanged()
this.sourceChange()
}
}