Skip to content

Commit ce91244

Browse files
Julian Dehmm4ra
authored andcommitted
assets/js: make new flatpickr language aware and fix some small issues
- selecting a start date in a later month than the end date wouldn't move the end date picker to the new month - remove the possibility to select a start date past the current end date
1 parent 1dadf14 commit ce91244

File tree

1 file changed

+61
-46
lines changed

1 file changed

+61
-46
lines changed

adhocracy-plus/assets/js/init-picker.js

Lines changed: 61 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,34 @@
11
import django from 'django'
22
import flatpickr from 'flatpickr'
3+
import { German } from 'flatpickr/dist/l10n/de.js'
4+
import { Russian } from 'flatpickr/dist/l10n/ru.js'
5+
import { Dutch } from 'flatpickr/dist/l10n/nl.js'
6+
import English from 'flatpickr/dist/l10n/default.js'
37

4-
function link (f0, f1) {
5-
const date = f0.selectedDates[0]
6-
if (date) {
7-
// if p0 has a date set that date as minDate for p1
8-
f1.set('minDate', f0.formatDate(date, f0.config.dateFormat))
8+
// Helper to link start and end date pickers
9+
function linkPair (startPicker, endPicker) {
10+
const selectedDate = startPicker.selectedDates[0]
11+
if (selectedDate) {
12+
endPicker.set(
13+
'minDate',
14+
startPicker.formatDate(selectedDate, startPicker.config.dateFormat)
15+
)
916
}
10-
f0.config.onChange.push((selectedDates, dateStr) => {
11-
// if date of p0 is changed adapt minDate for p1
12-
f1.set('minDate', dateStr)
17+
startPicker.config.onChange.push((selectedDates, dateStr) => {
18+
if (selectedDates[0] > endPicker.selectedDates[0]) endPicker.clear()
19+
endPicker.set('minDate', dateStr)
20+
})
21+
22+
endPicker.config.onChange.push((selectedDates, dateStr) => {
23+
if (selectedDates[0] < startPicker.selectedDates[0]) startPicker.clear()
24+
startPicker.set('maxDate', dateStr)
1325
})
1426
}
1527

16-
function linkDatePickers (flatpickrs) {
17-
// normal flatpickers
18-
const idStart = 'id_start_date_date'
19-
const idEnd = 'id_end_date_date'
20-
// (multi-)phase flatpickrs
21-
const phaseIds = [
28+
// Initializes linked date pickers for start and end date fields
29+
function linkDatePickers (flatpickrsMap) {
30+
const singlePhaseIds = ['id_start_date_date', 'id_end_date_date']
31+
const multiPhaseIds = [
2232
'id_phase_set-0-start_date_date',
2333
'id_phase_set-0-end_date_date',
2434
'id_phase_set-1-start_date_date',
@@ -27,50 +37,55 @@ function linkDatePickers (flatpickrs) {
2737
'id_phase_set-2-end_date_date'
2838
]
2939

30-
// link non-phase datepickers if exist
31-
const fStart = flatpickrs.get(idStart)
32-
const fEnd = flatpickrs.get(idEnd)
33-
if (fStart && fEnd) {
34-
link(fStart, fEnd)
35-
}
40+
// Link single-phase pickers
41+
const startPicker = flatpickrsMap.get(singlePhaseIds[0])
42+
const endPicker = flatpickrsMap.get(singlePhaseIds[1])
43+
if (startPicker && endPicker) linkPair(startPicker, endPicker)
3644

37-
// link phase datepickers if exist
38-
for (let i = 0; i < phaseIds.length - 1; i++) {
39-
if (flatpickrs.length <= i) {
40-
return
41-
}
42-
const p0 = flatpickrs.get(phaseIds[i])
43-
const p1 = flatpickrs.get(phaseIds[i + 1])
44-
if (p0 && p1) {
45-
link(p0, p1)
46-
}
45+
// Link multi-phase pickers in pairs
46+
for (let i = 0; i < multiPhaseIds.length - 1; i += 2) {
47+
const phaseStartPicker = flatpickrsMap.get(multiPhaseIds[i])
48+
const phaseEndPicker = flatpickrsMap.get(multiPhaseIds[i + 1])
49+
if (phaseStartPicker && phaseEndPicker) { linkPair(phaseStartPicker, phaseEndPicker) }
4750
}
4851
}
4952

53+
// Returns the appropriate language object based on the document language
54+
function getLanguage () {
55+
const languages = { de: German, nl: Dutch, ru: Russian }
56+
return languages[document.documentElement.lang] || English
57+
}
58+
59+
// Initializes all date and time pickers on the page
5060
function initDatePicker () {
51-
const datepickers = document.querySelectorAll('.datepicker')
52-
const format = django.get_format('DATE_INPUT_FORMATS')[0].replaceAll('%', '')
53-
const flatpickrs = new Map()
54-
datepickers.forEach((e) => {
55-
e.classList.add('form-control')
56-
const f = flatpickr(e, { dateFormat: format })
57-
flatpickrs.set(e.id, f)
58-
})
61+
const lang = getLanguage()
62+
const dateFormat = django
63+
.get_format('DATE_INPUT_FORMATS')[0]
64+
.replaceAll('%', '')
65+
const flatpickrsMap = new Map()
5966

60-
linkDatePickers(flatpickrs)
67+
// Initialize date pickers
68+
document.querySelectorAll('.datepicker').forEach((element) => {
69+
element.classList.add('form-control')
70+
const datePicker = flatpickr(element, { dateFormat, locale: lang })
71+
flatpickrsMap.set(element.id, datePicker)
72+
})
6173

62-
const timepickers = document.querySelectorAll('.timepicker')
74+
// Link date pickers if needed
75+
linkDatePickers(flatpickrsMap)
6376

64-
timepickers.forEach((e) => {
65-
const f = flatpickr(e, {
66-
defaultHour: e.id.endsWith('start_date_time') ? '00' : '23',
67-
defaultMinute: e.id.endsWith('start_date_time') ? '00' : '59',
77+
// Initialize time pickers
78+
document.querySelectorAll('.timepicker').forEach((element) => {
79+
const timePicker = flatpickr(element, {
80+
defaultHour: element.id.endsWith('start_date_time') ? '00' : '23',
81+
defaultMinute: element.id.endsWith('start_date_time') ? '00' : '59',
6882
dateFormat: 'H:i',
6983
enableTime: true,
7084
noCalendar: true,
71-
time_24hr: true
85+
time_24hr: true,
86+
locale: lang
7287
})
73-
flatpickrs.set(e.id, f)
88+
flatpickrsMap.set(element.id, timePicker)
7489
})
7590
}
7691

0 commit comments

Comments
 (0)