Bug 36120: Ensure pickup location and item can be picked in either order

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
This commit is contained in:
Martin Renvoize 2024-04-18 17:56:15 +01:00 committed by Katrin Fischer
parent 3d403e48e2
commit 8fc15869ef
Signed by: kfischer
GPG key ID: 0EF6E2C03357A834

View file

@ -110,68 +110,79 @@ $("#placeBookingModal").on("show.bs.modal", function (e) {
placeholder: __("Search for a patron"), placeholder: __("Search for a patron"),
}); });
$("#booking_patron_id").on("select2:select", function (e) {
booking_patron = e.params.data;
$("#pickup_library_id").prop("disabled", false);
});
// Pickup location select2 // Pickup location select2
let pickup_url = "/api/v1/biblios/" + biblionumber + "/pickup_locations"; let pickup_url = "/api/v1/biblios/" + biblionumber + "/pickup_locations";
$("#pickup_library_id").kohaSelect({ $("#pickup_library_id").select2({
dropdownParent: $(".modal-content", "#placeBookingModal"), dropdownParent: $(".modal-content", "#placeBookingModal"),
width: "50%", width: "50%",
dropdownAutoWidth: true, dropdownAutoWidth: true,
minimumResultsForSearch: 10,
allowClear: false, allowClear: false,
ajax: { placeholder: __("Pickup location"),
});
// Item select2
$("#booking_item_id").select2({
dropdownParent: $(".modal-content", "#placeBookingModal"),
width: "50%",
dropdownAutoWidth: true,
minimumResultsForSearch: 10,
allowClear: false,
});
// Patron selection triggers
$("#booking_patron_id").on("select2:select", function (e) {
booking_patron = e.params.data;
// Fetch pickup locations and enable picker
let $pickupSelect = $("#pickup_library_id");
$.ajax({
url: pickup_url, url: pickup_url,
delay: 300, // wait 300 milliseconds before triggering the request type: "GET",
cache: true,
dataType: "json", dataType: "json",
data: function (params) { data: {
var search_term = params.term === undefined ? "" : params.term; _order_by: "name",
var query = { _per_page: "-1",
q: JSON.stringify({ patron_id: booking_patron.patron_id,
name: { "-like": "%" + search_term + "%" },
}),
_order_by: "name",
_page: params.page,
};
query["patron_id"] = booking_patron.patron_id;
return query;
}, },
processResults: function (data) { success: function (response) {
var results = []; $pickupSelect.empty();
data.results.forEach(function (pickup_location) {
results.push({ $.each(response, function (index, pickup_location) {
id: pickup_location.library_id.escapeHtml(), let option = $(
text: pickup_location.name.escapeHtml(), '<option value="' +
needs_override: pickup_location.needs_override, pickup_location.library_id +
pickup_items: pickup_location.pickup_items, '">' +
}); pickup_location.name +
"</option>"
);
option.attr(
"data-needs_override",
pickup_location.needs_override
);
option.attr(
"data-pickup_items",
pickup_location.pickup_items.join(",")
);
$pickupSelect.append(option);
}); });
return {
results: results, $pickupSelect.prop("disabled", false);
pagination: { more: data.pagination.more }, $pickupSelect.val(null).trigger("change");
};
}, },
}, error: function (xhr, status, error) {
templateResult: function (state) { console.log("Pickup location fetch failed: ", error);
var $text; },
if (state.needs_override === true) { });
$text = $(
"<span>" + // Enable item selection if item data is also fetched
state.text + let $bookingItemSelect = $("#booking_item_id");
'</span> <span style="float:right;" title="' + $bookingItemSelect.data("patron", true);
__( if ($bookingItemSelect.data("loaded")) {
"This pickup location is not allowed according to circulation rules" $bookingItemSelect.prop("disabled", false);
) + }
'"><i class="fa fa-exclamation-circle" aria-hidden="true"></i></span>'
);
} else {
$text = $("<span>" + state.text + "</span>");
}
return $text;
},
}); });
// Adopt periodPicker // Adopt periodPicker
@ -224,15 +235,6 @@ $("#placeBookingModal").on("show.bs.modal", function (e) {
bookings.unshift(booking); bookings.unshift(booking);
} }
// Item select2
$("#booking_item_id").select2({
dropdownParent: $(".modal-content", "#placeBookingModal"),
width: "50%",
dropdownAutoWidth: true,
minimumResultsForSearch: 20,
placeholder: __("Select item"),
});
// Update flatpickr mode // Update flatpickr mode
periodPicker.set("mode", "range"); periodPicker.set("mode", "range");
@ -254,10 +256,7 @@ $("#placeBookingModal").on("show.bs.modal", function (e) {
false, false,
false false
); );
newOption.setAttribute( newOption.setAttribute("data-available", true);
"data-available",
true
);
// Append it to the select // Append it to the select
$("#booking_item_id").append(newOption); $("#booking_item_id").append(newOption);
@ -450,20 +449,46 @@ $("#placeBookingModal").on("show.bs.modal", function (e) {
? e.params.data.id ? e.params.data.id
: null; : null;
// Disable invalid pickup locations
$("#pickup_library_id > option").each(function () {
let option = $(this);
if (booking_item_id == 0) {
option.prop("disabled", false);
} else {
let valid_items = String(
option.data("pickup_items")
)
.split(",")
.map(Number);
if (
valid_items.includes(parseInt(booking_item_id))
) {
option.prop("disabled", false);
} else {
option.prop("disabled", true);
}
}
});
$("#pickup_library_id").trigger("change.select2");
// Disable patron selection change
$("#booking_patron_id").prop("disabled", true);
// redraw pariodPicker taking selected item into account // redraw pariodPicker taking selected item into account
periodPicker.redraw(); periodPicker.redraw();
}); });
// Setup listener for pickup location select2 // Setup listener for pickup location select2
$("#pickup_library_id").on("select2:select", function (e) { $("#pickup_library_id").on("select2:select", function (e) {
let valid_items = e.params.data.pickup_items; let valid_items =
valid_items.push(0); e.params.data.element.dataset.pickup_items.split(",");
valid_items.push("0");
// Disable items not available at the pickup location // Disable items not available at the pickup location
$("#booking_item_id > option").each(function () { $("#booking_item_id > option").each(function () {
let option = $(this); let option = $(this);
let item_id = option.val(); let item_id = option.val();
if (valid_items.includes(parseInt(item_id))) { if (valid_items.includes(item_id)) {
option.attr("data-pickup", true); option.attr("data-pickup", true);
if (option.data("available")) { if (option.data("available")) {
option.prop("disabled", false); option.prop("disabled", false);
@ -474,6 +499,9 @@ $("#placeBookingModal").on("show.bs.modal", function (e) {
} }
}); });
$("#booking_item_id").trigger("change.select2"); $("#booking_item_id").trigger("change.select2");
// Disable patron selection change
$("#booking_patron_id").prop("disabled", true);
}); });
// Set onChange for flatpickr // Set onChange for flatpickr
@ -564,8 +592,12 @@ $("#placeBookingModal").on("show.bs.modal", function (e) {
$("#period_fields :input").prop("disabled", false); $("#period_fields :input").prop("disabled", false);
// Redraw select with new options and enable // Redraw select with new options and enable
$("#booking_item_id").trigger("change"); let $bookingItemSelect = $("#booking_item_id");
$("#booking_item_id").prop("disabled", false); $bookingItemSelect.trigger("change");
$bookingItemSelect.data("loaded", true);
if ($bookingItemSelect.data("patron")) {
$bookingItemSelect.prop("disabled", false);
}
// Set the flag to indicate that data has been fetched // Set the flag to indicate that data has been fetched
dataFetched = true; dataFetched = true;