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

(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-290 / +329 lines)
Lines 542-613 Link Here
542
                <div class="dialog alert hide holdalert">
542
                <div class="dialog alert hide holdalert">
543
                </div>
543
                </div>
544
544
545
                <fieldset class="rows">
545
                [% UNLESS ( multi_hold ) %]
546
                    <legend>Hold details</legend>
547
                    <form action="placerequest.pl" method="post" name="form" id="hold-request-form">
546
                    <form action="placerequest.pl" method="post" name="form" id="hold-request-form">
548
                        [% INCLUDE 'csrf-token.inc' %]
547
                        [% INCLUDE 'csrf-token.inc' %]
549
550
                        <input type="hidden" name="op" value="cud-placerequest" />
548
                        <input type="hidden" name="op" value="cud-placerequest" />
551
                        <input type="hidden" name="borrowernumber" value="[% patron.borrowernumber | html %]" />
549
                        <fieldset class="rows">
552
                        [% FOREACH biblionumber IN biblionumbers %]
550
                            <legend>Hold details</legend>
553
                            <input type="hidden" name="biblionumber" value="[% biblionumber | html %]"/>
551
554
                        [% END %]
552
                            <input type="hidden" name="borrowernumber" value="[% patron.borrowernumber | html %]" />
555
                        [% IF ( multi_hold ) %]
553
                            [% FOREACH biblionumber IN biblionumbers %]
556
                            <input type="hidden" name="multi_holds" id="multi_holds" value="1" />
554
                                <input type="hidden" name="biblionumber" value="[% biblionumber | html %]"/>
557
                            <input type="hidden" name="request" value="any"/>
558
                            [% FOREACH biblioloo IN biblioloop %]
559
                                [% UNLESS biblioloo.none_avail %]
560
                                    <input type="hidden" name="holdable_bibs" id="holdable_bibs" value="[% biblioloo.biblionumber | html %]"/>
561
                                    <input type="hidden" name="title_[% biblioloo.biblionumber | html %]" value="[% biblioloo.title | html %]"/>
562
                                    <input type="hidden" name="rank_[% biblioloo.biblionumber | html %]" value="[% biblioloo.rank | html %]"/>
563
                                [% END %]
564
                            [% END %]
555
                            [% END %]
565
                        [% ELSE %]
556
                                <input type="hidden" name="holdable_bibs" id="holdable_bibs" value="[% biblio.biblionumber | html %]"/>
566
                            <input type="hidden" name="holdable_bibs" id="holdable_bibs" value="[% biblio.biblionumber | html %]"/>
557
                                <input type="hidden" name="title" value="[% biblio.title | html %]" />
567
                            <input type="hidden" name="title" value="[% biblio.title | html %]" />
558
                                <input type="hidden" name="rank-request" value="[% fixedRank | html %]" />
568
                            <input type="hidden" name="rank-request" value="[% fixedRank | html %]" />
