11import django from 'django'
22import 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
5060function 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