7 var debug = "[% debug | html %]";
8 var dateformat_pref = "[% Koha.Preference('dateformat') | html %]";
9 var flatpickr_dateformat_string = "";
10 switch ( dateformat_pref ){
12 flatpickr_dateformat_string = "m/d/Y";
15 flatpickr_dateformat_string = "d/m/Y";
18 flatpickr_dateformat_string = "d.m.Y";
21 flatpickr_dateformat_string = "Y-m-d";
24 var bidi = [% IF(bidi) %] true[% ELSE %] false[% END %];
25 var calendarFirstDayOfWeek = '[% Koha.Preference('CalendarFirstDayOfWeek') | html %]';
26 var flatpickr_timeformat_string = [% IF Koha.Preference('TimeFormat') == '12hr' %]"G:i K"[% ELSE %]"H:i"[% END %];
27 var flatpickr_timeformat = [% IF Koha.Preference('TimeFormat') == '12hr' %]false[% ELSE %]true[% END %];
29 <!-- / calendar.inc -->
30 [% Asset.js("js/calendar.js") | $raw %]
31 [% Asset.js("lib/flatpickr/flatpickr.min.js") | $raw %]
32 [% Asset.js("lib/flatpickr/shortcut-buttons-flatpickr.min.js") | $raw %]
34 flatpickr.l10ns.default.weekdays = flatpickr_weekdays;
35 flatpickr.l10ns.default.months = flatpickr_months;
36 let flatpickr_defaults = {
40 altFormat: flatpickr_dateformat_string,
41 altInputClass: 'flatpickr-input',
42 nextArrow: '<i class="fa fa-fw fa-arrow-right"></i>',
43 prevArrow: '<i class="fa fa-fw fa-arrow-left"></i>',
44 time_24hr: flatpickr_timeformat,
48 "firstDayOfWeek": calendarFirstDayOfWeek
50 onReady: function( selectedDates, dateStr, instance ){
51 /* When flatpickr instance is created, automatically append a "clear date" link */
52 $(instance.input).find('~input.flatpickr:first')
53 /* Add a wrapper element so that we can prevent the clear button from wrapping */
54 .wrap("<span class='flatpickr_wrapper'></span>")
55 .attr("autocomplete", "off")
58 .addClass("clear_date")
59 .on("click", function(e){
63 .addClass("fa fa-fw fa-times")
64 .attr("aria-hidden", true)
65 .attr("aria-label", _("Clear date") )
66 ).keydown(function(e) {
67 var key = (event.keyCode ? event.keyCode : event.which);
69 instance.set('allowInput',false);
73 onChange: function( selectedDates, dateText, instance) {
74 var thisInput = instance.input;
75 let = accepts_time = $(thisInput).data('flatpickr-enable-time');
77 let parsedDate = flatpickr.parseDate(dateText, instance.config.dateFormat);
78 if ( !parsedDate.getHours() ) {
79 instance.setDate(selectedDates[0].setHours(23, 59, 0, 0));
83 onClose: function( selectedDates, dateText, instance) {
84 validate_date( dateText, instance );
85 var thisInput = instance.input;
86 if ( thisInput.hasAttribute('data-date_to') ) {
87 var endPicker = document.querySelector("#"+thisInput.dataset.date_to)._flatpickr;
88 endPicker.set('minDate', selectedDates[0]);
91 let = on_close_focus = $(thisInput).data('flatpickr-on-close-focus');
92 if ( on_close_focus ) {
93 $(on_close_focus).focus();
97 ShortcutButtonsPlugin({
100 label: _("Yesterday")
110 onClick: (index, fp) => {
112 let hh = 23, mm = 59;
115 date = new Date().fp_incr(-1);
119 if ( $(fp.input).data("flatpickr-pastinclusive") === true ) {
120 hh = date.getHours();
121 mm = date.getMinutes();
125 date = new Date().fp_incr(1);
128 date.setHours(hh, mm, 0, 0);
135 flatpickr.setDefaults(flatpickr_defaults);
137 function apply_flatpickr(input){
139 let refresh_max_date = 0;
140 let disable_buttons = [];
142 if( $(input).data("flatpickr-futureinclusive") === true
143 || $(input).data("flatpickr-futuredate") === true ) {
144 let original_date = $(input).val();
145 if ( original_date ) {
146 original_date = Date_from_syspref( original_date ).getTime();
147 let tomorrow = new Date().fp_incr(1).getTime();
149 options['enable'] = [function(date){
150 date = date.getTime();
151 if ( date == original_date ) return true;
152 if ( date >= tomorrow) return true;
156 if( $(input).data("flatpickr-futureinclusive") === true ) {
157 options['minDate'] = new Date().setHours(00, 00, 00, 00);
159 options['minDate'] = new Date().fp_incr(1);
163 disable_buttons.push(0); /* Yesterday */
165 if ( $(input).data("flatpickr-futuredate") === true ) {
166 disable_buttons.push(1); /* Today */
169 if( $(input).data("flatpickr-pastinclusive") === true ) {
170 options['maxDate'] = new Date(); /* Not today or hh:mm will be 00:00 */
171 refresh_max_date = 1;
172 disable_buttons.push(2); /* Tomorrow */
174 if( $(input).data("flatpickr-pastdate") === true ) {
175 options['maxDate'] = new Date().fp_incr(-1).setHours(23, 59, 00, 00);
176 disable_buttons.push(1); /* Today */
177 disable_buttons.push(2); /* Tomorrow */
179 if ( $(input).data('flatpickr-enable-time') === true ) {
180 options['enableTime'] = true;
181 options['dateFormat'] = "Y-m-d H:i";
182 options['altFormat'] = flatpickr_dateformat_string + " " + flatpickr_timeformat_string;
184 if ( $(input).data('flatpickr-disable-shortcuts') === true ) {
185 options['plugins'] = [];
188 let fp = $(input).flatpickr(options);
190 $(disable_buttons).each(function(index, value){
191 $(fp.calendarContainer).find(".shortcut-buttons-flatpickr-button[data-index='"+value+"']").prop("disabled", "disabled");
194 if ( refresh_max_date ) {
195 /* Refresh the maxDate every 30 secondes to make sure the user will not
196 be stuck with the minute passed.
197 Adding 1 minute to not introduce a gap.
198 Example: last update at 40s, a new minute passed at 00.
199 Between 00 and 10s the user won't be able click 'Today'.
202 let now = new Date();
203 fp.set("maxDate", now.setMinutes(now.getMinutes() + 1));
208 $(document).ready(function(){
209 $(".flatpickr").each(function(){
210 apply_flatpickr(this);