Skip to content
Snippets Groups Projects
Select Git revision
  • 737c0b2ade4ea92ea85ad9c536553abfcbc96877
  • main default protected
  • step-3263
  • feature/plugins-cli
  • feature/vite
  • step-2484-peerreview
  • biest/issue-5051
  • tests/simplify-jsonapi-tests
  • fix/typo-in-1a70031
  • feature/broadcasting
  • database-seeders-and-factories
  • feature/peer-review-2
  • feature-feedback-jsonapi
  • feature/peerreview
  • feature/balloon-plus
  • feature/stock-images-unsplash
  • tic-2588
  • 5.0
  • 5.2
  • biest/unlock-blocks
  • biest-1514
21 results

contentbox.js

Blame
  • Forked from Stud.IP / Stud.IP
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    resources.js 37.71 KiB
    import {$gettext} from '../lib/gettext.js';
    
    STUDIP.ready(function () {
        //Event definitions:
        jQuery(document).on(
            'change',
            '.room-search-form .criteria-selector',
            function (event) {
                STUDIP.Resources.addSearchCriteriaToRoomSearchWidget(
                    event.target
                );
            }
        );
    
        jQuery(document).on(
            'click',
            '.room-search-form .criteria-list .remove-icon',
            function (event) {
                STUDIP.Resources.removeSearchCriteriaFromRoomSearchWidget(
                    event.target
                );
            }
        );
    
        //permission list:
    
        jQuery(document).on(
            'click',
            '.resource-permission-list-action.apply-to-all-action',
            function (event) {
                var table = jQuery('#RoomGroupCommonPermissionTable')[0];
                var tr = jQuery(event.target).parents('tr')[0];
                if (!tr) {
                    return;
                }
                var user_id = jQuery(tr).data('user_id');
                STUDIP.Resources.addUserToPermissionList(user_id, table);
                //Delete the row:
                jQuery(tr).remove();
            }
        );
    
        //Temporary permission list: Set the hidden checkbox to the state of the
        //proxy checkbox:
        jQuery(document).on('change', '#resource-temporary-permissions input.bulk-proxy', function () {
            var bulk_checked = jQuery(this).prop('checked');
            var bulk_indeterminate = jQuery(this).prop('indeterminate');
            if (bulk_checked || bulk_indeterminate) {
                jQuery('#resource-temporary-permissions input.bulk-datetime-enable').prop('checked', true);
            } else {
                jQuery('#resource-temporary-permissions input.bulk-datetime-enable').prop('checked', false);
            }
        });
    
        //Dialog for adding/editing bookings:
    
        if (jQuery('form.create-booking-form').length) {
            STUDIP.Resources.moveTimeOptions(jQuery('input[name="booking_style"]:checked').val());
        }
    
        //Set the date selector in the sidebar to the date from the session,
        //if that is set and no date is set in the URL.
        var date_set = false;
        var url_param_string = window.location.search;
        if (url_param_string) {
            var url_params = new URLSearchParams(url_param_string);
            if (url_params.get('defaultDate')) {
                date_set = true;
            }
        }
        if (!date_set) {
            var date_input = jQuery('#booking-plan-jmpdate')[0];
            if (date_input) {
                var session_date_string = sessionStorage.getItem('booking_plan_date');
                if (session_date_string) {
                    //The date string is in the format YYYY-MM-DD and has to be
                    //converted to the format DD.MM.YYYY.
                    var date_parts = session_date_string.split('-');
                    jQuery(date_input).val(date_parts[2] + '.' + date_parts[1] + '.' + date_parts[0]);
                }
            }
        }
    
        //Room search widget: remove empty form inputs from URL:
        jQuery('.sidebar-widget-content form.room-search-form').submit(function() {
            //Check if the seats checkbox is checked. Only include "its" input
            //fields when it is checked.
            let seats_checked = jQuery(this).find('input[name="special__seats_enabled"]').is(':checked');
            if (seats_checked) {
            } else {
                jQuery(this).find('input[name="special__seats_min"]').attr('disabled', 'disabled');
                jQuery(this).find('input[name="special__seats_max"]').attr('disabled', 'disabled');
            }
    
            //Check if the time range checkbox is checked. Only include "its" input
            //fields when it is checked.
            let time_range_checked = jQuery('#cb_special__time_range').is(':checked');
            if (time_range_checked) {
                var dow_select = jQuery(this).find('select[name="special__time_range_day_of_week"]')[0];
                if (dow_select) {
                    if (!jQuery(dow_select).val() || (jQuery(dow_select).val() < 1)) {
                        jQuery(dow_select).attr('disabled', 'disabled');
                    }
                }
            } else {
                jQuery(this).find('select[name="special__time_range_semester_id"]').attr('disabled', 'disabled');
                jQuery('#special__time_range_begin_date').attr('disabled', 'disabled');
                jQuery('#special__time_range_begin_time').attr('disabled', 'disabled');
                jQuery('#special__time_range_end_date').attr('disabled', 'disabled');
                jQuery('#special__time_range_end_time').attr('disabled', 'disabled');
                jQuery(this).find('select[name="special__time_range_day_of_week"]').attr('disabled', 'disabled');
            }
    
            //Disable all form input fields that don't have a value:
            jQuery(this).find(':input').filter(
                function(){
                    //A list of allowed input fields without values
                    //(submit buttons):
                    let empty_inputs = ['room_search', 'room_search_reset'];
                    if (jQuery.inArray(jQuery(this).prop('name'), empty_inputs) >= 0) {
                        return false;
                    }
                    return !this.value;
                }
            ).attr('disabled', 'disabled');
    
            //The form shall still be submitted.
            return true;
        });
    
        //other:
    
        jQuery(document).on(
            'click',
            '.booking-list-interval .takes-place-status-toggle',
            STUDIP.Resources.toggleBookingIntervalStatus
        );
    
        jQuery(document).on(
            'click',
            '.resource-category-properties-table .add-action',
            STUDIP.Resources.addResourcePropertyToTable
        );
    
        jQuery(document).on(
            'click',
            '.resource-request-properties-table .add-action',
            STUDIP.Resources.addPropertyToRequest
        );
    
        jQuery(document).on(
            'click',
            '.resource-category-properties-table .delete-action, .resource-request-properties-table .delete-action',
            function (event) {
                var row = jQuery(event.target).parents('tr')[0];
                if (!row) {
                    return;
                }
    
                var property_id = jQuery(row).data('property_id');
    
                //Enable the property in the "add property" select element:
                var table = jQuery(row).parents('table')[0];
                if (!table) {
                    return;
                }
    
                var select = jQuery(table).find('select.available-property-select')[0];
                if (!select) {
                    select = jQuery(table).find('select.requestable-properties-select')[0];
                    if (!select) {
                        return;
                    }
                }
    
                var option = jQuery(select).find('option[value="' + property_id + '"]')[0];
                if (!option) {
                    return;
                }
                jQuery(option).removeAttr('disabled');
    
                //As a final step: delete the row:
                jQuery(row).remove();
            }
        );
    
        //Event handlers for the individual booking plan print view:
        jQuery('.sidebar .colour-selector').draggable(
            {
                cursorAt: {
                    left: 28, top: 15
                },
                appendTo: 'body',
                helper: function () {
                    var dragged_item = jQuery(
                        '<div class="dragged-colour"></div>'
                    );
                    jQuery(dragged_item).css(
                        {
                            backgroundColor: jQuery(this).css('background-color'),
                            width: jQuery(this).css('width'),
                            height: jQuery(this).css('height'),
                            zIndex: 1000
                        }
                    );
                    return dragged_item;
                },
                revert: true
            }
        );
    
        jQuery(document).on(
            'click',
            '.colour-selector',
            function (event) {
                jQuery(event.target).children().click();
            }
        );
    
        jQuery(document).on(
            'change',
            '.colour-selector input[type="color"]',
            function (event) {
                jQuery(event.target).parent().css(
                    'background-color',
                    jQuery(event.target).val()
                );
            }
        );
    
        jQuery(document).on(
            'dragenter',
            '.individual-booking-plan .appointment-booking-plan .schedule_entry',
            function (event) {
                jQuery(event.target).css('opacity', '0.7');
            }
        );
    
        jQuery(document).on(
            'dragleave',
            '.individual-booking-plan .appointment-booking-plan .schedule_entry',
            function (event) {
                jQuery(event.target).css('opacity', '1.0');
            }
        );
    
        jQuery(document).on(
            'dragend',
            '.dragged-colour',
            function (event) {
                jQuery(event.target).css(
                    {
                        'top': '0px',
                        'left': '0px'
                    }
                );
            }
        );
    
        jQuery('.schedule_entry').droppable(
            {
                drop: function (event, ui_element) {
                    event.preventDefault();
    
                    var booking_plan_entry = event.target;
                    var new_background_colour = jQuery(
                        ui_element.helper
                    ).css('background-color');
    
                    jQuery(booking_plan_entry).css(
                        'background-color',
                        new_background_colour
                    );
    
                    jQuery(booking_plan_entry).find('dl').css(
                        {
                            backgroundColor: new_background_colour,
                            borderColor: new_background_colour
                        }
                    );
                    jQuery(booking_plan_entry).find('dt').css(
                        'background-color',
                        new_background_colour
                    );
                }
            }
        );
    
        //For the message functionality of the resource system:
    
        jQuery(document).on(
            'click',
            '.resources_messages-form .selection-area .remove-icon',
            function (event) {
                jQuery(event.target).parent().remove();
            }
        );
    
        //Handle the selection of room "sources":
    
        jQuery(document).on(
            'click',
            '.resources_messages-form input[name="room_selection"]',
            function (event) {
                //Hide the select field or the search field depending
                //on the room selection radio button:
                var room_selection = jQuery(event.target).val();
                if (room_selection == 'search') {
                    jQuery(
                        '.resources_messages-form select[name="clipboard_id"]'
                    ).attr('disabled', 'disabled');
                    jQuery(
                        '.resources_messages-form input[name="room_name_parameter"]'
                    ).removeAttr('disabled');
                } else {
                    jQuery(
                        '.resources_messages-form input[name="room_name_parameter"]'
                    ).attr('disabled', 'disabled');
                    jQuery(
                        '.resources_messages-form select[name="clipboard_id"]'
                    ).removeAttr('disabled');
                }
            }
        );
    
        //Handle the selection of recipient "sources":
    
        jQuery(document).on(
            'click',
            '.resources_messages-form input[name="recipient_selection"]',
            function (event) {
                var recipient_selection = jQuery(event.target).val();
                if (recipient_selection == 'permission') {
                    jQuery('#RecipientMode_Booking').css('display', 'none');
                    jQuery('#RecipientMode_Permission').css('display', 'block');
                } else {
                    jQuery('#RecipientMode_Permission').css('display', 'none');
                    jQuery('#RecipientMode_Booking').css('display', 'block');
                }
            }
        )
    
        //For the view resources/resource/assign:
    
        jQuery(document).on(
            'change',
            '.create-booking-form .booking-type-selection select',
            function (event) {
                if (jQuery(event.target).prop('tagName') != 'SELECT') {
                    return;
                }
                var booking_type = jQuery(event.target).val();
                var form = jQuery(event.target).parents('form')[0];
                if (!form) {
                    return;
                }
    
                //Activate the correct text for the separable rooms option:
                var separable_room_booking_spans = jQuery(form).find(
                    'label.separable-room-booking span'
                );
                for (var span of separable_room_booking_spans) {
                    var span_booking_type = jQuery(span).data('booking_type');
                    if (span_booking_type == booking_type) {
                        jQuery(span).css('display', 'inline');
                    } else {
                        jQuery(span).css('display', 'none');
                    }
                }
    
                //Activate the correct legend for the comment fieldset:
                var comment_fieldset_legends = jQuery(form).find(
                    'fieldset.comment-fieldset legend'
                );
                for (var legend of comment_fieldset_legends) {
                    var legend_booking_type = jQuery(legend).data('booking_type');
                    if (legend_booking_type == booking_type) {
                        jQuery(legend).css('display', 'block');
                    } else {
                        jQuery(legend).css('display', 'none');
                    }
                }
    
                //Activate the correct booking_type 2 elements:
                jQuery("*[data-booking_type='2']").each(function () {
                    if (booking_type == '2') {
                        jQuery(this).show();
                    } else {
                        jQuery(this).hide();
                    }
                });
            }
        );
    
        jQuery(document).on(
            'change',
            'input[name="booking_style"]',
            function () {
                STUDIP.Resources.moveTimeOptions($(this).val());
            }
        );
    
        jQuery(document).on(
            'change',
            '.semester-time-option',
            function () {
                if (~$(this).attr('name').indexOf("begin")) {
                    $("#BookingStartDateInput").prop("disabled", true);
                } else {
                    $("#RepetitionEndInput").prop("disabled", true);
                    $("#RepetitionEndInput").val($("input[name='semester_course_end_date']").val());
                    $("#HiddenRepetitionEndInput").prop("disabled", false);
                    $("#HiddenRepetitionEndInput").val($("input[name='semester_course_end_date']").val());
                }
                $(".semester-selector").parent().show();
            }
        );
    
        jQuery(document).on(
            'change',
            '.manual-time-option',
            function () {
                if (~$(this).attr('name').indexOf("begin")) {
                    $("#BookingStartDateInput").prop("disabled", false);
                } else {
                    $("#RepetitionEndInput").prop("disabled", false);
                    $("#HiddenRepetitionEndInput").prop("disabled", true);
                }
                if (!$("#BookingStartDateInput").prop("disabled")
                    && !$("#RepetitionEndInput").prop("disabled")) {
                    $(".semester-selector").parent().hide();
                }
            }
        );
    
        jQuery(document).on(
            'change',
            '.manual-time-fields input[type="text"]',
            function () {
                var ds = $(this).val().split('.');
                var d = new Date(ds[1] + '/' + ds[0] + '/' + ds[2]);
                var day_numer = (d.getDay() || 7);
    
                if ($(this).attr('id') == 'BookingStartDateInput') {
                    $("#begin_date-weekdays span").addClass('invisible');
                    $("#begin_date-weekdays #" + day_numer).removeClass('invisible');
                    var start_date_parts = jQuery(this).val().split('.');
                    var repetition_end_date_parts = jQuery("#RepetitionEndInput").val().split('.');
                    var start_date = new Date(
                        start_date_parts[2] + '-' + start_date_parts[1] + '-' + start_date_parts[0]
                            + 'T00:00:00'
                    );
                    var repetition_end_date = new Date(
                        repetition_end_date_parts[2] + '-' + repetition_end_date_parts[1] + '-'
                            + repetition_end_date_parts[0] + 'T00:00:00'
                    );
    
                    if (start_date > repetition_end_date
                        && $("input[name='selected_end']:checked").val() != 'semester_course_end') {
                        $("#RepetitionEndInput").prop('defaultValue', $(this).val());
                        $("#RepetitionEndInput").val($(this).val()).trigger('change');
                    }
    
                    if (!$('#multiday').prop('checked')
                        || $("#BookingEndDateInput").prop('defaultValue') ==
                        $("#BookingEndDateInput").val()) {
                        $("#BookingEndDateInput").prop('defaultValue', $(this).val());
                        $("#BookingEndDateInput").val($(this).val()).trigger('change');
                    }
                    updateRepeatEndSemesterByTimestamp(Math.floor(d / 1000));
                } else if ($(this).attr('id') == 'BookingEndDateInput') {
                    $("#end_date-weekdays span").addClass('invisible');
                    $("#end_date-weekdays #" + day_numer).removeClass('invisible');
                }
            }
        );
    
        jQuery(document).on(
            'change',
            'input[name="begin_date"]',
            function () {
                if (!$('#multiday').prop('checked')) {
                    $('#end_date_section input').val($(this).val());
                }
            }
        );
    
        $(".new-clipboard-form #add-clipboard-button").removeAttr("disabled");
        var selected_clipboard_id = $('.clipboard-selector').val();
        $(".clipboard-area[data-id='" + selected_clipboard_id + "']").removeClass('invisible');
        if ($(".clipboard-area[data-id='" + selected_clipboard_id + "']").find(".empty-clipboard-message").hasClass("invisible")) {
            $("#clipboard-group-container").find('.widget-links').removeClass('invisible');
        }
    
        $('.special-item-switch').each(function () {
            if ($(this).prop('checked') == false) {
                $(this).next('label').children(':not(span)').hide();
            }
        });
    
        jQuery(document).on(
            'click',
            '.special-item-switch',
            function () {
                $(this).next('label').children(':not(span)').toggle();
            }
        );
    
        jQuery(document).on(
            'change',
            'select[name="special__time_range_semester_id"]',
            function () {
                var selected_option = $(this).find('option:selected');
                if (selected_option) {
                    var begin = new Date(parseInt(selected_option.attr('data-begin') + '000'));
                    var end = new Date(parseInt(selected_option.attr('data-end') + '000'));
                    $('input[name="special__time_range_begin_date"]').val(
                        $.datepicker.formatDate('dd.mm.yy', begin)
                    );
                    $('input[name="special__time_range_end_date"]').val(
                        $.datepicker.formatDate('dd.mm.yy', end)
                    );
                }
            }
        );
    
        jQuery(document).on(
            'click',
            '.fc-button',
            function () {
                if ($(this).hasClass('fc-dayGridMonth-button')) {
                    updateViewURL('dayGridMonth')
                } else if ($(this).hasClass('fc-timeGridWeek-button')) {
                    updateViewURL('timeGridWeek')
                } else if ($(this).hasClass('fc-timeGridDay-button')) {
                    updateViewURL('timeGridDay')
                } else if ($(this).hasClass('fc-today-button')
                    || $(this).hasClass('fc-prev-button')
                    || $(this).hasClass('fc-next-button')) {
                    updateDateURL();
                }
            }
        );
    
        jQuery(document).on(
            'blur',
            '.hasDatepicker',
            function () {
                var new_val = $(this).val();
                switch ($(this).attr('name')) {
                    case 'permissions[begin_date][]':
                    case 'permissions[end_date][]':
                    case 'bulk_begin_date':
                    case 'bulk_end_date':
                        var now = new Date();
                        if (new_val.split('.').length === 1) {
                            $(this).val(new_val + '.' + ((now.getMonth() + 1) < 10 ? '0' + (now.getMonth() + 1) : (now.getMonth() + 1)) + '.' + now.getFullYear());
                        } else if (new_val.split('.').length === 2) {
                            $(this).val(new_val + '.' + now.getFullYear());
                        }
                        break;
                    case 'permissions[begin_time][]':
                    case 'permissions[end_time][]':
                    case 'bulk_begin_time':
                    case 'bulk_end_time':
                        if (new_val.split(':').length === 1) {
                            $(this).val(new_val + ':00');
                        }
                        break;
                }
            }
        );
    
        jQuery(document).on(
            'change blur',
            '#resource-temporary-permission-bulk-datetime input',
            function () {
                var targets = '';
                switch ($(this).attr('name')) {
                    case 'bulk_begin_date':
                        targets = 'permissions[begin_date][]';
                        break;
                    case 'bulk_begin_time':
                        targets = 'permissions[begin_time][]';
                        break;
                    case 'bulk_end_date':
                        targets = 'permissions[end_date][]';
                        break;
                    case 'bulk_end_time':
                        targets = 'permissions[end_time][]';
                        break;
                }
                var new_val = $(this).val();
                $('.resource-temporary-permission-row input[name="' + targets + '"]').each(function () {
                    if ($(this).parents('tr').find('input[name="selected_permission_ids[]"]').prop('checked')) {
                        $(this).val(new_val);
                    }
                });
            }
        );
    
        function updateRepeatEndSemesterByTimestamp(timestamp, api_url = 'api.php/semesters') {
            var semester = null;
            jQuery.ajax(
                STUDIP.URLHelper.getURL(api_url),
                {
                    method: 'get',
                    dataType: 'json',
                    success: function (data) {
                        if (data) {
                            Object.values(data.collection).forEach(item => {
                                if (timestamp >= item.begin && timestamp < item.end) {
                                    semester = item;
                                }
                            });
                            if (semester) {
                                $("#semester_course_name").text(semester.title);
                                $(".semester-time-option").prop('disabled', false);
                            } else {
                                if (data.pagination && data.pagination.links.next != api_url) {
                                    semester = updateRepeatEndSemesterByTimestamp(timestamp, data.pagination.links.next);
                                } else {
                                    $("#semester_course_name").text('außerhalb definierter Zeiten');
                                    $(".semester-time-option").prop('checked', false);
                                    $(".semester-time-option").prop('disabled', true);
                                    $(".manual-time-option").prop('checked', true);
                                    $(".manual-time-option").trigger('change');
                                }
                            }
                        }
                    }
                }
            );
        }
    
        function updateViewURL(defaultView) {
            const url = new URL(window.location.href);
            url.searchParams.set('defaultView', defaultView);
    
            // Push current view url to history
            history.pushState({}, null, url.toString());
    
            // Set links accordingly
            url.searchParams.delete('allday');
            $('.booking-plan-std_view').attr('href', url.toString());
    
            url.searchParams.set('allday', 1);
            $('.booking-plan-allday_view').attr('href', url.toString());
        }
    
        function submitDatePicker() {
            var picked = $('#booking-plan-jmpdate').val();
            var iso_date_string = '';
            if(picked) {
                if (picked.includes('.')) {
                    let [day, month, year] = picked.split('.');
                    iso_date_string = year.padStart(4, "20") + '-' + month.padStart(2, "0") + '-' + day.padStart(2, "0");
                } else if (picked.includes('/')) {
                    let [day, month, year] = picked.split('/');
                    iso_date_string = year.padStart(4, "20") + '-' + month.padStart(2, "0") + '-' + day.padStart(2, "0");
                } else if (picked.includes('-')) {
                    iso_date_string = picked;
                }
            }
            if (iso_date_string) {
                $('*[data-resources-fullcalendar="1"]').each(function () {
                    this.calendar.gotoDate(iso_date_string);
                });
                updateDateURL();
            }
        }
    
        function updateDateURL() {
            let changedMoment;
            $('[data-resources-fullcalendar="1"]').each(function () {
                changedMoment = $(this)[0].calendar.getDate();
            });
            if (changedMoment) {
                let changedDate = STUDIP.Fullcalendar.toRFC3339String(changedMoment).split('T')[0];
                //Get the timestamp:
                let timeStamp = changedMoment.getTime() / 1000;
    
                $('a.resource-bookings-actions').each(function () {
                    const url = new URL(this.href);
                    url.searchParams.set('timestamp', timeStamp)
                    url.searchParams.set('defaultDate', changedDate)
                    this.href = url.toString();
                });
    
                // Now change the URL of the window.
                const url = new URL(window.location.href);
                url.searchParams.set('defaultDate', changedDate);
    
                // Update url in history
                history.pushState({}, null, url.toString());
    
                // Adjust links accordingly
                url.searchParams.delete('allday');
                $('.booking-plan-std_view').attr('href', url.toString());
    
                url.searchParams.set('allday', 1);
                $('.booking-plan-allday_view').attr('href', url.toString());
    
                // Update sidebar value
                $('#booking-plan-jmpdate').val(changedMoment.toLocaleDateString('de-DE'));
    
                //Store the date in the sessionStorage:
                sessionStorage.setItem('booking_plan_date', changedDate)
            }
        };
    
        jQuery('#booking-plan-jmpdate').datepicker(
            {
                dateFormat: 'dd.mm.yy',
                onClose: submitDatePicker
            }
        );
        jQuery('.resource-booking-time-fields input[type="date"]').datepicker(
            {
                dateFormat: 'yy-mm-dd'
            }
        );
    
        var nodes = jQuery('*.resource-plan[data-resources-fullcalendar="1"]');
        jQuery.each(nodes, function (index, node) {
            STUDIP.loadChunk('fullcalendar').then(() => {
                //Get the default date from the sessionStorage, if it is set
                //and no date is specified in the url.
                var use_session_date = true;
                var url_param_string = window.location.search;
                if (url_param_string) {
                    var url_params = new URLSearchParams(url_param_string);
                    if (url_params.get('defaultDate')) {
                        use_session_date = false;
                    }
                }
                if (node.calendar == undefined) {
                    if (jQuery(node).hasClass('semester-plan')) {
                        STUDIP.Fullcalendar.createSemesterCalendarFromNode(
                            node,
                            {
                                loading: function (isLoading) {
                                    if (!isLoading) {
                                        var h = jQuery('section.studip-fullcalendar-header');
                                        if (h) {
                                            jQuery(h).removeClass('invisible');
                                            jQuery(h).insertAfter('.fc .fc-toolbar');
                                        }
                                    }
                                }
                            }
                        );
                    } else {
                        var config = {
                            studip_functions: {
                                drop_event:
                                STUDIP.Resources.dropEventInRoomGroupBookingPlan,
                                resize_event:
                                STUDIP.Resources.resizeEventInRoomGroupBookingPlan
                            },
                            loading: function (isLoading) {
                                if (!isLoading) {
                                    var h = jQuery('section.studip-fullcalendar-header');
                                    if (h) {
                                        jQuery(h).removeClass('invisible');
                                        jQuery(h).insertAfter('.fc .fc-toolbar');
                                    }
                                }
                            }
                        };
                        if (use_session_date) {
                            var session_date_string = sessionStorage.getItem('booking_plan_date');
                            if (session_date_string) {
                                config.defaultDate = session_date_string;
                            }
                        }
                        STUDIP.Fullcalendar.createFromNode(node, config);
                    }
                }
            });
        });
    
        //Check if an individual booking plan is to be displayed:
        var nodes = jQuery('.individual-booking-plan[data-resources-fullcalendar="1"]');
        jQuery.each(nodes, function (index, node) {
            STUDIP.loadChunk('fullcalendar').then(() => {
                STUDIP.Fullcalendar.createFromNode(
                    node,
                    {
                        eventPositioned: function (info, calendar_event, dom_element, view) {
                            var calendar_event = info.event;
                            var dom_element = info.el;
                            var view = info.view;
                            jQuery(dom_element).droppable({
                                drop: function (event, ui_element) {
                                    event.preventDefault();
    
                                    var booking_plan_entry = event.target;
                                    var new_background_colour = jQuery(
                                        ui_element.helper
                                    ).css('background-color');
    
                                    jQuery(booking_plan_entry).css(
                                        'background-color',
                                        new_background_colour
                                    );
                                    jQuery(booking_plan_entry).css(
                                        'border-color',
                                        new_background_colour
                                    );
    
                                    jQuery(booking_plan_entry).find('dl').css({
                                        backgroundColor: new_background_colour,
                                        borderColor: new_background_colour
                                    });
                                    jQuery(booking_plan_entry).find('dt').css(
                                        'background-color',
                                        new_background_colour
                                    );
                                }
                            });
                            var h = jQuery('section.studip-fullcalendar-header').clone();
                            if (h) {
                                jQuery(h).removeClass('invisible');
                                jQuery(h).insertAfter('.fc .fc-toolbar');
                            }
                        }
                    }
                );
            });
        });
    
        jQuery(document).on(
            'click',
            '.create-booking-form .delete-assigned-user-icon',
            function (event) {
                var quicksearch = jQuery(event.target).parent().find('input');
                if (!quicksearch) {
                    return;
                }
                jQuery(quicksearch).val('');
            }
        );
    
        jQuery(document).on(
            'click',
            '.request-list .request-marking-icon',
            function (event) {
                event.preventDefault();
                STUDIP.Resources.toggleRequestMarked(event.target);
            }
        );
    
        $(document).on(
            'click',
            "button[name='bulk-book-requests']",
            function (event) {
                STUDIP.Dialog.confirm(
                    $gettext('Wollen Sie die im Plan gezeigten Anfragen wirklich buchen?')
                ).done(function () {
                    STUDIP.Resources.bookAllCalendarRequests();
                });
            }
        );
    
    
        $(document).on('click', '.fc-request-event',
            function () {
                var parent_table_row = $(this).closest('tr');
    
                if($(parent_table_row).length) {
                    $(parent_table_row).toggleClass('resource-planning-selected-request')
                }
                var objectData = $(this).data();
                var eventData = {
                    id: objectData.eventId,
                    title: objectData.eventTitle,
                    start: objectData.eventBegin,
                    end: objectData.eventEnd,
                    studip_weekday_begin: objectData.eventStudip_weekday_begin,
                    studip_weekday_end: objectData.eventStudip_weekday_end,
                    request_id: objectData.eventRequest,
                    tooltip: objectData.eventTooltip,
                    studip_api_urls: {},
                    studip_view_urls: {edit: objectData.eventView_urls_edit},
                    editable: false,
                    color: objectData.eventColor,
                    textColor: '#000'
                };
    
                var calendarSektion = $('*[data-resources-fullcalendar="1"]')[0];
                if (calendarSektion) {
                    var calendar = calendarSektion.calendar;
                    if (calendar && eventData) {
                        var existingRequestEvent = calendar.getEventById(eventData.id);
                        if (existingRequestEvent) {
                            existingRequestEvent.remove();
    
                            var remainingRequestEvents = 0;
                            $('.fc-request-event').each(function () {
                                if (calendar.getEventById($(this).data().eventId)) {
                                    remainingRequestEvents++;
                                }
                            });
                            if (remainingRequestEvents < 1) {
                                $("button[name='bulk-book-requests']").prop('disabled', true);
                            }
                        } else {
                            STUDIP.Fullcalendar.convertSemesterEvents(eventData, calendar.getDate().toString());
                            var overlap = false;
                            var checkStart = new Date(eventData.start);
                            var checkEnd = new Date(eventData.end);
                            $(calendar.getEvents()).each(function () {
                                // start-time in between any of the events
                                if ((checkStart >= this.start && checkStart < this.end)
                                    //end-time in between any of the events
                                    || (checkEnd > this.start && checkEnd <= this.end)
                                    //any of the events in between/on the start-time and end-time
                                    || (checkStart <= this.start && checkEnd >= this.end)) {
                                    overlap = true
                                }
                            });
                            if (overlap) {
                                eventData.icon = 'exclaim-circle-full';
                            }
                            calendar.addEvent(eventData);
                            $("button[name='bulk-book-requests']").prop('disabled', false);
                        }
    
                    }
                }
            }
        );
    });
    
    
    STUDIP.domReady(function() {
        jQuery(document).on(
            'click',
            '.room-clipboard-group-action',
            function (event) {
                //Get the IDs of the rooms of the clipboard:
                var active_clipboard = jQuery(event.target).parents("#clipboard-group-container").find(
                    '.clipboard-area:not(.invisible)'
                )[0];
                if (!active_clipboard) {
                    //Something is wrong with the HTML.
                    return;
                }
    
                var clipboard_id = jQuery(active_clipboard).data('id');
                var action_needs_items = jQuery(event.target).data('needs_items');
                var show_in_dialog = jQuery(event.target).data('show_in_dialog');
                var ids = [];
                if (action_needs_items) {
                    var items = jQuery(active_clipboard).find(
                        'tr.clipboard-item:not(.clipboard-item-template)'
                    );
    
                    for (var item of items) {
                        var input = jQuery(item).find("input[name='selected_clipboard_items[]']:checked")[0];
                        if (input) {
                            var id = jQuery(item).data('range_id');
                            //Check if id is an md5 sum:
                            if (id.match(/[0-9a-f]{32}/)) {
                                ids.push(id);
                            }
                        }
                    }
                    if (ids.length == items.length) {
                        //All items are selected. No need to use the Range-IDs, we
                        //can use the clipboard-ID instead.
                        action_needs_items = false;
                    }
                }
    
                var url_path = jQuery(event.target).data('url_path');
                url_path = url_path.replace(/CLIPBOARD_ID/, clipboard_id);
    
                var complete_url = STUDIP.URLHelper.getURL(
                    url_path,
                    (
                        action_needs_items ? {'resource_ids': ids} : null
                    )
                );
    
                if (show_in_dialog) {
                    //If we have collected at least one ID we can create a dialog
                    //displaying the comments of all the selected rooms:
                    STUDIP.Dialog.fromURL(
                        complete_url,
                        {
                            size: 'normal'
                        }
                    );
                } else {
                    //Show the action in a new tab:
                    window.open(complete_url, '_blank');
                }
                return false;
            }
        );
    });