View | Details | Raw Unified | Return to bug 36120
Collapse All | Expand All

(-)a/koha-tmpl/intranet-tmpl/prog/js/modals/place_booking.js (-70 / +101 lines)
Lines 110-177 $("#placeBookingModal").on("show.bs.modal", function (e) { Link Here
110
        placeholder: __("Search for a patron"),
110
        placeholder: __("Search for a patron"),
111
    });
111
    });
112
112
113
    $("#booking_patron_id").on("select2:select", function (e) {
114
        booking_patron = e.params.data;
115
        $("#pickup_library_id").prop("disabled", false);
116
    });
117
118
    // Pickup location select2
113
    // Pickup location select2
119
    let pickup_url = "/api/v1/biblios/" + biblionumber + "/pickup_locations";
114
    let pickup_url = "/api/v1/biblios/" + biblionumber + "/pickup_locations";
120
    $("#pickup_library_id").kohaSelect({
115
    $("#pickup_library_id").select2({
121
        dropdownParent: $(".modal-content", "#placeBookingModal"),
116
        dropdownParent: $(".modal-content", "#placeBookingModal"),
122
        width: "50%",
117
        width: "50%",
123
        dropdownAutoWidth: true,
118
        dropdownAutoWidth: true,
119
        minimumResultsForSearch: 10,
124
        allowClear: false,
120
        allowClear: false,
125
        ajax: {
121
        placeholder: __("Pickup location"),
122
    });
123
124
    // Item select2
125
    $("#booking_item_id").select2({
126
        dropdownParent: $(".modal-content", "#placeBookingModal"),
127
        width: "50%",
128
        dropdownAutoWidth: true,
129
        minimumResultsForSearch: 10,
130
        allowClear: false,
131
    });
132
133
    // Patron selection triggers
134
    $("#booking_patron_id").on("select2:select", function (e) {
135
        booking_patron = e.params.data;
136
137
        // Fetch pickup locations and enable picker
138
        let $pickupSelect = $("#pickup_library_id");
139
        $.ajax({
126
            url: pickup_url,
140
            url: pickup_url,
127
            delay: 300, // wait 300 milliseconds before triggering the request
141
            type: "GET",
128
            cache: true,
129
            dataType: "json",
142
            dataType: "json",
130
            data: function (params) {
143
            data: {
131
                var search_term = params.term === undefined ? "" : params.term;
144
                _order_by: "name",
132
                var query = {
145
                _per_page: "-1",
133
                    q: JSON.stringify({
146
                patron_id: booking_patron.patron_id,
134
                        name: { "-like": "%" + search_term + "%" },
135
                    }),
136
                    _order_by: "name",
137
                    _page: params.page,
138
                };
139
                query["patron_id"] = booking_patron.patron_id;
140
                return query;
141
            },
147
            },
142
            processResults: function (data) {
148
            success: function (response) {
143
                var results = [];
149
                $pickupSelect.empty();
144
                data.results.forEach(function (pickup_location) {
150
145
                    results.push({
151
                $.each(response, function (index, pickup_location) {
146
                        id: pickup_location.library_id.escapeHtml(),
152
                    let option = $(
147
                        text: pickup_location.name.escapeHtml(),
153
                        '<option value="' +
148
                        needs_override: pickup_location.needs_override,
154
                            pickup_location.library_id +
149
                        pickup_items: pickup_location.pickup_items,
155
                            '">' +
150
                    });
156
                            pickup_location.name +
157
                            "</option>"
158
                    );
159
160
                    option.attr(
161
                        "data-needs_override",
162
                        pickup_location.needs_override
163
                    );
164
                    option.attr(
165
                        "data-pickup_items",
166
                        pickup_location.pickup_items.join(",")
167
                    );
168
169
                    $pickupSelect.append(option);
151
                });
170
                });
152
                return {
171
153
                    results: results,
172
                $pickupSelect.prop("disabled", false);
154
                    pagination: { more: data.pagination.more },
173
                $pickupSelect.val(null).trigger("change");
155
                };
156
            },
174
            },
157
        },
175
            error: function (xhr, status, error) {
158
        templateResult: function (state) {
176
                console.log("Pickup location fetch failed: ", error);
159
            var $text;
177
            },
160
            if (state.needs_override === true) {
178
        });
161
                $text = $(
179
162
                    "<span>" +
180
        // Enable item selection if item data is also fetched
163
                        state.text +
181
        let $bookingItemSelect = $("#booking_item_id");
164
                        '</span> <span style="float:right;" title="' +
182
        $bookingItemSelect.data("patron", true);
165
                        __(
183
        if ($bookingItemSelect.data("loaded")) {
166
                            "This pickup location is not allowed according to circulation rules"
184
            $bookingItemSelect.prop("disabled", false);
167
                        ) +
185
        }
168
                        '"><i class="fa fa-exclamation-circle" aria-hidden="true"></i></span>'
169
                );
170
            } else {
171
                $text = $("<span>" + state.text + "</span>");
172
            }
173
            return $text;
174
        },
175
    });
186
    });
176
187
177
    // Adopt periodPicker
