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

(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/modals/place_booking.inc (-5 / +1 lines)
Lines 33-43 Link Here
33
                            </li>
33
                            </li>
34
                            <li>
34
                            <li>
35
                                <label for="booking_itemtype">Itemtype: </label>
35
                                <label for="booking_itemtype">Itemtype: </label>
36
                                [% SET itemtypes = ItemTypes.Get() %]
36
                                <select id="booking_itemtype" name="booking_itemtype" disabled="disabled">
37
                                <select id="booking_itemtype" name="booking_itemtype" disabled="true">
38
                                    [% FOREACH itemtype IN itemtypes %]
39
                                        <option value="[% itemtype.itemtype | html %]">[% itemtype.description | html%]</option>
40
                                    [% END %]
41
                                </select>
37
                                </select>
42
                            <li>
38
                            <li>
43
                            <label for="booking_item_id">Item: </label>
39
                            <label for="booking_item_id">Item: </label>
(-)a/koha-tmpl/intranet-tmpl/prog/js/modals/place_booking.js (-67 / +93 lines)
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 350-361 $("#placeBookingModal").on("show.bs.modal", function (e) { Link Here
350
362
351
                // Total bookable items
363
                // Total bookable items
352
                let bookable = 0;
364
                let bookable = 0;
353
354
                let itemtypes = new Set();
355
                for (item of bookable_items) {
365
                for (item of bookable_items) {
356
                    bookable++;
366
                    bookable++;
357
367
358
                    // Populate item select (NOTE: Do we still need this check for pre-existing select option here?)
368
                    // Populate item select
359
                    if (
369
                    if (
360
                        !$("#booking_item_id").find(
370
                        !$("#booking_item_id").find(
361
                            "option[value='" + item.item_id + "']"
371
                            "option[value='" + item.item_id + "']"
Lines 378-395 $("#placeBookingModal").on("show.bs.modal", function (e) { Link Here
378
                        $("#booking_item_id").append(newOption);
388
                        $("#booking_item_id").append(newOption);
379
                    }
389
                    }
380
390
381
                    // Build list of itemtypes
391
                    // Populate item types select
382
                    itemtypes.add(item.effective_item_type_id);
392
                    if (
383
                }
393
                        !$("#booking_itemtype").find(
384
394
                            "option[value='" +
385
                // Filter itemtypes
395
                                item.item_type.item_type_id +
386
                $("#booking_itemtype option").each(function () {
396
                                "']"
387
                    const optionValue = $(this).val();
397
                        ).length
388
                    if (!itemtypes.has(optionValue)) {
398
                    ) {
389
                        $(this).remove();
399
                        // Create a DOM Option and de-select by default
400
                        let newTypeOption = new Option(
401
                            escape_str(item.item_type.description),
402
                            item.item_type.item_type_id,
403
                            false,
404
                            false
405
                        );
406
                        $("#booking_itemtype").append(newTypeOption);
390
                    }
407
                    }
391
                });
408
                }
392
                $("#booking_itemtype").trigger("change");
409
                $("#booking_itemtype").val(null).trigger("change");
393
410
394
                // Set disable function for periodPicker
411
                // Set disable function for periodPicker
395
                let disableExists = periodPicker.config.disable.filter(
412
                let disableExists = periodPicker.config.disable.filter(
Lines 572-599 $("#placeBookingModal").on("show.bs.modal", function (e) { Link Here
572
                }
589
                }
573
590
574
                // Setup listener for itemtype select2
591
                // Setup listener for itemtype select2
575
                $("#booking_itemtype").on("select2:select", function (e) {
592
                $("#booking_itemtype").on("change", function (e) {
576
                    booking_itemtype_id = e.params.data.id
593
                    let selectedValue = $(this).val(); // Get selected value (null if cleared)
577
                        ? e.params.data.id
594
                    booking_itemtype_id = selectedValue ? selectedValue : null;
578
                        : null;
595
579
596
                    // Handle item selectionue
580
                    // Disable items not of this itemtype
597
                    if (!booking_itemtype_id) {
581
                    $("#booking_item_id > option").each(function () {
598
                        // Enable all items for selection
582
                        let option = $(this);
599
                        $("#booking_item_id > option").prop("disabled", false);
583
                        if (option.val() != 0) {
600
                    } else {
584
                            let item_itemtype = option.data("itemtype");
601
                        // Disable items not of this itemtype
585
                            if (item_itemtype == booking_itemtype_id) {
602
                        $("#booking_item_id > option").each(function () {
586
                                if (
603
                            let option = $(this);
587
                                    option.data("available") &&
604
                            if (option.val() != 0) {
588
                                    option.data("pickup")
605
                                let item_itemtype = option.data("itemtype");
589
                                ) {
606
                                if (item_itemtype == booking_itemtype_id) {
590
                                    option.prop("disabled", false);
607
                                    if (
608
                                        option.data("available") &&
609
                                        option.data("pickup")
610
                                    ) {
611
                                        option.prop("disabled", false);
612
                                    }
613
                                } else {
614
                                    option.prop("disabled", true);
591
                                }
615
                                }
592
                            } else {
593
                                option.prop("disabled", true);
594
                            }
616
                            }
595
                        }
617
                        });
596
                    });
618
                    }
597
                    $("#booking_item_id").trigger("change.select2");
619
                    $("#booking_item_id").trigger("change.select2");
598
620
599
                    // Update circulation rules
621
                    // Update circulation rules
Lines 671-676 $("#placeBookingModal").on("show.bs.modal", function (e) { Link Here
671
693
672
                    // Disable patron selection change
694
                    // Disable patron selection change
673
                    $("#booking_patron_id").prop("disabled", true);
695
                    $("#booking_patron_id").prop("disabled", true);
696
697
                    pickup_library_id = $("#pickup_library_id").val();
698
699
                    // Populate circulation rules
700
                    getCirculationRules();
674
                });
701
                });
675
702
676
                // Set onChange for flatpickr
703
                // Set onChange for flatpickr
Lines 1230-1236 $("#placeBookingModal").on("hidden.bs.modal", function (e) { Link Here
1230
    $("#booking_item_id").prop("disabled", true);
1257
    $("#booking_item_id").prop("disabled", true);
1231
1258
1232
    // Reset itemtype select
1259
    // Reset itemtype select
1233
    $("#booking_itemtype").val(0).trigger("change");
1260
    $("#booking_itemtype").val(null).trigger("change");
1234
    $("#booking_itemtype").prop("disabled", true);
1261
    $("#booking_itemtype").prop("disabled", true);
1235
    booking_itemtype_id = undefined;
1262
    booking_itemtype_id = undefined;
1236
1263
1237
- 

Return to bug 37354