1(function($) { 2 3 var SpecialDays = function($container, options) { 4 var obj = this, 5 special_days_popup_content; 6 jQuery.extend(obj.options, options); 7 if (options.reload) { 8 $container.html('<div class="bookly-loading"></div>'); 9 $.ajax({ 10 type: 'POST', 11 url: ajaxurl, 12 data: { 13 action: 'bookly_special_days_staff_special_days', 14 staff_id: obj.options.staff_id, 15 csrf_token: BooklyL10nGlobal.csrf_token, 16 location_id: obj.options.location_id 17 }, 18 dataType: 'json', 19 xhrFields: {withCredentials: true}, 20 crossDomain: 'withCredentials' in new XMLHttpRequest(), 21 success: function(response) { 22 var $html = $.parseHTML(response.data.html); 23 // fill in the container 24 $container.html($html); 25 initContentListeners($html); 26 init($container, obj); 27 obj.options.onLoad(); 28 } 29 }); 30 } else { 31 initContentListeners($container); 32 init($container, obj); 33 } 34 35 function init($container, obj) { 36 let $addButton = $('#bookly-js-special-days-add-day', $container); 37 38 $addButton.daterangepicker({ 39 parentEl: obj.options.container, 40 singleDatePicker: false, 41 showDropdowns: true, 42 autoUpdateInput: false, 43 locale: obj.options.l10n.datePicker 44 }, function() {}).on('apply.daterangepicker', function(ev, picker) { 45 var ladda = rangeTools.ladda($addButton[0]); 46 ladda.start(); 47 $.ajax({ 48 method: 'POST', 49 url: ajaxurl, 50 data: { 51 action: 'bookly_special_days_add_day', 52 csrf_token: BooklyL10nGlobal.csrf_token, 53 staff_id: obj.options.staff_id, 54 start_date: picker.startDate.format('YYYY-MM-DD'), 55 end_date: picker.endDate.format('YYYY-MM-DD'), 56 start_time: obj.options.l10n.start_time, 57 end_time: obj.options.l10n.end_time, 58 location_id: obj.options.location_id 59 }, 60 dataType: 'json', 61 xhrFields: {withCredentials: true}, 62 crossDomain: 'withCredentials' in new XMLHttpRequest(), 63 success: function(response) { 64 if (response.success) { 65 var $html = $.parseHTML(response.data.html); 66 $('input[name="staff_id"]', $container).before($html); 67 initContentListeners($container); 68 findDuplicates(); 69 } else { 70 if (response.data && response.data.message) { 71 obj.options.saving({error: [response.data.message]}); 72 } 73 } 74 } 75 }).always(function() { 76 ladda.stop(); 77 }); 78 }); 79 80 special_days_popup_content = $container.find('.bookly-js-edit-break-body > div').html(); 81 82 // Set listeners for special days container. 83 $container.off().on('click', '#bookly-js-special-days-reset', function(e) { 84 $(this).closest('form').trigger('reset'); 85 $('.bookly-js-range-row .bookly-js-date', $container).each(function() { 86 let $input = $(this), 87 date_default = moment($input.data('date-default')), 88 dp = $input.data('daterangepicker'); 89 $input.val(date_default.format(obj.options.l10n.datePicker.format)); 90 $input.data('date', $input.data('date-default')); 91 dp.setStartDate(date_default); 92 dp.setEndDate(date_default); 93 }); 94 findDuplicates(); 95 e.preventDefault(); 96 }).on('change', '.bookly-js-date', function() { 97 let $input = $(this), 98 dp = $input.data('daterangepicker'); 99 $input.data('date', moment(dp.startDate).format('YYYY-MM-DD')); 100 findDuplicates(); 101 }).on('click', '#bookly-js-special-days-save-days', function(e) { 102 e.preventDefault(); 103 // Listener for saving new special days in modal window. 104 var $form = $(this).closest('form'), 105 ladda = rangeTools.ladda(this), 106 data = booklySerialize.form($form); 107 for (const id in data.list) { 108 data.list[id].date = $('[name="list[' + id + '][date]"]', $form).data('date'); 109 } 110 $.ajax({ 111 method: 'POST', 112 url: ajaxurl, 113 data: booklySerialize.buildRequestData('bookly_special_days_save_days', data), 114 dataType: 'json', 115 xhrFields: {withCredentials: true}, 116 crossDomain: 'withCredentials' in new XMLHttpRequest(), 117 success: function(response) { 118 if (response.success) { 119 obj.options.saving({success: [obj.options.l10n.saved]}); 120 $container.find('.form-row.bg-danger').removeClass('bg-danger'); 121 } else { 122 if (response.data) { 123 if (response.data.message) { 124 response.data.ids.forEach(function(ssd_row_id) { 125 $('.bookly-js-range-row.ssd_id-' + ssd_row_id, $container).find('.form-row').addClass('bg-danger'); 126 }); 127 128 obj.options.validation(response.data.ids, response.data.message); 129 } 130 } 131 } 132 } 133 }).always(function() { 134 ladda.stop(); 135 }); 136 }).on('click', '.popover-body .bookly-js-save-break', function(e) { 137 e.preventDefault(); 138 // Listener for saving break. 139 var $button = $(this), 140 $sd_break_form = $(this).closest('.popover-body'), 141 ssd_break_id = $button.data('ssd_break_id'), 142 ladda = rangeTools.ladda(this); 143 e.preventDefault(); 144 $.ajax({ 145 method: 'POST', 146 url: ajaxurl, 147 data: { 148 action: 'bookly_special_days_save_break', 149 csrf_token: BooklyL10nGlobal.csrf_token, 150 staff_special_day_id: $button.data('ssd_id'), 151 staff_special_days_breaks_id: ssd_break_id, 152 start_time: $sd_break_form.find('.bookly-js-popover-range-start').val(), 153 end_time: $sd_break_form.find('.bookly-js-popover-range-end').val() 154 }, 155 dataType: 'json', 156 xhrFields: {withCredentials: true}, 157 crossDomain: 'withCredentials' in new XMLHttpRequest(), 158 success: function(response) { 159 if (response.success) { 160 if (ssd_break_id) {
161 // Change text on button with new range value. 162 var $interval_button = $('button.bookly-js-special-days-toggle-popover.bookly-js-break-interval[data-ssd_break_id="' + ssd_break_id + '"]'); 163 $interval_button.html(response.data.interval); 164 } else { 165 var $html = $.parseHTML(response.data.html); 166 initContentListeners($html); 167 $('.bookly-js-range-row.ssd_id-' + $button.data('ssd_id')).find('.breaks-list-content').append($html); 168 } 169 $button.parents('.bookly-popover').booklyPopover('hide'); 170 } else { 171 if (response.data && response.data.message) { 172 obj.options.booklyAlert({error: [response.data.message]}); 173 } 174 } 175 } 176 }).always(function() { 177 ladda.stop() 178 }); 179 }).on('change', '.bookly-js-popover-range-start', function() { 180 rangeTools.hideInaccessibleBreaks($(this), $(this).parents('.bookly-popover').find('.bookly-js-popover-range-end'), $('[aria-describedby="' + $(this).closest('.bookly-popover').attr('id') + '"]').closest('.bookly-js-range-row')); 181 }).on('click', '#bookly-js-special-days-delete-all', function(e) { 182 e.preventDefault(); 183 if (confirm(obj.options.l10n.are_you_sure)) { 184 var ids = []; 185 var ssd_rows = []; 186 $(':checkbox[data-ssd_id]:checked').each(function(index, elem) { 187 ids.push($(elem).data('ssd_id')); 188 ssd_rows.push($(elem).closest('.bookly-js-range-row')); 189 }); 190 if (ids.length > 0) { 191 var ladda = rangeTools.ladda(this); 192 $.ajax({ 193 method: 'POST', 194 url: ajaxurl, 195 data: { 196 action: 'bookly_special_days_delete_days', 197 ids: ids, 198 staff_id: obj.options.staff_id, 199 csrf_token: BooklyL10nGlobal.csrf_token 200 }, 201 dataType: 'json', 202 xhrFields: {withCredentials: true}, 203 crossDomain: 'withCredentials' in new XMLHttpRequest(), 204 success: function(response) { 205 if (response.success) { 206 ssd_rows.forEach(function(elem) { 207 $(elem).remove(); 208 }); 209 } else { 210 if (response.data && response.data.message) { 211 obj.options.saving({error: [response.data.message]}); 212 } 213 } 214 findDuplicates(); 215 } 216 }).always(function() { 217 ladda.stop() 218 }); 219 } 220 } 221 }).on('click', '.delete-break[data-ssd_break_id]', function(e) { 222 // Delete break. 223 e.preventDefault(); 224 if (confirm(obj.options.l10n.are_you_sure)) { 225 var $button = $(this), 226 ladda = rangeTools.ladda(this); 227 $.ajax({ 228 method: 'POST', 229 url: ajaxurl, 230 data: { 231 action: 'bookly_special_days_delete_break', 232 id: $button.data('ssd_break_id'), 233 staff_id: obj.options.staff_id, 234 csrf_token: BooklyL10nGlobal.csrf_token 235 }, 236 dataType: 'json', 237 xhrFields: {withCredentials: true}, 238 crossDomain: 'withCredentials' in new XMLHttpRequest(), 239 success: function(response) { 240 if (response.success) { 241 $button.closest('.bookly-js-breaks-wrapper').remove(); 242 } else { 243 if (response.data && response.data.message) { 244 obj.options.saving({error: [response.data.message]}); 245 } 246 } 247 } 248 }).always(function() { 249 ladda.stop(); 250 }); 251 } 252 }) 253 // Change location 254 .on('change', '#staff_location_id', function() { 255 let options = { 256 reload: true, 257 staff_id: obj.options.staff_id, 258 l10n: obj.options.l10n, 259 location_id: this.value 260 }; 261 262 new BooklyStaffSpecialDays($container, options); 263 }) 264 // Change default/custom settings for location 265 .on('change', '#custom_location_settings', function() { 266 if (this.value === '1') { 267 $('#bookly-staff-special-days', $container).show(); 268 } else { 269 $('#bookly-staff-special-days', $container).hide(); 270 } 271 }); // end listeners for special days container. 272 $('#custom_location_settings', $container).trigger('change'); 273 findDuplicates(); 274 } 275 276 function initContentListeners($content) { 277 $('.bookly-js-date', $content).daterangepicker({ 278 parentEl: obj.options.container, 279 singleDatePicker: true, 280 showDropdowns: true, 281 autoUpdateInput: false, 282 locale: obj.options.l10n.datePicker 283 }, function() {}).on('apply.daterangepicker', function(ev, picker) { 284 $(this).val(picker.startDate.format(obj.options.l10n.datePicker.format)).trigger('change'); 285 }); 286 287 $('.bookly-js-parent-range-start', $content).each(function(index, elem) { 288 rangeTools.hideUp24Hours($(elem), $(elem).closest('.bookly-js-range-row').find('.bookly-js-parent-range-end')); 289 }); 290 291 $('.bookly-js-date[data-date!=""][data-date]', $container).each(function() { 292 let date = $(this).data('date'), 293 startDate = moment(date, 'YYYY-MM-DD'), 294 dp = $(this).data('daterangepicker'); 295 $(this).val(startDate.format(obj.options.l10n.datePicker.format)); 296 $(this).data('date-default', date); 297 dp.setStartDate(startDate); 298 dp.setEndDate(startDate); 299 }); 300 301 // init 'add break' functionality for special days 302 $('.bookly-js-special-days-toggle-popover', $content).off().booklyPopover({ 303 html: true, 304 placement: 'bottom', 305 container: $content, 306 template: '<div class="bookly-popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>', 307 trigger: 'manual', 308 content: function() { 309 return $(special_days_popup_content); 310 } 311 }).on('click', function() { 312 var $button = $(this); 313 $button.booklyPopover('toggle'); 314 var $popover = $($button.data('bs.popover').tip).booklyPopover(), 315 $form = $popover.find('.popover-body'), 316 $break_start = $form.find('.bookly-js-popover-range-start'), 317 $break_end = $form.find('.bookly-js-popover-range-end'), 318 force_keep_values = false;
319 $('.bookly-popover').not($popover).booklyPopover('hide'); 320 if ($button.hasClass('bookly-js-break-interval')) { 321 var interval = $button.html().trim().split(/ [-â] /); 322 rangeTools.setVal($break_start, interval[0]); 323 rangeTools.setVal($break_end, interval[1]); 324 force_keep_values = true; 325 $form.find('.bookly-js-save-break').data('ssd_break_id', $button.data('ssd_break_id')).data('ssd_id', $button.data('ssd_id')); 326 } else { 327 var $ssd_row = $button.closest('.form-row'); 328 $break_start.val($ssd_row.find('.bookly-js-parent-range-start').val()); 329 $break_end.val($ssd_row.find('.bookly-js-parent-range-end').val()); 330 $form.find('.bookly-js-save-break').data('ssd_id', $button.data('ssd_id')).removeAttr('ssd_break_id'); 331 rangeTools.setPopoverRangeDefault($break_start, $break_end, $button.closest('.bookly-js-range-row')); 332 } 333 334 rangeTools.hideInaccessibleBreaks($break_start, $break_end, $button.closest('.bookly-js-range-row'), force_keep_values); 335 $popover.find('.bookly-js-close').on('click', function() { 336 $popover.booklyPopover('hide'); 337 }); 338 }); 339 } 340 341 /** 342 * Function to find and mark duplicated dates 343 * The same function presented in service_special_days.js 344 */ 345 function findDuplicates() { 346 let all_dates = [], 347 found_duplicates = false, 348 today = moment().startOf('day'); 349 350 $('.bookly-js-range-row .bookly-js-date', $container).each(function() { 351 all_dates.push($(this).data('date')); 352 }); 353 354 $('.bookly-js-range-row', $container).each(function() { 355 let $row = $(this), 356 current_date = $('.bookly-js-date', $row).data('date'), 357 $error = $('.bookly-js-staff-special-days-error', $row); 358 359 $('.text-success', $error).remove(); 360 $('.form-row', $row).removeClass('bg-danger'); 361 362 if (today.isAfter(moment(current_date, 'YYYY-MM-DD'))) { 363 $error.append('<div class="text-success">' + obj.options.l10n.past_date_error + '</div>') 364 } 365 var duplicated_dates = all_dates.filter(function(item) { 366 return item === current_date; 367 }); 368 369 if (duplicated_dates.length > 1 && current_date) { 370 $('.form-row', $row).addClass('bg-danger'); 371 found_duplicates = true; 372 } 373 }); 374 375 if (found_duplicates) { 376 $('.bookly-special-days-error').html(obj.options.l10n.duplicate_error); 377 $('#bookly-js-special-days-save-days').prop('disabled', true); 378 } else { 379 $('.bookly-special-days-error').html(''); 380 $('#bookly-js-special-days-save-days').prop('disabled', false); 381 } 382 383 obj.options.validation(found_duplicates, obj.options.l10n.duplicate_error); 384 } 385 }; 386 387 SpecialDays.prototype.options = { 388 reload: false, 389 staff_id: -1, 390 location_id: null, 391 container: '#bookly-staff-edit-modal', 392 saving: function(alerts) { 393 $(document.body).trigger('staff.saving', [alerts]); 394 }, 395 booklyAlert: function(alerts) { 396 booklyAlert(alerts); 397 }, 398 l10n: {}, 399 onLoad: function() {}, 400 validation: function(has_error, info) { 401 $(document.body).trigger('staff.validation', ['staff-special-days', has_error, info]); 402 }, 403 }; 404 405 window.BooklyStaffSpecialDays = SpecialDays; 406})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.