188
    // Adopt periodPicker
Lines 224-238 $("#placeBookingModal").on("show.bs.modal", function (e) { Link Here
224
                    bookings.unshift(booking);
235
                    bookings.unshift(booking);
225
                }
236
                }
226
237
227
                // Item select2
228
                $("#booking_item_id").select2({
229
                    dropdownParent: $(".modal-content", "#placeBookingModal"),
230
                    width: "50%",
231
                    dropdownAutoWidth: true,
232
                    minimumResultsForSearch: 20,
233
                    placeholder: __("Select item"),
234
                });
235
236
                // Update flatpickr mode
238
                // Update flatpickr mode
237
                periodPicker.set("mode", "range");
239
                periodPicker.set("mode", "range");
238
240
Lines 254-263 $("#placeBookingModal").on("show.bs.modal", function (e) { Link Here
254
                            false,
256
                            false,
255
                            false
257
                            false
256
                        );
258
                        );
257
                        newOption.setAttribute(
259
                        newOption.setAttribute("data-available", true);
258
                            "data-available",
259
                            true
260
                        );
261
260
262
                        // Append it to the select
261
                        // Append it to the select
263
                        $("#booking_item_id").append(newOption);
262
                        $("#booking_item_id").append(newOption);
Lines 450-469 $("#placeBookingModal").on("show.bs.modal", function (e) { Link Here
450
                        ? e.params.data.id
449
                        ? e.params.data.id
451
                        : null;
450
                        : null;
452
451
452
                    // Disable invalid pickup locations
453
                    $("#pickup_library_id > option").each(function () {
454
                        let option = $(this);
455
                        if (booking_item_id == 0) {
456
                            option.prop("disabled", false);
457
                        } else {
458
                            let valid_items = String(
459
                                option.data("pickup_items")
460
                            )
461
                                .split(",")
462
                                .map(Number);
463
                            if (
464
                                valid_items.includes(parseInt(booking_item_id))
465
                            ) {
466
                                option.prop("disabled", false);
467
                            } else {
468
                                option.prop("disabled", true);
469
                            }
470
                        }
471
                    });
472
                    $("#pickup_library_id").trigger("change.select2");
473
474
                    // Disable patron selection change
475
                    $("#booking_patron_id").prop("disabled", true);
476
453
                    // redraw pariodPicker taking selected item into account
477
                    // redraw pariodPicker taking selected item into account
454
                    periodPicker.redraw();
478
                    periodPicker.redraw();
455
                });
479
                });
456
480
457
                // Setup listener for pickup location select2
481
                // Setup listener for pickup location select2
458
                $("#pickup_library_id").on("select2:select", function (e) {
482
                $("#pickup_library_id").on("select2:select", function (e) {
459
                    let valid_items = e.params.data.pickup_items;
483
                    let valid_items =
460
                    valid_items.push(0);
484
                        e.params.data.element.dataset.pickup_items.split(",");
485
                    valid_items.push("0");
461
486
462
                    // Disable items not available at the pickup location
487
                    // Disable items not available at the pickup location
463
                    $("#booking_item_id > option").each(function () {
488
                    $("#booking_item_id > option").each(function () {
464
                        let option = $(this);
489
                        let option = $(this);
465
                        let item_id = option.val();
490
                        let item_id = option.val();
466
                        if (valid_items.includes(parseInt(item_id))) {
491
                        if (valid_items.includes(item_id)) {
467
                            option.attr("data-pickup", true);
492
                            option.attr("data-pickup", true);
468
                            if (option.data("available")) {
493
                            if (option.data("available")) {
469
                                option.prop("disabled", false);
494
                                option.prop("disabled", false);
Lines 474-479 $("#placeBookingModal").on("show.bs.modal", function (e) { Link Here
474
                        }
499
                        }
475
                    });
500
                    });
476
                    $("#booking_item_id").trigger("change.select2");
501
                    $("#booking_item_id").trigger("change.select2");
502
503
                    // Disable patron selection change
504
                    $("#booking_patron_id").prop("disabled", true);
477
                });
505
                });
478
506
479
                // Set onChange for flatpickr
507
                // Set onChange for flatpickr
Lines 564-571 $("#placeBookingModal").on("show.bs.modal", function (e) { Link Here
564
                $("#period_fields :input").prop("disabled", false);
592
                $("#period_fields :input").prop("disabled", false);
565
593
566
                // Redraw select with new options and enable
594
                // Redraw select with new options and enable
567
                $("#booking_item_id").trigger("change");
595
                let $bookingItemSelect = $("#booking_item_id");
568
                $("#booking_item_id").prop("disabled", false);
596
                $bookingItemSelect.trigger("change");
597
                $bookingItemSelect.data("loaded", true);
598
                if ($bookingItemSelect.data("patron")) {
599
                    $bookingItemSelect.prop("disabled", false);
600
                }
569
601
570
                // Set the flag to indicate that data has been fetched
602
                // Set the flag to indicate that data has been fetched
571
                dataFetched = true;
603
                dataFetched = true;
572
- 

Return to bug 36120