@@ -, +, @@ items --- .../prog/js/modals/place_booking.js | 97 ++++++++++++++----- 1 file changed, 71 insertions(+), 26 deletions(-) --- a/koha-tmpl/intranet-tmpl/prog/js/modals/place_booking.js +++ a/koha-tmpl/intranet-tmpl/prog/js/modals/place_booking.js @@ -7,6 +7,23 @@ let bookable_items, booking_item_id, booking_patron; +function containsAny(integers1, integers2) { + // Create a hash set to store integers from the second array + let integerSet = {}; + for (let i = 0; i < integers2.length; i++) { + integerSet[integers2[i]] = true; + } + + // Check if any integer from the first array exists in the hash set + for (let i = 0; i < integers1.length; i++) { + if (integerSet[integers1[i]]) { + return true; // Found a match, return true + } + } + + return false; // No match found +} + $("#placeBookingModal").on("show.bs.modal", function (e) { // Get context let button = $(e.relatedTarget); @@ -120,6 +137,37 @@ $("#placeBookingModal").on("show.bs.modal", function (e) { allowClear: false, placeholder: __("Pickup location"), }); + function setLocationsPicker(response) { + let $pickupSelect = $("#pickup_library_id"); + let bookableItemnumbers = bookable_items.map(function(object) { return object.item_id; }); + $pickupSelect.empty(); + + $.each(response, function(index, pickup_location) { + if (containsAny(pickup_location.pickup_items, bookableItemnumbers)) { + let option = $( + '" + ); + + option.attr( + "data-needs_override", + pickup_location.needs_override + ); + option.attr( + "data-pickup_items", + pickup_location.pickup_items.join(",") + ); + + $pickupSelect.append(option); + } + }); + + $pickupSelect.prop("disabled", false); + $pickupSelect.val(null).trigger("change"); + } // Item select2 $("#booking_item_id").select2({ @@ -135,7 +183,6 @@ $("#placeBookingModal").on("show.bs.modal", function (e) { booking_patron = e.params.data; // Fetch pickup locations and enable picker - let $pickupSelect = $("#pickup_library_id"); $.ajax({ url: pickup_url, type: "GET", @@ -146,31 +193,18 @@ $("#placeBookingModal").on("show.bs.modal", function (e) { patron_id: booking_patron.patron_id, }, success: function (response) { - $pickupSelect.empty(); - - $.each(response, function (index, pickup_location) { - let option = $( - '" - ); - - option.attr( - "data-needs_override", - pickup_location.needs_override - ); - option.attr( - "data-pickup_items", - pickup_location.pickup_items.join(",") - ); - - $pickupSelect.append(option); - }); - - $pickupSelect.prop("disabled", false); - $pickupSelect.val(null).trigger("change"); + if (dataFetched === true) { + setLocationsPicker(response); + + } else { + var interval = setInterval(function() { + if (dataFetched === true) { + // Data is fetched, execute the callback and stop the interval + setLocationsPicker(response); + clearInterval(interval); + } + }, 100); + }; }, error: function (xhr, status, error) { console.log("Pickup location fetch failed: ", error); @@ -820,14 +854,25 @@ $("#placeBookingForm").on("submit", function (e) { }); $("#placeBookingModal").on("hidden.bs.modal", function (e) { + + // Reset patron select $("#booking_patron_id").val(null).trigger("change"); $("#booking_patron_id").empty(); + $("#booking_patron_id").prop("disabled", false); booking_patron = undefined; + + // Restet item select $("#booking_item_id").val(0).trigger("change"); + $("#booking_item_id").prop("disabled", true); + + // Reset pickup library select $("#pickup_library_id").val(null).trigger("change"); $("#pickup_library_id").empty(); $("#pickup_library_id").prop("disabled", true); + + // Reset booking period picker $("#period").get(0)._flatpickr.clear(); + $("#period").prop("disabled", true); $("#booking_start_date").val(""); $("#booking_end_date").val(""); $("#booking_id").val(""); --