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:
parent
3d403e48e2
commit
8fc15869ef
1 changed files with 101 additions and 69 deletions
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue