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

(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batch_modify_holds.tt (-127 / +190 lines)
Lines 118-124 Link Here
118
                            <div id="searchheader" class="searchheader">
118
                            <div id="searchheader" class="searchheader">
119
                                <a id="select_all" href="#" class="btn btn-link"><i class="fa fa-check"></i> Select all visible rows</a>
119
                                <a id="select_all" href="#" class="btn btn-link"><i class="fa fa-check"></i> Select all visible rows</a>
120
                                | <a id="clear_all" href="#" class="btn btn-link"><i class="fa fa-times"></i> Clear selections</a>
120
                                | <a id="clear_all" href="#" class="btn btn-link"><i class="fa fa-times"></i> Clear selections</a>
121
                            </div>
121
                                <div id="table_search_selections" class="btn-group" style="display:none;">
122
                                    <span></span>
123
                                    <a href="#" id="clear-row-selection"><i class="fa fa-times"></i> Clear</a>
124
                                </div>
125
                            </div> <!-- /#searchheader -->
122
                            <h3>Holds found for: <span class="searchpattern"></span></h3>
126
                            <h3>Holds found for: <span class="searchpattern"></span></h3>
123
                            <table id="holds_to_modify"></table>
127
                            <table id="holds_to_modify"></table>
124
                        </div> <!-- /#modify_holds_results -->
128
                        </div> <!-- /#modify_holds_results -->
Lines 188-208 Link Here
188
        let hold_ids = [% IF updated_holds %] [% updated_holds | $raw %] [% ELSE %] [] [% END %];
192
        let hold_ids = [% IF updated_holds %] [% updated_holds | $raw %] [% ELSE %] [] [% END %];
189
193
190
        $(document).ready(function() {
194
        $(document).ready(function() {
195
            //Empty local storage from previous selections
196
            localStorage.removeItem("holds_modify_selections");
197
198
            $("#holds_to_modify").on("change", "input[type='checkbox']", function(){
199
                var holds_modify_selections = JSON.parse(localStorage.getItem("holds_modify_selections")) || [];
200
                var hold_id = $(this).val();
201
                if ($(this).prop("checked")) {
202
                    holds_modify_selections.push($(this).val());
203
                    localStorage.setItem("holds_modify_selections", JSON.stringify(holds_modify_selections));
204
                    showHoldSelections(holds_modify_selections.length);
205
                } else {
206
                    var filtered = holds_modify_selections.filter(function( value ){
207
                        return value !== hold_id;
208
                    });
209
                    if( filtered.length > 0 ){
210
                        localStorage.setItem("holds_modify_selections", JSON.stringify( filtered ));
211
                        holds_modify_selections = filtered;
212
                        showHoldSelections( filtered.length );
213
                    } else {
214
                        holds_modify_selections = [];
215
                        localStorage.removeItem("holds_modify_selections");
216
                        showHoldSelections( 0 );
217
                    }
218
                }
219
            });
191
220
192
            $("#select_all").click(function(e){
221
            $("#select_all").on("click", function(e){
193
                e.preventDefault();
222
                e.preventDefault();
194
                $("#holds_to_modify input[type='checkbox']").each(function(){
223
                $("#holds_to_modify input[type='checkbox']").each(function(){
195
                    $(this).prop("checked", true);
224
                    $(this).prop("checked", true).change();
196
                });
225
                });
197
            });
226
            });
198
227
199
            $("#clear_all").click(function(e){
228
            $("#clear_all").on("click", function(e){
200
                e.preventDefault();
229
                e.preventDefault();
201
                $("#holds_to_modify input[type='checkbox']").each(function(){
230
                $("#holds_to_modify input[type='checkbox']").each(function(){
202
                    $(this).prop("checked", false);
231
                    $(this).prop("checked", false).change();
203
                });
232
                });
204
            });
233
            });
205
234
235
            $("#clear-row-selection").on("click", function (e) {
236
                e.preventDefault();
237
                $("input[type='checkbox']").prop("checked", false).change();
238
                localStorage.removeItem("holds_modify_selections");
239
                $("#table_search_selections").hide();
240
            });
241
206
            $('#modify_holds_form').submit(function() {
242
            $('#modify_holds_form').submit(function() {
207
                var modify_holds_form = $(this);
243
                var modify_holds_form = $(this);
208
                search_holds(modify_holds_form);
244
                search_holds(modify_holds_form);
Lines 217-222 Link Here
217
                $('#edit_search').hide();
253
                $('#edit_search').hide();
218
            });
254
            });
219
255
256
            function prepSelections(){
257
                let holds_modify_selections = JSON.parse( localStorage.getItem("holds_modify_selections") ) || [];
258
                if( holds_modify_selections.length > 0 ){
259
                    showHoldSelections( holds_modify_selections.length );
260
                    $("#holds_to_modify input[type='checkbox']").each(function(){
261
                        var hold_id = $(this).val();
262
                        if( holds_modify_selections.indexOf( hold_id ) >= 0 ){
263
                            $(this).prop("checked", true );
264
                        }
265
                    });
266
                }
267
            }
268
269
            function showHoldSelections( number ){
270
                if (number === 0) {
271
                    $("#table_search_selections").hide();
272
                } else {
273
                    $("#table_search_selections")
274
                        .show()
275
                        .find("span")
276
                        .text(__("Holds selected: %s").format(number));
277
                }
278
            }
279
220
            function search_holds(modify_holds_form){
280
            function search_holds(modify_holds_form){
221
                var table_settings = [% TablesSettings.GetTableSettings( 'circ', 'holds', 'holds_to_modify', 'json' ) | $raw %];
281
                var table_settings = [% TablesSettings.GetTableSettings( 'circ', 'holds', 'holds_to_modify', 'json' ) | $raw %];
222
                var searchpattern = "";
282
                var searchpattern = "";
Lines 308-314 Link Here
308
                            "name": "checkbox",
368
                            "name": "checkbox",
309
                            "orderable": false,
369
                            "orderable": false,
310
                            "render": function(data, type, row, meta) {
370
                            "render": function(data, type, row, meta) {
311
                                return '<input type="checkbox" name="hold_id" value="'+ encodeURIComponent(data) +'"/>'
371
                                return '<input class="selection" type="checkbox" name="hold_id" value="'+ encodeURIComponent(data) +'"/>'
312
                            }
372
                            }
313
                        },
373
                        },
314
                        {
374
                        {
Lines 372-378 Link Here
372
                                } else if( data == "W" ) {
432
                                } else if( data == "W" ) {
373
                                    status = _("Waiting");
433
                                    status = _("Waiting");
374
                                }
434
                                }
375
                                return status;
435
                                return "<span data-found-status='" + escape_str( data ) + "'>" + status + "</span>";
376
                            }
436
                            }
377
                        },
437
                        },
378
                        {
438
                        {
Lines 411-417 Link Here
411
                                return escape_str( data );
471
                                return escape_str( data );
412
                            }
472
                            }
413
                        }
473
                        }
414
                    ]
474
                    ],
475
                    "drawCallback": function( settings ) {
476
                        prepSelections();
477
                    },
415
                }, table_settings, 0, filters);
478
                }, table_settings, 0, filters);
416
479
417
                $(".searchpattern").text(searchpattern);
480
                $(".searchpattern").text(searchpattern);
Lines 439-445 Link Here
439
                if( new_pickup_loc || new_suspend_status ){
502
                if( new_pickup_loc || new_suspend_status ){
440
                    var found = false;
503
                    var found = false;
441
                    holds_checked.each(function(){
504
                    holds_checked.each(function(){
442
                        if($(this).parents("tr").children(".found_status").html() !== "No status"){
505
                        if($(this).parents("tr").children(".found_status").children("span").data("found-status")){
443
                            e.preventDefault();
506
                            e.preventDefault();
444
                            found = true;
507
                            found = true;
445
                        }
508
                        }
Lines 468-598 Link Here
468
531
469
            //Modified holds table
532
            //Modified holds table
470
            var table_settings = [% TablesSettings.GetTableSettings( 'circ', 'holds', 'modified_holds', 'json' ) | $raw %];
533
            var table_settings = [% TablesSettings.GetTableSettings( 'circ', 'holds', 'modified_holds', 'json' ) | $raw %];
471
                var filters = {
534
            var filters = {
472
                    "me.hold_id": function(){
535
                "me.hold_id": function(){
473
                        return {"-in": hold_ids};
536
                    return {"-in": hold_ids};
474
                    }
475
                }
537
                }
538
            }
476
539
477
                var holds_modified_table = $("#modified_holds").kohaTable({
540
            var holds_modified_table = $("#modified_holds").kohaTable({
478
                    "ajax": {
541
                "ajax": {
479
                        "url": "/api/v1/holds"
542
                    "url": "/api/v1/holds"
543
                },
544
                "embed": [
545
                    "biblio",
546
                    "item",
547
                    "pickup_library",
548
                    "patron"
549
                ],
550
                "destroy": true,
551
                "autoWidth": false,
552
                "processing": true,
553
                "columns": [
554
                    {
555
                        "data": "expiration_date",
556
                        "name": "expiration_date",
557
                        "type": "date",
558
                        "title": _("Expiration date"),
559
                        "orderable": true,
560
                        "render": function( data, type, row, meta ) {
561
                            return $date(data);
562
                        }
480
                    },
563
                    },
481
                    "embed": [
564
                    {
482
                        "biblio",
565
                        "data": "biblio.title",
483
                        "item",
566
                        "name": "title",
484
                        "pickup_library",
567
                        "title": _("Title"),
485
                        "patron"
568
                        "orderable": true,
486
                    ],
569
                        "render": function( data, type, row, meta ) {
487
                    "destroy": true,
570
                            return '<a href="/cgi-bin/koha/catalogue/detail.pl?' +
488
                    "autoWidth": false,
571
                            'biblionumber=' + encodeURIComponent( row.biblio_id ) + '">' + escape_str( data ) + '</a>';
489
                    "processing": true,
572
                        }
490
                    "columns": [
573
                    },
491
                        {
574
                    {
492
                            "data": "expiration_date",
575
                        "data": "item.external_id",
493
                            "name": "expiration_date",
576
                        "name": "barcode",
494
                            "type": "date",
577
                        "title": _("Barcode"),
495
                            "title": _("Expiration date"),
578
                        "defaultContent": _(""),
496
                            "orderable": true,
579
                        "orderable": true,
497
                            "render": function( data, type, row, meta ) {
580
                        "render": function( data, type, row, meta ) {
498
                                return $date(data);
581
                            if( row.item ){
499
                            }
582
                                let item_id = encodeURIComponent( row.item_id );
500
                        },
583
                                let biblio_id = encodeURIComponent( row.biblio_id );
501
                        {
584
                                return '<a href="/cgi-bin/koha/catalogue/moredetail.pl?' +
502
                            "data": "biblio.title",
585
                                'itemnumber='+ item_id +'&biblionumber='+ biblio_id +'&' +
503
                            "name": "title",
586
                                'bi='+ biblio_id +'#item'+ item_id +'">' + escape_str( data ) + '</a>'
504
                            "title": _("Title"),
505
                            "orderable": true,
506
                            "render": function( data, type, row, meta ) {
507
                                return '<a href="/cgi-bin/koha/catalogue/detail.pl?' +
508
                                'biblionumber=' + encodeURIComponent( row.biblio_id ) + '">' + escape_str( data ) + '</a>';
509
                            }
510
                        },
511
                        {
512
                            "data": "item.external_id",
513
                            "name": "barcode",
514
                            "title": _("Barcode"),
515
                            "defaultContent": _(""),
516
                            "orderable": true,
517
                            "render": function( data, type, row, meta ) {
518
                                if( row.item ){
519
                                    let item_id = encodeURIComponent( row.item_id );
520
                                    let biblio_id = encodeURIComponent( row.biblio_id );
521
                                    return '<a href="/cgi-bin/koha/catalogue/moredetail.pl?' +
522
                                    'itemnumber='+ item_id +'&biblionumber='+ biblio_id +'&' +
523
                                    'bi='+ biblio_id +'#item'+ item_id +'">' + escape_str( data ) + '</a>'
524
                                }
525
                            }
526
                        },
527
                        {
528
                            "data": "patron_id",
529
                            "name": "patron",
530
                            "title": _("Patron"),
531
                            "orderable": true,
532
                            "render": function( data, type, row, meta ) {
533
                                let patron_to_html = $patron_to_html(row.patron, { url: true, display_cardnumber: true, hide_patron_name });
534
                                return patron_to_html;
535
                            }
536
                        },
537
                        {
538
                            "data": "status",
539
                            "name": "status",
540
                            "className": "found_status",
541
                            "title": _("Status"),
542
                            "orderable": true,
543
                            "render": function( data, type, row, meta ) {
544
                                let status = _("No status");
545
                                if ( data == "T" ) {
546
                                    status = _("In transit");
547
                                } else if( data == "P" ) {
548
                                    status = _("In processing");
549
                                } else if( data == "W" ) {
550
                                    status = _("Waiting");
551
                                }
552
                                return status;
553
                            }
554
                        },
555
                        {
556
                            "data": "pickup_library_id",
557
                            "name": "pickup_library",
558
                            "title": _("Hold pickup library"),
559
                            "orderable": true,
560
                            "render": function( data, type, row, meta ) {
561
                                return escape_str( row.pickup_library.name );
562
                            }
563
                        },
564
                        {
565
                            "data": "suspended",
566
                            "name": "suspended",
567
                            "title": _("Suspended"),
568
                            "orderable": true,
569
                            "render": function( data, type, row, meta ) {
570
                                return data == 0 ? _("No") : _("Yes");
571
                            }
572
                        },
573
                        {
574
                            "data": "suspended_until",
575
                            "name": "suspended_until",
576
                            "title": _("Suspended until"),
577
                            "orderable": true,
578
                            "render": function( data, type, row, meta ) {
579
                                return $date( data );
580
                            }
587
                            }
581
                        },
588
                        }
582
                        {
589
                    },
583
                            "data": "notes",
590
                    {
584
                            "name": "notes",
591
                        "data": "patron_id",
585
                            "title": _("Notes"),
592
                        "name": "patron",
586
                            "orderable": true,
593
                        "title": _("Patron"),
587
                            "render": function( data, type, row, meta ) {
594
                        "orderable": true,
588
                                return escape_str( data );
595
                        "render": function( data, type, row, meta ) {
596
                            let patron_to_html = $patron_to_html(row.patron, { url: true, display_cardnumber: true, hide_patron_name });
597
                            return patron_to_html;
598
                        }
599
                    },
600
                    {
601
                        "data": "status",
602
                        "name": "status",
603
                        "className": "found_status",
604
                        "title": _("Status"),
605
                        "orderable": true,
606
                        "render": function( data, type, row, meta ) {
607
                            let status = _("No status");
608
                            if ( data == "T" ) {
609
                                status = _("In transit");
610
                            } else if( data == "P" ) {
611
                                status = _("In processing");
612
                            } else if( data == "W" ) {
613
                                status = _("Waiting");
589
                            }
614
                            }
615
                            return status;
590
                        }
616
                        }
591
                    ]
617
                    },
592
                }, table_settings, 0, filters);
618
                    {
619
                        "data": "pickup_library_id",
620
                        "name": "pickup_library",
621
                        "title": _("Hold pickup library"),
622
                        "orderable": true,
623
                        "render": function( data, type, row, meta ) {
624
                            return escape_str( row.pickup_library.name );
625
                        }
626
                    },
627
                    {
628
                        "data": "suspended",
629
                        "name": "suspended",
630
                        "title": _("Suspended"),
631
                        "orderable": true,
632
                        "render": function( data, type, row, meta ) {
633
                            return data == 0 ? _("No") : _("Yes");
634
                        }
635
                    },
636
                    {
637
                        "data": "suspended_until",
638
                        "name": "suspended_until",
639
                        "title": _("Suspended until"),
640
                        "orderable": true,
641
                        "render": function( data, type, row, meta ) {
642
                            return $date( data );
643
                        }
644
                    },
645
                    {
646
                        "data": "notes",
647
                        "name": "notes",
648
                        "title": _("Notes"),
649
                        "orderable": true,
650
                        "render": function( data, type, row, meta ) {
651
                            return escape_str( data );
652
                        }
653
                    }
654
                ]
655
            }, table_settings, 0, filters);
593
656
594
                var modified_message = '<div class="alert alert-info">'+hold_ids.length+' hold(s) have been modified!</div>';
657
            var modified_message = '<div class="alert alert-info">'+hold_ids.length+' hold(s) have been modified!</div>';
595
                $("#modified_holds_results-wrapper").prepend(modified_message);
658
            $("#modified_holds_results-wrapper").prepend(modified_message);
596
659
597
        });
660
        });
598
    </script>
661
    </script>
(-)a/tools/batch_modify_holds.pl (-2 / +1 lines)
Lines 67-73 if ( $op eq 'form' ) { Link Here
67
            $hold->branchcode($new_pickup_loc)->store;
67
            $hold->branchcode($new_pickup_loc)->store;
68
        }
68
        }
69
69
70
        if ( $new_suspend_status && !$hold->is_found ) {
70
        if ( $new_suspend_status ne "" && !$hold->is_found ) {
71
            if ($new_suspend_status) {
71
            if ($new_suspend_status) {
72
                $hold->suspend(1)->store;
72
                $hold->suspend(1)->store;
73
                if ($new_suspend_date) {
73
                if ($new_suspend_date) {
74
- 

Return to bug 36135