1 |
|
2 | import { Calendar } from './bunny.calendar';
|
3 |
|
4 | export var DatePicker = {
|
5 |
|
6 | _pickers: {},
|
7 | _options: {
|
8 | minYear: 1950,
|
9 | maxYear: 2050,
|
10 | popup: false,
|
11 | onlyAsNativeFallback: true
|
12 |
|
13 |
|
14 | },
|
15 |
|
16 | |
17 |
|
18 |
|
19 |
|
20 |
|
21 | create(input_id, options = {}) {
|
22 |
|
23 | for (var k in this._options) {
|
24 | if (options[k] === undefined)
|
25 | options[k] = this._options[k];
|
26 | }
|
27 |
|
28 | if (options.onlyAsNativeFallback && this.isNativeDatePickerSupported()) {
|
29 | return 2;
|
30 | }
|
31 |
|
32 | var self = this;
|
33 | var input = document.getElementById(input_id);
|
34 | var input_name = input.name;
|
35 | input.id = '_' + input_id;
|
36 | input.name = '_' + input_name;
|
37 | var hidden_input = document.createElement('input');
|
38 | hidden_input.id = input_id;
|
39 | hidden_input.name = input_name;
|
40 | hidden_input.type = 'hidden';
|
41 | input.parentNode.insertBefore(hidden_input, input.nextSibling);
|
42 |
|
43 | var calendar_id = input_id + '_calendar';
|
44 | if (input.value !== '') {
|
45 | hidden_input.value = self.getSqlDateFromEuropeanDate(input.value);
|
46 | var date_parts = this.getDatePartsFromISODate(hidden_input.value);
|
47 | Calendar.create(calendar_id, options.minYear, options.maxYear, date_parts.year, date_parts.monthIndex, date_parts.day);
|
48 | } else {
|
49 | Calendar.create(calendar_id, options.minYear, options.maxYear);
|
50 | }
|
51 |
|
52 | Calendar.hide(calendar_id, options.popup);
|
53 |
|
54 | Calendar.onPick(calendar_id, (year, month, day) => {
|
55 | hidden_input.value = self.getSqlDateFromDateParts(year, month-1, day);
|
56 | input.value = self.getEuropeanDateFromDateParts(year, month-1, day);
|
57 | Calendar.hide(calendar_id, options.popup);
|
58 | });
|
59 |
|
60 | input.addEventListener('focus', () => {
|
61 | Calendar.show(calendar_id, options.popup);
|
62 | });
|
63 |
|
64 | input.addEventListener('click', function(e) {
|
65 | e.stopPropagation();
|
66 | });
|
67 |
|
68 | input.parentNode.insertBefore(Calendar.getCalendar(calendar_id), input.nextSibling);
|
69 |
|
70 | this._pickers[input_id] = {
|
71 | input: input,
|
72 | options: options
|
73 | };
|
74 |
|
75 | return 1;
|
76 | },
|
77 |
|
78 | twoDigits(num) {
|
79 | if (num < 10) {
|
80 | return '0' + num;
|
81 | }
|
82 | return num;
|
83 | },
|
84 |
|
85 | getDatePartsFromISODate(iso_date_str) {
|
86 | var date = new Date(iso_date_str);
|
87 | return {
|
88 | year: date.getUTCFullYear(),
|
89 | monthIndex: date.getUTCMonth(),
|
90 | month: date.getUTCMonth() + 1,
|
91 | monthStr: this.twoDigits(date.getUTCMonth() + 1),
|
92 | day: date.getUTCDate(),
|
93 | dayStr: this.twoDigits(date.getUTCDate())
|
94 | }
|
95 | },
|
96 |
|
97 | getISODateFromDateParts(year, month_index, day) {
|
98 | var month = parseInt(month_index) + 1;
|
99 | var _month = this.twoDigits(month);
|
100 | var _day = this.twoDigits(day);
|
101 | return year + '-' + _month + '-' + _day;
|
102 | },
|
103 |
|
104 | getSqlDateFromISODate(iso_date_str) {
|
105 | return iso_date_str;
|
106 | },
|
107 |
|
108 | getSqlDateFromDateParts(year, month_index, day) {
|
109 | return this.getISODateFromDateParts(year, month_index, day);
|
110 | },
|
111 |
|
112 | getSqlDateFromEuropeanDate(eu_date) {
|
113 | if (/\d{2}(\.)\d{2}(\.)\d{4}/.test(eu_date)) {
|
114 | const parts = eu_date.split('.');
|
115 | return parts[2] + '-' + parts[1] + '-' + parts[0];
|
116 | } else {
|
117 | return '';
|
118 | }
|
119 | },
|
120 |
|
121 | getEuropeanDateFromSqlDate(sql_date) {
|
122 | if (/\d{4}(\-)\d{2}(\-)\d{2}/.test(sql_date)) {
|
123 | const parts = sql_date.split('-');
|
124 | return parts[2] + '.' + parts[1] + '.' + parts[0];
|
125 | } else {
|
126 | return '';
|
127 | }
|
128 | },
|
129 |
|
130 | getEuropeanDateFromISODate(iso_date_str) {
|
131 | var parts = this.getDatePartsFromISODate(iso_date_str);
|
132 | return parts.dayStr + '.' + parts.monthStr + '.' + parts.year;
|
133 | },
|
134 |
|
135 | getEuropeanDateFromDateParts(year, month_index, day) {
|
136 | var month = parseInt(month_index) + 1;
|
137 | var _month = this.twoDigits(month);
|
138 | var _day = this.twoDigits(day);
|
139 | return _day + '.' + _month + '.' + year;
|
140 | },
|
141 |
|
142 | isNativeDatePickerSupported() {
|
143 | var input = document.createElement('input');
|
144 | input.setAttribute('type','date');
|
145 | var notADateValue = 'not-a-date';
|
146 | input.setAttribute('value', notADateValue);
|
147 | return (input.value !== notADateValue);
|
148 | }
|
149 | };
|