|
Lines 129-173
$("#placeBookingModal").on("show.bs.modal", function (e) {
Link Here
|
| 129 |
placeholder: __("Search for a patron"), |
129 |
placeholder: __("Search for a patron"), |
| 130 |
}); |
130 |
}); |
| 131 |
|
131 |
|
| 132 |
// Lead and Trail days syncing |
132 |
// Circulation rules update |
| 133 |
let leadDays = 0; |
133 |
let leadDays = 0; |
| 134 |
let trailDays = 0; |
134 |
let trailDays = 0; |
| 135 |
let boldDates = []; |
135 |
let boldDates = []; |
| 136 |
let issueLength; |
136 |
let issueLength; |
| 137 |
let renewalLength; |
137 |
let renewalLength; |
| 138 |
let renewalsAllowed; |
138 |
let renewalsAllowed; |
|
|
139 |
|
| 140 |
// Note: For now, we apply the pickup library rules for issuelength, renewalsallowed and renewalperiod. |
| 141 |
// This effectively makes these circulation rules hard coded to CircControl: ItemHomeLibrary + HomeOrHolding: holdingbranch |
| 142 |
// Whilst it would be beneficial to make this follow those rules more closely, this would require some significant thinking |
| 143 |
// around how to best display this in the calender component for the 'Any item' case. |
| 139 |
function getCirculationRules() { |
144 |
function getCirculationRules() { |
| 140 |
let rules_url = "/api/v1/circulation_rules"; |
145 |
let rules_url = "/api/v1/circulation_rules"; |
| 141 |
$.ajax({ |
146 |
if (booking_patron && pickup_library_id && booking_itemtype_id) { |
| 142 |
url: rules_url, |
147 |
$.ajax({ |
| 143 |
type: "GET", |
148 |
url: rules_url, |
| 144 |
dataType: "json", |
149 |
type: "GET", |
| 145 |
data: { |
150 |
dataType: "json", |
| 146 |
patron_category_id: booking_patron.category_id, |
151 |
data: { |
| 147 |
item_type_id: booking_itemtype_id, |
152 |
patron_category_id: booking_patron.category_id, |
| 148 |
library_id: pickup_library_id, |
153 |
item_type_id: booking_itemtype_id, |
| 149 |
rules: "bookings_lead_period,bookings_trail_period,issuelength,renewalsallowed,renewalperiod", |
154 |
library_id: pickup_library_id, |
| 150 |
}, |
155 |
rules: "bookings_lead_period,bookings_trail_period,issuelength,renewalsallowed,renewalperiod", |
| 151 |
success: function (response) { |
156 |
}, |
| 152 |
let rules = response[0]; |
157 |
success: function (response) { |
| 153 |
issueLength = rules.issuelength; |
158 |
let rules = response[0]; |
| 154 |
renewalsAllowed = rules.renewalsallowed; |
159 |
issueLength = rules.issuelength; |
| 155 |
renewalLength = rules.renewalperiod; |
160 |
renewalsAllowed = rules.renewalsallowed; |
| 156 |
leadDays = rules.bookings_lead_period; |
161 |
renewalLength = rules.renewalperiod; |
| 157 |
trailDays = rules.bookings_trail_period; |
162 |
leadDays = rules.bookings_lead_period; |
| 158 |
|
163 |
trailDays = rules.bookings_trail_period; |
| 159 |
// redraw pariodPicker taking selected item into account |
164 |
|
| 160 |
periodPicker.redraw(); |
165 |
// redraw pariodPicker taking selected item into account |
| 161 |
|
166 |
periodPicker.redraw(); |
| 162 |
// Enable flatpickr now we have data we need |
167 |
|
| 163 |
if (dataFetched) { |
168 |
// Enable flatpickr now we have data we need |
| 164 |
$("#period_fields :input").prop("disabled", false); |
169 |
if (dataFetched) { |
| 165 |
} |
170 |
$("#period_fields :input").prop("disabled", false); |
| 166 |
}, |
171 |
} |
| 167 |
error: function (xhr, status, error) { |
172 |
}, |
| 168 |
console.log("Circulation rules fetch failed: ", error); |
173 |
error: function (xhr, status, error) { |
| 169 |
}, |
174 |
console.log("Circulation rules fetch failed: ", error); |
| 170 |
}); |
175 |
}, |
|
|
176 |
}); |
| 177 |
} else { |
| 178 |
$("#period_fields :input").prop("disabled", true); |
| 179 |
} |
| 171 |
} |
180 |
} |
| 172 |
|
181 |
|
| 173 |
// Pickup location select2 |
182 |
// Pickup location select2 |
|
Lines 304-309
$("#placeBookingModal").on("show.bs.modal", function (e) {
Link Here
|
| 304 |
"&_per_page=-1", |
313 |
"&_per_page=-1", |
| 305 |
dataType: "json", |
314 |
dataType: "json", |
| 306 |
type: "GET", |
315 |
type: "GET", |
|
|
316 |
headers: { |
| 317 |
"x-koha-embed": "item_type", |
| 318 |
}, |
| 307 |
}); |
319 |
}); |
| 308 |
|
320 |
|
| 309 |
// Fetch list of existing bookings |
321 |
// Fetch list of existing bookings |
|
Lines 346-357
$("#placeBookingModal").on("show.bs.modal", function (e) {
Link Here
|
| 346 |
|
358 |
|
| 347 |
// Total bookable items |
359 |
// Total bookable items |
| 348 |
let bookable = 0; |
360 |
let bookable = 0; |
| 349 |
|
|
|
| 350 |
let itemtypes = new Set(); |
| 351 |
for (item of bookable_items) { |
361 |
for (item of bookable_items) { |
| 352 |
bookable++; |
362 |
bookable++; |
| 353 |
|
363 |
|
| 354 |
// Populate item select (NOTE: Do we still need this check for pre-existing select option here?) |
364 |
// Populate item select |
| 355 |
if ( |
365 |
if ( |
| 356 |
!$("#booking_item_id").find( |
366 |
!$("#booking_item_id").find( |
| 357 |
"option[value='" + item.item_id + "']" |
367 |
"option[value='" + item.item_id + "']" |
|
Lines 374-391
$("#placeBookingModal").on("show.bs.modal", function (e) {
Link Here
|
| 374 |
$("#booking_item_id").append(newOption); |
384 |
$("#booking_item_id").append(newOption); |
| 375 |
} |
385 |
} |
| 376 |
|
386 |
|
| 377 |
// Build list of itemtypes |
387 |
// Populate item types select |
| 378 |
itemtypes.add(item.effective_item_type_id); |
388 |
if ( |
| 379 |
} |
389 |
!$("#booking_itemtype").find( |
| 380 |
|
390 |
"option[value='" + |
| 381 |
// Filter itemtypes |
391 |
item.item_type.item_type_id + |
| 382 |
$("#booking_itemtype option").each(function () { |
392 |
"']" |
| 383 |
const optionValue = $(this).val(); |
393 |
).length |
| 384 |
if (!itemtypes.has(optionValue)) { |
394 |
) { |
| 385 |
$(this).remove(); |
395 |
// Create a DOM Option and de-select by default |
|
|
396 |
let newTypeOption = new Option( |
| 397 |
escape_str(item.item_type.description), |
| 398 |
item.item_type.item_type_id, |
| 399 |
false, |
| 400 |
false |
| 401 |
); |
| 402 |
$("#booking_itemtype").append(newTypeOption); |
| 386 |
} |
403 |
} |
| 387 |
}); |
404 |
} |
| 388 |
$("#booking_itemtype").trigger("change"); |
405 |
$("#booking_itemtype").val(null).trigger("change"); |
| 389 |
|
406 |
|
| 390 |
// Set disable function for periodPicker |
407 |
// Set disable function for periodPicker |
| 391 |
let disableExists = periodPicker.config.disable.filter( |
408 |
let disableExists = periodPicker.config.disable.filter( |
|
Lines 568-595
$("#placeBookingModal").on("show.bs.modal", function (e) {
Link Here
|
| 568 |
} |
585 |
} |
| 569 |
|
586 |
|
| 570 |
// Setup listener for itemtype select2 |
587 |
// Setup listener for itemtype select2 |
| 571 |
$("#booking_itemtype").on("select2:select", function (e) { |
588 |
$("#booking_itemtype").on("change", function (e) { |
| 572 |
booking_itemtype_id = e.params.data.id |
589 |
let selectedValue = $(this).val(); // Get selected value (null if cleared) |
| 573 |
? e.params.data.id |
590 |
booking_itemtype_id = selectedValue ? selectedValue : null; |
| 574 |
: null; |
591 |
|
| 575 |
|
592 |
// Handle item selectionue |
| 576 |
// Disable items not of this itemtype |
593 |
if (!booking_itemtype_id) { |
| 577 |
$("#booking_item_id > option").each(function () { |
594 |
// Enable all items for selection |
| 578 |
let option = $(this); |
595 |
$("#booking_item_id > option").prop("disabled", false); |
| 579 |
if (option.val() != 0) { |
596 |
} else { |
| 580 |
let item_itemtype = option.data("itemtype"); |
597 |
// Disable items not of this itemtype |
| 581 |
if (item_itemtype == booking_itemtype_id) { |
598 |
$("#booking_item_id > option").each(function () { |
| 582 |
if ( |
599 |
let option = $(this); |
| 583 |
option.data("available") && |
600 |
if (option.val() != 0) { |
| 584 |
option.data("pickup") |
601 |
let item_itemtype = option.data("itemtype"); |
| 585 |
) { |
602 |
if (item_itemtype == booking_itemtype_id) { |
| 586 |
option.prop("disabled", false); |
603 |
if ( |
|
|
604 |
option.data("available") && |
| 605 |
option.data("pickup") |
| 606 |
) { |
| 607 |
option.prop("disabled", false); |
| 608 |
} |
| 609 |
} else { |
| 610 |
option.prop("disabled", true); |
| 587 |
} |
611 |
} |
| 588 |
} else { |
|
|
| 589 |
option.prop("disabled", true); |
| 590 |
} |
612 |
} |
| 591 |
} |
613 |
}); |
| 592 |
}); |
614 |
} |
| 593 |
$("#booking_item_id").trigger("change.select2"); |
615 |
$("#booking_item_id").trigger("change.select2"); |
| 594 |
|
616 |
|
| 595 |
// Update circulation rules |
617 |
// Update circulation rules |
|
Lines 667-672
$("#placeBookingModal").on("show.bs.modal", function (e) {
Link Here
|
| 667 |
|
689 |
|
| 668 |
// Disable patron selection change |
690 |
// Disable patron selection change |
| 669 |
$("#booking_patron_id").prop("disabled", true); |
691 |
$("#booking_patron_id").prop("disabled", true); |
|
|
692 |
|
| 693 |
pickup_library_id = $("#pickup_library_id").val(); |
| 694 |
|
| 695 |
// Populate circulation rules |
| 696 |
getCirculationRules(); |
| 670 |
}); |
697 |
}); |
| 671 |
|
698 |
|
| 672 |
// Set onChange for flatpickr |
699 |
// Set onChange for flatpickr |
|
Lines 1226-1232
$("#placeBookingModal").on("hidden.bs.modal", function (e) {
Link Here
|
| 1226 |
$("#booking_item_id").prop("disabled", true); |
1253 |
$("#booking_item_id").prop("disabled", true); |
| 1227 |
|
1254 |
|
| 1228 |
// Reset itemtype select |
1255 |
// Reset itemtype select |
| 1229 |
$("#booking_itemtype").val(0).trigger("change"); |
1256 |
$("#booking_itemtype").val(null).trigger("change"); |
| 1230 |
$("#booking_itemtype").prop("disabled", true); |
1257 |
$("#booking_itemtype").prop("disabled", true); |
| 1231 |
booking_itemtype_id = undefined; |
1258 |
booking_itemtype_id = undefined; |
| 1232 |
|
1259 |
|
| 1233 |
- |
|
|