PageSourceSearch

https://davidsonsgroup.co.uk/wp-content/plugins/bookly-addon-speci…/resources/js/special-days.js?ver=22.3.1

js davidsonsgroup.co.uk collected 2026-09-25 04:22:27 UTC 20,027 bytes, 406 lines download raw bytes

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.