569
                        [% END # /IF multi_hold %]
570
559
571
                        <ol>
560
                            <ol>
572
                            <li>
561
                                <li>
573
                                <span class="label">Patron:</span>
562
                                    <span class="label">Patron:</span>
574
                                [% IF ( patron.borrowernumber ) %]
563
                                    [% IF ( patron.borrowernumber ) %]
575
                                    [% INCLUDE 'patron-title.inc' patron => patron no_title => 1 hide_patron_infos_if_needed => 1 %]
564
                                        [% INCLUDE 'patron-title.inc' patron => patron no_title => 1 hide_patron_infos_if_needed => 1 %]
576
                                [% ELSE %]
565
                                    [% ELSE %]
577
                                    Not defined yet
566
                                        Not defined yet
578
                                [% END %]
567
                                    [% END %]
579
                            </li>
568
                                </li>
580
569
581
                            [% UNLESS ( multi_hold ) %]
582
                                <li>
570
                                <li>
583
                                    <span class="label">Estimated priority:</span>
571
                                    <span class="label">Estimated priority:</span>
584
                                    <strong>[% fixedRank | html %]</strong>
572
                                    <strong>[% fixedRank | html %]</strong>
585
                                </li>
573
                                </li>
586
                            [% END %]
587
574
588
                            <li>
575
                                <li>
589
                                <label for="holdnotes">Notes:</label>
576
                                    <label for="holdnotes">Notes:</label>
590
                                <textarea id="holdnotes" name="notes" cols="30" rows="1"></textarea>
577
                                    <textarea id="holdnotes" name="notes" cols="30" rows="1"></textarea>
591
                            </li>
578
                                </li>
592
                            <li>
593
                                <label for="pickup">Pickup at:</label>
594
                            [% UNLESS ( multi_hold ) %]
595
                                <select name="pickup" id="pickup"
596
                                        data-biblio-id="[% biblio.biblionumber | html %]"
597
                                        data-patron-id="[% patron.borrowernumber | html %]"
598
                                        data-pickup-location-source="biblio">
599
                                    [% PROCESS options_for_libraries libraries => Branches.pickup_locations({ search_params => { biblio => biblionumber, patron => patron }, selected => pickup }) %]
600
                            [% ELSE %]
601
                                <select name="pickup" id="pickup_multi" data-patron-id="[% patron.borrowernumber | html %]">
602
                                    <option value="" selected="selected"></option>
603
                                [% FOREACH pickup_location IN multi_pickup_locations %]
604
                                    <option value="[% pickup_location.branchcode | html %]">[% pickup_location.branchname | html %]</option>
605
                                [% END %]
606
                            [% END %]
607
                                </select>
608
                            </li>
609
579
610
                            [% UNLESS ( multi_hold ) %]
611
                                [% IF Koha.Preference('AllowHoldItemTypeSelection') %]
580
                                [% IF Koha.Preference('AllowHoldItemTypeSelection') %]
612
                                    <li>
581
                                    <li>
613
                                        <label for="itemtype">Request specific item type:</label>
582
                                        <label for="itemtype">Request specific item type:</label>
Lines 619-625 Link Here
619
                                        </select>
588
                                        </select>
620
                                    </li>
589
                                    </li>
621
                                [% END %]
590
                                [% END %]
622
                            [% END # /UNLESS multi_hold %]
623
591
624
                            [% IF ( Koha.Preference('AllowHoldDateInFuture') ) %]
592
                            [% IF ( Koha.Preference('AllowHoldDateInFuture') ) %]
625
                                <li>
593
                                <li>
Lines 633-683 Link Here
633
                                <input id="expiration_date" name="expiration_date" id="to" size="10" type="text" class="flatpickr" data-flatpickr-futuredate="true" />
601
                                <input id="expiration_date" name="expiration_date" id="to" size="10" type="text" class="flatpickr" data-flatpickr-futuredate="true" />
634
                            </li>
602
                            </li>
635
603
636
                            [% UNLESS ( multi_hold ) %]
604
                                <li id="non_priority_list_item">
605
                                    <label for="non_priority">Non priority hold:</label>
606
                                    <input name="non_priority" id="non_priority" type="checkbox" />
607
                                    <span class="hint">A non priority hold doesn't prevent a current checkout from renewing</span>
608
                                </li>
637
                                <li>
609
                                <li>
638
                                    <label for="requestany">Hold next available item </label>
610
                                    <label for="holdnotes">Notes:</label>
639
                                    [% IF force_hold_level == 'item' || force_hold_level == 'item_group'  %]
611
                                    <textarea id="holdnotes" name="notes" cols="30" rows="1"></textarea>
640
                                        <input type="checkbox" id="requestany" name="request" disabled="true" />
612
                                </li>
613
                            </ol>
614
                            </fieldset>
615
                            <fieldset class="rows">
616
                                <legend>
617
                                    <label for="requestany" class="inline">
618
                                        Hold next available item
619
                                    </label>
620
                                    [% IF force_hold_level == 'item' || force_hold_level == 'item_group' %]
621
                                        <input type="radio" id="requestany" name="request" disabled="true" />
641
                                    [% ELSIF force_hold_level == 'record' %]
622
                                    [% ELSIF force_hold_level == 'record' %]
642
                                        <input type="checkbox" id="requestany" checked="checked" value="Any" disabled="true"/>
623
                                        <input type="radio" id="requestany" checked="checked" value="Any" disabled="true"/>
643
                                        <input type="hidden" name="request" value="Any"/>
624
                                        <input type="hidden" name="request" value="Any"/>
644
                                    [% ELSE %]
625
                                    [% ELSE %]
645
                                        <input type="checkbox" id="requestany" name="request" checked="checked" value="Any" />
626
                                        <input type="radio" id="requestany" name="request" checked="checked" value="Any" />
646
                                    [% END %]
627
                                    [% END %]
647
                                    <input type="hidden" name="alreadyreserved" value="[% alreadyreserved | html %]" />
628
                                </legend>
648
                                </li>
629
                                <input type="hidden" name="alreadyreserved" value="[% alreadyreserved | html %]" />
630
                                <ol>
649
631
650
                                [% IF remaining_holds_for_record > 1 %]
651
                                    <li>
632
                                    <li>
652
                                        <label for="holds_to_place_count">Holds to place (count)</label>
633
                                        <label for="pickup">Pickup at:</label>
653
                                        <input type="text" inputmode="numeric" pattern="[0-9]*" id="holds_to_place_count" name="holds_to_place_count" maxlength="[% remaining_holds_for_record | html %]" value="1" />
634
                                        <select name="pickup" id="pickup-next-avail"
635
                                                data-biblio-id="[% biblio.biblionumber | html %]"
636
                                                data-patron-id="[% patron.borrowernumber | html %]"
637
                                                data-pickup-location-source="biblio">
638
                                            [% PROCESS options_for_libraries libraries => Branches.pickup_locations({ search_params => { biblio => biblionumber, patron => patron }, selected => pickup }) %]
639
                                        </select>
654
                                    </li>
640
                                    </li>
655
                                [% ELSE %]
656
                                    <input type="hidden" name="holds_to_place_count" value="1" />
657
                                [% END %]
658
                            [% END # /UNLESS multi_hold %]
659
641
660
                            <li id="non_priority_list_item">
642
                                    [% IF Koha.Preference('AllowHoldItemTypeSelection') %]
661
                                <label for="non_priority">Non priority hold:</label>
643
                                        <li>
662
                                <input name="non_priority" id="non_priority" type="checkbox" />
644
                                            <label for="itemtype">Request specific item type:</label>
663
                                <span class="hint">A non priority hold doesn't prevent a current checkout from renewing</span>
645
                                            <select name="itemtype" id="itemtype">
664
                            </li>
646
                                                <option value="">Any item type</option>
665
                        </ol>
647
                                                [%- FOREACH itemtype IN available_itemtypes %]
648
                                                    <option value="[% itemtype | html %]">[% ItemTypes.GetDescription( itemtype ) | html %]</option>
649
                                                [%- END %]
650
                                            </select>
651
                                        </li>
652
                                    [% END %]
653
                                    [% IF remaining_holds_for_record > 1 %]
654
                                        <li>
655
                                            <label for="holds_to_place_count">Holds to place (count)</label>
656
                                            <input type="text" inputmode="numeric" pattern="[0-9]*" id="holds_to_place_count" name="holds_to_place_count" maxlength="[% remaining_holds_for_record | html %]" value="1" />
657
                                        </li>
658
                                    [% ELSE %]
659
                                        <input type="hidden" name="holds_to_place_count" value="1" />
660
                                    [% END %]
661
                                </ol>
662
666
663
667
                        [% UNLESS ( multi_hold ) %]
668
                            <fieldset class="action">
664
                            <fieldset class="action">
669
                                [% IF ( patron.borrowernumber ) %]
665
                                [% IF ( patron.borrowernumber ) %]
670
                                    [% IF ( override_required ) %]
666
                                    [% IF ( override_required ) %]
671
                                        <button type="submit" class="btn btn-primary warning"><i class="fa fa-exclamation-triangle "></i> Place hold</button>
667
                                        <button type="submit" id="hold_any_btn" class="btn btn-primary warning"><i class="fa fa-exclamation-triangle "></i> Place hold</button>
672
                                    [% ELSIF ( none_available ) %]
668
                                    [% ELSIF ( none_available ) %]
673
                                        <button type="submit" disabled="disabled" class="btn btn-primary btn-disabled">Place hold</button>
669
                                        <button type="submit" id="hold_any_btn" disabled="disabled" class="btn btn-primary btn-disabled">Place hold</button>
674
                                    [% ELSE %]
670
                                    [% ELSE %]
675
                                        <button type="submit" class="btn btn-primary">Place hold</button>
671
                                        <button type="submit" id="hold_any_btn" class="btn btn-primary">Place hold</button>
676
                                    [% END %]
672
                                    [% END %]
677
                                [% END %]
673
                                [% END %]
678
                            </fieldset>
674
                            </fieldset>
675
                        </fieldset>
676
677
                        <hr/>
678
679
                        [% biblio = biblioloop.0 %]
680
                        <!-- ItemGroup level holds -->
681
                        [% IF Koha.Preference('EnableItemGroupHolds') && biblio.object.item_groups.count %]
682
                        <fieldset class="rows">
683
                            <legend>
684
                                <label for="requestgrp" class="inline">
685
                                    Hold next available item from an item group
686
                                </label>
687
                                [% IF force_hold_level == 'item_group' %]
688
                                    <input type="radio" class="requestgrp" id="requestgrp" name="request" checked="checked" disabled="true" />
689
                                    <span class="error"><i>(Required)</i></span>
690
                                [% ELSIF force_hold_level == 'item' || force_hold_level == 'record' %]
691
                                    <input type="radio" class="requestgrp" id="requestgrp" name="request" disabled="true" />
692
                                [% ELSE %]
693
                                    <input type="radio" class="requestgrp" id="requestgrp" name="request" />
694
                                [% END %]
695
                            </legend>
696
697
                            [% IF force_hold_level == 'record' # Patron has placed a record level hold previously for this record %]
698
                                <span class="error">
699
                                    <i class="fa fa-times fa-lg" title="Cannot be put on hold"></i>
700
                                    Hold must be record level
701
                                </span>
702
                            [% ELSIF force_hold_level == 'item' # Patron has placed an item level hold previously for this record %]
703
                                <span class="error">
704
                                    <i class="fa fa-times fa-lg" title="Cannot be put on hold"></i>
705
                                    Hold must be item level
706
                                </span>
707
                            [% ELSE %]
708
                                <ul>
709
                                    <li>
710
                                        <label for="pickup">Pickup at:</label>
711
                                        <select name="pickup" id="pickup-item-group"
712
                                                data-biblio-id="[% biblio.biblionumber | html %]"
713
                                                data-patron-id="[% patron.borrowernumber | html %]"
714
                                                data-pickup-location-source="biblio">
715
                                            [% PROCESS options_for_libraries libraries => Branches.pickup_locations({ search_params => { biblio => biblionumber, patron => patron }, selected => pickup }) %]
716
                                        </select>
717
                                    </li>
718
                                    <li>
719
                                        <table id="requestgroup">
720
                                            <thead>
721
                                                <tr>
722
                                                    <th>Hold</th>
723
                                                    <th>Item group</th>
724
                                                    <th>Holdable items</th>
725
                                                </tr>
726
                                            </thead>
727
                                            <tbody>
728
                                                [% FOREACH g IN biblio.object.item_groups.search({}, { order_by => ['display_order'] }) %]
729
                                                    [% IF g.items.count %]
730
                                                        <tr>
731
                                                            <td>
732
                                                                <input id="item_group_id_[% g.id | html %]" class="requestgrp" type="radio" name="item_group_id" value="[% g.id | html %]" />
733
                                                            </td>
734
                                                            <td>
735
                                                                <label for="item_group_id_[% g.id | html %]">[% g.description | html %]</label>
736
                                                            </td>
737
                                                            <td>
738
                                                                [% FOREACH i IN g.items %]
739
                                                                    <div><a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=[% i.biblionumber | uri %]#item[% i.itemnumber | uri %]">[% i.barcode | html %]</a></div>
740
                                                                [% END %]
741
                                                            </td>
742
                                                        </tr>
743
                                                    [% ELSE %]
744
                                                        <tr>
745
                                                            <td>
746
                                                                <input id="item_group_id_[% g.id | html %]" class="requestgrp" type="radio" name="item_group_id" value="[% g.id | html %]" disabled="disabled" />
747
                                                            </td>
748
                                                            <td>
749
                                                                <label for="item_group_id_[% g.id | html %]">[% g.description | html %]</label>
750
                                                            </td>
751
                                                            <td>
752
                                                                <div class="error">No holdable items in this item group.</div>
753
                                                            </td>
754
                                                        </tr>
755
                                                    [% END %]
756
                                                [% END %]
757
                                            </tbody>
758
                                        </table>
759
                                    </li>
760
                                </ul>
761
                            [% END %]
762
                            <button type="submit" id="hold_grp_btn" class="btn btn-primary warning">Place hold</button>
763
                        </fieldset>
764
                        [% END %]
765
                        <!-- /ItemGroup level holds -->
679
766
680
                            [% biblio_info = biblioloop.0 %]
767
768
                        <fieldset class="rows">
769
                            <legend>
770
                                <label class="inline">
771
                                    Place a hold on a specific item
772
                                </label>
773
                                [% IF force_hold_level == 'item' %]
774
                                     <input type="radio" name="request" class="requestspecific" checked="checked" disabled='disabled'/>
775
                                     <span class="error"><em>(Required)</em></span>
776
                                [% ELSIF force_hold_level == 'record' || force_hold_level == 'item_group' %]
777
                                     <input type="radio" name="request" class="requestspecific" disabled='disabled'/>
778
                                [% ELSE %]
779
                                     <input type="radio" name="request" class="requestspecific"/>
780
                                [% END %]
781
                            </legend>
681
782
682
                            <ol>
783
                            <ol>
683
                                [% UNLESS Koha.Preference('item-level_itypes') %]
784
                                [% UNLESS Koha.Preference('item-level_itypes') %]
Lines 695-771 Link Here
695
                                [% END %]
796
                                [% END %]
696
                            </ol>
797
                            </ol>
697
798
698
                            <!-- ItemGroup level holds -->
699
                            [% IF Koha.Preference('EnableItemGroupHolds') && biblio_info.object.item_groups.count %]
700
                                <h2 style="padding: 0 1em;">
701
                                    Hold next available item from an item group
702
                                    [% IF force_hold_level == 'item_group' %]
703
                                        <span class="error"><i>(Required)</i></span>
704
                                    [% END %]
705
                                </h2>
706
707
                                [% IF force_hold_level == 'record' # Patron has placed a record level hold previously for this record %]
708
                                    <span class="error">
709
                                        <i class="fa fa-times fa-lg" title="Cannot be put on hold"></i>
710
                                        Hold must be record level
711
                                    </span>
712
                                [% ELSIF force_hold_level == 'item' # Patron has placed an item level hold previously for this record %]
713
                                    <span class="error">
714
                                        <i class="fa fa-times fa-lg" title="Cannot be put on hold"></i>
715
                                        Hold must be item level
716
                                    </span>
717
                                [% ELSE %]
718
                                    <table>
719
                                        <thead>
720
                                            <tr>
721
                                                <th>Hold</th>
722
                                                <th>Item group</th>
723
                                                <th>Holdable items</th>
724
                                            </tr>
725
                                        </thead>
726
                                        <tbody>
727
                                            [% FOREACH g IN biblio_info.object.item_groups.search({}, { order_by => ['display_order'] }) %]
728
                                                [% IF g.items.count %]
729
                                                    <tr>
730
                                                        <td>
731
                                                            <input id="item_group_id_[% g.id | html %]" type="radio" name="item_group_id" value="[% g.id | html %]" />
732
                                                        </td>
733
                                                        <td>
734
                                                            <label for="item_group_id_[% g.id | html %]">[% g.description | html %]</label>
735
                                                        </td>
736
                                                        <td>
737
                                                            [% FOREACH i IN g.items %]
738
                                                                <div><a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=[% i.biblionumber | uri %]#item[% i.itemnumber | uri %]">[% i.barcode | html %]</a></div>
739
                                                            [% END %]
740
                                                        </td>
741
                                                    </tr>
742
                                                [% ELSE %]
743
                                                    <tr>
744
                                                        <td>
745
                                                            <input id="item_group_id_[% g.id | html %]" type="radio" name="item_group_id" value="[% g.id | html %]" disabled="disabled" />
746
                                                        </td>
747
                                                        <td>
748
                                                            <label for="item_group_id_[% g.id | html %]">[% g.description | html %]</label>
749
                                                        </td>
750
                                                        <td>
751
                                                            <div class="error">No holdable items in this item group.</div>
752
                                                        </td>
753
                                                    </tr>
754
                                                [% END %]
755
                                            [% END %]
756
                                        </tbody>
757
                                    </table>
758
                                [% END %]
759
                            [% END %]
760
                            <!-- /ItemGroup level holds -->
761
762
                            <h2 style="padding: 0 1em;">
763
                                Place a hold on a specific item
764
                                [% IF force_hold_level == 'item' %]
765
                                     <span class="error"><em>(Required)</em></span>
766
                                [% END %]
767
                            </h2>
768
769
                            <table id="requestspecific">
799
                            <table id="requestspecific">
770
                                <thead>
800
                                <thead>
771
                                    <tr>
801
                                    <tr>
Lines 808-816 Link Here
808
                                                            Hold must be item group level
838
                                                            Hold must be item group level
809
                                                        </span>
839
                                                        </span>
810
                                                    [% ELSIF ( itemloo.available ) %]
840
                                                    [% ELSIF ( itemloo.available ) %]
811
                                                        <input type="[% reserve_input_type | html %]" name="checkitem" value="[% itemloo.itemnumber | html %]" />
841
                                                        <input type="[% reserve_input_type | html %]" name="checkitem" class="requestspecific" value="[% itemloo.itemnumber | html %]" />
812
                                                    [% ELSIF ( itemloo.override ) %]
842
                                                    [% ELSIF ( itemloo.override ) %]
813
                                                        <input type="[% reserve_input_type | html %]" name="checkitem" class="needsoverride" value="[% itemloo.itemnumber | html %]" />
843
                                                        <input type="[% reserve_input_type | html %]" name="checkitem" class="needsoverride requestspecific" value="[% itemloo.itemnumber | html %]" />
814
                                                        <i class="fa fa-exclamation-triangle fa-lg" style="color:gold" title="Requires override of hold policy"/></i>
844
                                                        <i class="fa fa-exclamation-triangle fa-lg" style="color:gold" title="Requires override of hold policy"/></i>
815
                                                    [% ELSE %]
845
                                                    [% ELSE %]
816
                                                        <span class="error">
846
                                                        <span class="error">
Lines 855-861 Link Here
855
                                                </td>
885
                                                </td>
856
                                                <td>
886
                                                <td>
857
                                                [% IF (itemloo.pickup_locations_count > 0) || Koha.Preference('AllowHoldPolicyOverride') %]
887
                                                [% IF (itemloo.pickup_locations_count > 0) || Koha.Preference('AllowHoldPolicyOverride') %]
858
                                                    <select name="item_pickup_[% itemloo.itemnumber | html %]" class="pickup_locations" style="width:100%;"
888
                                                    <select name="item_pickup_[% itemloo.itemnumber | html %]" class="pickup_locations requestspecific" style="width:100%;"
859
                                                            data-item-id="[% itemloo.itemnumber | html %]"
889
                                                            data-item-id="[% itemloo.itemnumber | html %]"
860
                                                            data-patron-id="[% patron.borrowernumber | html %]"
890
                                                            data-patron-id="[% patron.borrowernumber | html %]"
861
                                                            data-pickup-location-source="item">
891
                                                            data-pickup-location-source="item">
Lines 981-1077 Link Here
981
                            [% END # /IF hiddencount %]
1011
                            [% END # /IF hiddencount %]
982
1012
983
                        [% ELSE # /UNLESS multi_hold %]
1013
                        [% ELSE # /UNLESS multi_hold %]
984
1014
                            <fieldset class="rows">
985
                            <table id="requesttitles">
1015
                                <legend>Hold details</legend>
986
                                <tr>
1016
                                <form action="placerequest.pl" method="post" name="form" id="hold-request-form">
987
                                    <th>&nbsp;</th>
1017
                                        <input type="hidden" name="multi_holds" id="multi_holds" value="1" />
988
                                    <th>Pickup location</th>
1018
                                        <input type="hidden" name="request" value="any"/>
989
                                    <th>Title</th>
1019
                                    <input type="hidden" name="borrowernumber" value="[% patron.borrowernumber | html %]" />
990
                                    [% UNLESS Koha.Preference('item-level_itypes') %]
1020
                                        [% FOREACH biblioloo IN biblioloop %]
991
                                        <th>Item type</th>
1021
                                            <input type="hidden" name="biblionumber" id="biblionumber" value="[% biblioloo.biblionumber | html %]"/>
992
                                    [% END %]
1022
                                            [% UNLESS biblioloo.none_avail %]
993
                                    <th>Priority</th>
1023
                                                <input type="hidden" name="holdable_bibs" id="holdable_bibs" value="[% biblioloo.biblionumber | html %]"/>
994
                                    <th>Information</th>
1024
                                                <input type="hidden" name="title_[% biblioloo.biblionumber | html %]" value="[% biblioloo.title | html %]"/>
995
                                </tr>
1025
                                                <input type="hidden" name="rank_[% biblioloo.biblionumber | html %]" value="[% biblioloo.rank | html %]"/>
996
                                [% FOREACH biblioloo IN biblioloop %]
997
                                    [% IF ( biblioloo.warn ) %]
998
                                        <tr class="onissue">
999
                                    [% ELSE %]
1000
                                        <tr>
1001
                                    [% END %]
1002
                                        <td>
1003
                                            [% UNLESS ( biblioloo.warn ) %]
1004
                                                <input class="multi_hold_item_checkbox" type="checkbox" checked="checked" title="[% biblioloo.biblionumber | html %]"/>
1005
                                            [% END %]
1006
                                        </td>
1007
                                        <td>
1008
                                            [% UNLESS ( biblioloo.none_avail || biblioloo.noitems ) %]
1009
                                                <select name="pickup_[% biblioloo.biblionumber | html %]"
1010
                                                        class="multi_pickup_select"
1011
                                                        data-biblio-id="[% biblioloo.biblionumber | html %]"
1012
                                                        data-patron-id="[% patron.borrowernumber | html %]"
1013
                                                        data-pickup-locations='[% biblioloo.pickup_locations_codes.json | $raw %]'>
1014
                                                    <option value=""></option>
1015
                                                    [% FOREACH pickup_location IN biblioloo.pickup_locations %]
1016
                                                        <option value="[% pickup_location.branchcode | html %]">[% pickup_location.branchname | html %]</option>
1017
                                                    [% END %]
1018
                                                </select>
1019
                                            [% END %]
1026
                                            [% END %]
1020
                                        </td>
1027
                                        [% END %]
1021
                                        <td>
1028
1022
                                            <ul>
1029
                                <table id="requesttitles">
1023
                                                <li>
1030
                                    <tr>
1024
                                                    <a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% biblioloo.biblionumber | uri %]">[% biblioloo.title | html %]</a>
1031
                                        <th>&nbsp;</th>
1025
                                                    [% IF biblioloo.author %] by [% biblioloo.author | html %][% END %]
1032
                                        <th>Pickup location</th>
1026
                                                </li>
1033
                                        <th>Title</th>
1027
                                                [% IF ( biblioloo.publicationyear ) %]
1034
                                        [% UNLESS Koha.Preference('item-level_itypes') %]
1035
                                            <th>Item type</th>
1036
                                        [% END %]
1037
                                        <th>Priority</th>
1038
                                        <th>Information</th>
1039
                                    </tr>
1040
                                    [% FOREACH biblioloo IN biblioloop %]
1041
                                        [% IF ( biblioloo.warn ) %]
1042
                                            <tr class="onissue">
1043
                                        [% ELSE %]
1044
                                            <tr>
1045
                                        [% END %]
1046
                                            <td>
1047
                                                [% UNLESS ( biblioloo.warn ) %]
1048
                                                    <input class="multi_hold_item_checkbox" type="checkbox" checked="checked" title="[% biblioloo.biblionumber | html %]"/>
1049
                                                [% END %]
1050
                                            </td>
1051
                                            <td>
1052
                                                [% UNLESS ( biblioloo.none_avail || biblioloo.noitems ) %]
1053
                                                    <select name="pickup_[% biblioloo.biblionumber | html %]"
1054
                                                            class="multi_pickup_select"
1055
                                                            data-biblio-id="[% biblioloo.biblionumber | html %]"
1056
                                                            data-patron-id="[% patron.borrowernumber | html %]"
1057
                                                            data-pickup-locations='[% biblioloo.pickup_locations_codes.json | $raw %]'>
1058
                                                        <option value=""></option>
1059
                                                        [% FOREACH pickup_location IN biblioloo.pickup_locations %]
1060
                                                            <option value="[% pickup_location.branchcode | html %]">[% pickup_location.branchname | html %]</option>
1061
                                                        [% END %]
1062
                                                    </select>
1063
                                                [% END %]
1064
                                            </td>
1065
                                            <td>
1066
                                                <ul>
1028
                                                    <li>
1067
                                                    <li>
1029
                                                        <span class="label">Publication year:</span> [% biblioloo.publicationyear | html %]
1068
                                                        <a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% biblioloo.biblionumber | uri %]">[% biblioloo.title | html %]</a>
1069
                                                        [% IF biblioloo.author %] by [% biblioloo.author | html %][% END %]
1030
                                                    </li>
1070
                                                    </li>
1071
                                                    [% IF ( biblioloo.publicationyear ) %]
1072
                                                        <li>
1073
                                                            <span class="label">Publication year:</span> [% biblioloo.publicationyear | html %]
1074
                                                        </li>
1075
                                                    [% END %]
1076
                                                </ul>
1077
                                                [% IF ( biblioloo.warn ) %]
1078
                                                    <span class="not_holdable" title="[% biblioloo.biblionumber | html %]"></span>
1031
                                                [% END %]
1079
                                                [% END %]
1032
                                            </ul>
1033
                                            [% IF ( biblioloo.warn ) %]
1034
                                                <span class="not_holdable" title="[% biblioloo.biblionumber | html %]"></span>
1035
                                            [% END %]
1036
                                        </td>
1037
                                        [% UNLESS Koha.Preference('item-level_itypes') %]
1038
                                            <td>
1039
                                                <img src="[% biblioloo.itemtype.image_location | html %]" alt="[% biblioloo.itemtype.translated_description | html %]" title="[% biblioloo.itemtype.translated_description | html %]" />
1040
                                            </td>
1080
                                            </td>
1041
                                        [% END %]
1081
                                            [% UNLESS Koha.Preference('item-level_itypes') %]
1042
                                        <td>[% biblioloo.rank | html %]</td>
1082
                                                <td>
1043
                                        <td>
1083
                                                    <img src="[% biblioloo.itemtype.image_location | html %]" alt="[% biblioloo.itemtype.translated_description | html %]" title="[% biblioloo.itemtype.translated_description | html %]" />
1044
                                            [% IF ( biblioloo.checked_previously ) %]
1084
                                                </td>
1045
                                                <span>Patron has previously checked out this title</span><br/>
1046
                                            [% END %]
1085
                                            [% END %]
1047
                                            [% IF ( biblioloo.alreadyres ) %]
1086
                                            <td>[% biblioloo.rank | html %]</td>
1048
                                                <ul>
1087
                                            <td>
1049
                                            [% ELSE %]
1088
                                                [% IF ( biblioloo.checked_previously ) %]
1050
                                                [% IF ( biblioloo.none_avail || biblioloo.noitems ) %]
1089
                                                    <span>Patron has previously checked out this title</span><br/>
1090
                                                [% END %]
1091
                                                [% IF ( biblioloo.alreadyres ) %]
1051
                                                    <ul>
1092
                                                    <ul>
1093
                                                [% ELSE %]
1094
                                                    [% IF ( biblioloo.none_avail || biblioloo.noitems ) %]
1095
                                                        <ul>
1096
                                                    [% END %]
1052
                                                [% END %]
1097
                                                [% END %]
1053
                                            [% END %]
1054
1055
                                            [% IF ( biblioloo.alreadyres ) %]
1056
                                            <li>
1057
                                                [% INCLUDE 'patron-title.inc' patron => patron no_title => 1 no_cardnumber => 1 hide_patron_infos_if_needed => 1 %] <strong>already has a hold</strong> on this item
1058
                                            </li>
1059
                                            [% END %]
1060
                                            [% IF ( biblioloo.none_avail || biblioloo.noitems ) %]
1061
                                                <li> <strong>No items are available</strong> to be placed on hold</li>
1062
                                            [% END %]
1063
1098
1064
                                            [% IF ( biblioloo.alreadyres ) %]
1099
                                                [% IF ( biblioloo.alreadyres ) %]
1065
                                                </ul>
1100
                                                <li>
1066
                                            [% ELSE %]
1101
                                                    [% INCLUDE 'patron-title.inc' patron => patron no_title => 1 no_cardnumber => 1 hide_patron_infos_if_needed => 1 %] <strong>already has a hold</strong> on this item
1102
                                                </li>
1103
                                                [% END %]
1067
                                                [% IF ( biblioloo.none_avail || biblioloo.noitems ) %]
1104
                                                [% IF ( biblioloo.none_avail || biblioloo.noitems ) %]
1105
                                                    <li> <strong>No items are available</strong> to be placed on hold</li>
1106
                                                [% END %]
1107
1108
                                                [% IF ( biblioloo.alreadyres ) %]
1068
                                                    </ul>
1109
                                                    </ul>
1110
                                                [% ELSE %]
1111
                                                    [% IF ( biblioloo.none_avail || biblioloo.noitems ) %]
1112
                                                        </ul>
1113
                                                    [% END %]
1069
                                                [% END %]
1114
                                                [% END %]
1070
                                            [% END %]
1115
                                            </td>
1071
                                        </td>
1116
                                        </tr>
1072
                                    </tr>
1117
                                    [% END # /FOREACH biblioloo %]
1073
                                [% END # /FOREACH biblioloo %]
1118
                                </table> <!-- /#requesttitles -->
1074
                            </table> <!-- /#requesttitles -->
1119
                            </fieldset>
1075
1120
1076
                        [% END # /UNLESS multi_hold %]
1121
                        [% END # /UNLESS multi_hold %]
1077
1122
Lines 1079-1105 Link Here
1079
                            [% IF ( patron AND patron.borrowernumber ) %]
1124
                            [% IF ( patron AND patron.borrowernumber ) %]
1080
                                [% IF ( multi_hold ) %]
1125
                                [% IF ( multi_hold ) %]
1081
                                    [% IF ( override_required ) %]
1126
                                    [% IF ( override_required ) %]
1082
                                        <button type="submit" class="btn btn-primary warning"><i class="fa fa-exclamation-triangle "></i> Place holds</button>
1127
                                        <button type="submit" id="hold_multi_btn" class="btn btn-primary warning"><i class="fa fa-exclamation-triangle "></i> Place holds</button>
1083
                                    [% ELSIF ( no_bibs_available ) %]
1128
                                    [% ELSIF ( no_bibs_available ) %]
1084
                                        <button type="submit" class="btn btn-primary btn-disabled" disabled="disabled">Place holds</button>
1129
                                        <button type="submit" id="hold_multi_btn" class="btn btn-primary btn-disabled" disabled="disabled">Place holds</button>
1085
                                    [% ELSIF ( none_available ) %]
1130
                                    [% ELSIF ( none_available ) %]
1086
                                        <button type="submit" class="btn btn-primary">Place holds</button>
1131
                                        <button type="submit" id="hold_multi_btn" class="btn btn-primary">Place holds</button>
1087
                                    [% ELSE %]
1132
                                    [% ELSE %]
1088
                                        <button type="submit" class="btn btn-primary" id="multi_hold_submit">Place holds</button>
1133
                                        <button type="submit" id="hold_multi_btn" class="btn btn-primary" id="multi_hold_submit">Place holds</button>
1089
                                    [% END %]
1134
                                    [% END %]
1090
                                [% ELSE %]
1135
                                [% ELSE %]
1091
                                    [% IF ( override_required ) %]
1136
                                    [% IF ( override_required ) %]
1092
                                        <button type="submit" class="btn btn-primary warning"><i class="fa fa-exclamation-triangle "></i> Place hold</button>
1137
                                        <button type="submit" id="hold_item_btn" class="btn btn-primary warning"><i class="fa fa-exclamation-triangle "></i> Place hold</button>
1093
                                    [% ELSIF ( none_available ) %]
1138
                                    [% ELSIF ( none_available ) %]
1094
                                        <button type="submit" class="btn btn-primary btn-disabled" disabled="disabled">Place hold</button>
1139
                                        <button type="submit" id="hold_item_btn" class="btn btn-primary btn-disabled" disabled="disabled">Place hold</button>
1095
                                    [% ELSE %]
1140
                                    [% ELSE %]
1096
                                        <button type="submit" class="btn btn-primary">Place hold</button>
1141
                                        <button type="submit" id="hold_item_btn" class="btn btn-primary">Place hold</button>
1097
                                    [% END %]
1142
                                    [% END %]
1098
                                [% END %]
1143
                                [% END %]
1099
                            [% END # /IF patron %]
1144
                            [% END # /IF patron %]
1100
                        </fieldset> <!-- /.action -->
1145
                        </fieldset> <!-- /.action -->
1101
                    </form> <!-- /#hold-request-form -->
1146
                    </fieldset> <!-- /.rows -->
1102
                </fieldset> <!-- /.rows -->
1147
                </form> <!-- /#hold-request-form -->
1103
            [% END %]
1148
            [% END %]
1104
1149
1105
            [% UNLESS ( patron ) %]
1150
            [% UNLESS ( patron ) %]
Lines 1440-1460 Link Here
1440
            }
1485
            }
1441
1486
1442
1487
1443
            function ToggleHoldsToPlace() {
1444
                if ( $("#requestany").prop('checked') ) {
1445
                    $("#holds_to_place_count").prop('disabled', false);
1446
                } else {
1447
                    $("#holds_to_place_count").prop('disabled', true);
1448
                }
1449
            }
1450
            ToggleHoldsToPlace();
1488
            ToggleHoldsToPlace();
1451
            $("#requestany").on('change', function(){
1489
            $("#requestany,.requestspecific[name='request'],.requestgrp").on('change', function(){
1452
                ToggleHoldsToPlace();
1490
                ToggleHoldsToPlace();
1453
            });
1491
            });
1454
1492
1455
            [% IF Koha.Preference('UseBranchTransferLimits') %]
1493
            [% IF Koha.Preference('UseBranchTransferLimits') %]
1456
                $("#pickup").on('change', function(){
1494
                $("#pickup,#pickup-next-avail,#pickup-item-group").on('change', function(){
1457
                    var pickup = $("#pickup").val();
1495
                    var pickup = $(this).val();
1458
                    var url = "?pickup=" + pickup;
1496
                    var url = "?pickup=" + pickup;
1459
                    url += "&borrowernumber=" + borrowernumber;
1497
                    url += "&borrowernumber=" + borrowernumber;
1460
                    url += "&biblionumber=" + biblionumbers[0];
1498
                    url += "&biblionumber=" + biblionumbers[0];
Lines 1467-1478 Link Here
1467
                "dom": '<"top pager"ilf>t',
1505
                "dom": '<"top pager"ilf>t',
1468
            }));
1506
            }));
1469
1507
1470
            //Override fieldset styling for dataTables search box
1471
            $("div.top.pager").css("margin-left","1em");
1472
            $(".dataTables_filter label").css({
1473
                "width":"auto",
1474
                "margin-right":"0em"
1475
            });
1476
1508
1477
            $("#club-request-form").on("submit", function() {
1509
            $("#club-request-form").on("submit", function() {
1478
                let $t = $(this);
1510
                let $t = $(this);
Lines 1565-1571 Link Here
1565
                }
1597
                }
1566
            });
1598
            });
1567
1599
1568
            $("#pickup").each( function () {
1600
            $("#pickup,#pickup-item-group,#pickup-next-avail").each( function () {
1569
                $(this).pickup_locations_dropdown();
1601
                $(this).pickup_locations_dropdown();
1570
            });
1602
            });
1571
1603
Lines 1574-1592 Link Here
1574
            });
1606
            });
1575
        });
1607
        });
1576
1608
1609
        function ToggleHoldsToPlace() {
1610
            if ( $("#requestany").prop('checked') ) {
1611
                $("#holds_to_place_count, #pickup-next-avail, #itemtype, #hold_any_btn").prop('disabled', false);
1612
                $(".requestspecific,.requestgrp").prop('checked', false);
1613
                $(".requestspecific","#requestspecific").prop('disabled',true);
1614
                $("#hold_item_btn, #hold_grp_btn, #pickup-item-group").prop("disabled", true );
1615
                $("#hold_any_btn").prop("disabled", false );
1616
            } else if( $(".requestspecific").prop('checked') ) {
1617
                $(".requestspecific","#requestspecific").prop('disabled',false);
1618
                $("#holds_to_place_count, #pickup-item-group, #pickup-next-avail #itemtype, #hold_any_btn").prop('disabled', true);
1619
                $("#hold_item_btn").prop("disabled", false );
1620
                $("#hold_any_btn,#hold_grp_btn").prop("disabled", true );
1621
                $("#requestany,.requestgrp").prop('checked', false);
1622
            } else {
1623
                $("#holds_to_place_count, #pickup-next-avail, #itemtype, #hold_any_btn").prop('disabled', true);
1624
                $("#hold_grp_btn, #pickup-item-group").prop("disabled", false );
1625
                $(".requestspecific","#requestspecific").prop('disabled',true);
1626
                $("#hold_any_btn,#hold_item_btn").prop("disabled", true );
1627
                $("#requestany,.requestspecific").prop('checked', false);
1628
            }
1629
        }
1630
1577
        function check( e, table ) {
1631
        function check( e, table ) {
1578
1632
1579
            var msg = "";
1633
            var msg = "";
1580
1634
1581
            if ( ! $("#requestany").is(":checked") ) {
1635
            if ( $(".requestspecific").is(":checked") ) {
1582
                // requestany not selected, go through the item-specific cases
1636
                // requestany not selected, go through the item-specific cases
1583
                if ( $('input[name="checkitem"]:checked').length > 0 ) {
1637
                var selected_items = $('#requestspecific input[name="checkitem"]:checked');
1638
                if ( selected_items.length > 0 ) {
1584
                    // got item-specific hold requests in the form!
1639
                    // got item-specific hold requests in the form!
1585
                    // verify they have a pickup location selected
1640
                    // verify they have a pickup location selected
1586
1641
1587
                    if (table.find('input[name="checkitem"]:checked')
1642
                    if ( selected_items.closest('tr').find(".pickup_locations").val() == '' ) {
1588
                                .closest('tr')
1589
                                .find(".pickup_locations").val() === null) {
1590
1643
1591
                        msg = _("- Please select a pickup location for the item" + "\n")
1644
                        msg = _("- Please select a pickup location for the item" + "\n")
1592
                    }
1645
                    }
Lines 1594-1601 Link Here
1594
                else {
1647
                else {
1595
                    msg = (_("- Please select an item to place a hold") + "\n");
1648
                    msg = (_("- Please select an item to place a hold") + "\n");
1596
                }
1649
                }
1650
            } else if ( $("#requestgrp").is(":checked") ) {
1651
                var selected_group = $('#requestgroup input[type="radio"]:checked');
1652
                if( selected_group.length > 0 ){
1653
                    if( $("#pickup-item-group").length < 1 || $("#pickup-item-grp").val() == "" ){
1654
                        msg = _("- Please select a pickup location for this hold" + "\n");
1655
                    }
1656
                } else {
1657
                    msg = (_("- Please select an item group to place a hold") + "\n");
1658
                }
1597
            } else {
1659
            } else {
1598
                if( $("#pickup").length < 1 || $("#pickup").val() == "" || $('#pickup').val() === null ){
1660
                // Requesting next available
1661
                if( $("#pickup-next-avail").length < 1 || $("#pickup-next-avail").val() == "" || $('#pickup-next-avail').val() === null ){
1599
                    msg = _("- Please select a pickup location for this hold" + "\n");
1662
                    msg = _("- Please select a pickup location for this hold" + "\n");
1600
                }
1663
                }
1601
            }
1664
            }
Lines 1667-1696 Link Here
1667
            $("button.warning").click(function() {
1730
            $("button.warning").click(function() {
1668
                return confirm( _("None of these items can normally be put on hold for this patron.") + "\n\n" + _("Place hold?") );
1731
                return confirm( _("None of these items can normally be put on hold for this patron.") + "\n\n" + _("Place hold?") );
1669
            });
1732
            });
1670
            $("#requestany").click(function() {
1671
                if(this.checked){
1672
                    $("input[name=checkitem]").each(function() {
1673
                        $(this).prop("checked", false);
1674
                    });
1675
                }
1676
            });
1677
            $("input[name=checkitem]").click(function() {
1678
                let onechecked = 0;
1679
                $("input[name=checkitem]").each(function() {
1680
                    if(this.checked){
1681
                        onechecked++;
1682
                    }
1683
                });
1684
                if(onechecked > 0){
1685
                    $("#requestany").prop("checked", false);
1686
                    $("#holds_to_place_count").prop('disabled', true);
1687
1688
                    $("#holds_to_place_count").val(onechecked);
1689
                } else {
1690
                    $("#requestany").prop("checked",true);
1691
                    $("#holds_to_place_count").prop('disabled', false);
1692
                }
1693
            });
1694
            var prev_rank_request;
1733
            var prev_rank_request;
1695
            $("select[name=rank-request]").on("focus", function() {
1734
            $("select[name=rank-request]").on("focus", function() {
1696
                prev_rank_request = $(this).val();
1735
                prev_rank_request = $(this).val();
(-)a/reserve/placerequest.pl (-2 / +2 lines)
Lines 50-55 my $expirationdate = $input->param('expiration_date'); Link Here
50
my $itemtype       = $input->param('itemtype') || undef;
50
my $itemtype       = $input->param('itemtype') || undef;
51
my $non_priority   = $input->param('non_priority');
51
my $non_priority   = $input->param('non_priority');
52
my $op             = $input->param('op') || q{};
52
my $op             = $input->param('op') || q{};
53
my $multi_holds    = $input->param('multi_holds');
53
54
54
my $patron = Koha::Patrons->find( $borrowernumber );
55
my $patron = Koha::Patrons->find( $borrowernumber );
55
56
Lines 110-116 if ( $op eq 'cud-placerequest' && $patron ) { Link Here
110
                }
111
                }
111
            }
112
            }
112
113
113
        } elsif (@biblionumbers > 1) {
114
        } elsif (@biblionumbers > 1 || $multi_holds) {
114
            my $bibinfo = $bibinfos{$biblionumber};
115
            my $bibinfo = $bibinfos{$biblionumber};
115
            if ( $can_override || CanBookBeReserved($patron->borrowernumber, $biblionumber)->{status} eq 'OK' ) {
116
            if ( $can_override || CanBookBeReserved($patron->borrowernumber, $biblionumber)->{status} eq 'OK' ) {
116
                AddReserve(
117
                AddReserve(
117
- 

Return to bug 30579