UNPKG

4.58 kBJavaScriptView Raw
1
2import { Calendar } from './bunny.calendar';
3
4export var DatePicker = {
5
6 _pickers: {},
7 _options: {
8 minYear: 1950,
9 maxYear: 2050,
10 popup: false,
11 onlyAsNativeFallback: true
12 //displayFormat: 'd.m.Y',
13 //storeFormat: 'Y-m-d'
14 },
15
16 /**
17 *
18 * @param {string} input_id
19 * @param {object} options
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};