@@ -, +, @@ client holds on that record the record you placed the hold for "Only item X". Click the red X and click Update hold(s) "Only item ", but no red X for either holds. --- .../prog/en/includes/holds_table.inc | 9 ++++++++ koha-tmpl/intranet-tmpl/prog/js/holds.js | 21 +++++++++++++++++++ reserve/modrequest.pl | 16 +++++++++++++- reserve/request.pl | 11 ++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) --- a/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc @@ -175,6 +175,15 @@ No barcode [%- END -%] + [%- IF hold.change_hold_type_allowed -%] + [%- IF hold.itemtype -%] + Next available [% ItemTypes.GetDescription( hold.itemtype ) | html %] item + [%- ELSE -%] + Next available + [%- END -%] + + + [%- END -%] [%- ELSE -%] [%- IF hold.itemtype -%] --- a/koha-tmpl/intranet-tmpl/prog/js/holds.js +++ a/koha-tmpl/intranet-tmpl/prog/js/holds.js @@ -441,4 +441,25 @@ $(document).ready(function() { window.location.href='request.pl?action=toggleSuspend&reserve_id=' + reserve_id + '&biblionumber=' + biblionumber + '&suspend_until=' + suspend_until; return false; }); + + $("a#change_hold_type_icon").on('click', function(e) { + e.preventDefault(); + let reserve_id = $(this).data('reserve-id'); + let change_type = $("input#change_hold_type_" + reserve_id).val(); + let only_item = $(this).siblings("span:first"); + let only_itemlink = $(this).siblings("a:first"); + let next_available = $(this).siblings("span:last"); + if (change_type==="1") { + $("input#change_hold_type_" + reserve_id).val("0"); + next_available.hide(); + only_itemlink.show(); + only_item.show(); + } else { + $("input#change_hold_type_" + reserve_id).val("1"); + only_itemlink.hide(); + only_item.hide(); + next_available.show(); + } + return false; + }); }); --- a/reserve/modrequest.pl +++ a/reserve/modrequest.pl @@ -94,7 +94,21 @@ else { } else { $_->rethrow; } - } + }; + + if ( $query->param( "change_hold_type_" . $reserve_id[$i] ) ) { + my $hold = Koha::Holds->find( $reserve_id[$i] ); + + try { + $hold->change_type; + } catch { + if ($_->isa('Koha::Exceptions::Hold::CannotChangeHoldType')){ + warn $_; + } else { + $_->rethrow; + } + } + }; } my @biblio_ids = uniq @biblionumber; Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue->new->enqueue( --- a/reserve/request.pl +++ a/reserve/request.pl @@ -593,6 +593,13 @@ if ( ( $findborrower && $borrowernumber_hold || $findclub && $club_hold ) $template->param( always_show_holds => $always_show_holds ); my $show_holds_now = $input->param('show_holds_now'); unless( (defined $always_show_holds && $always_show_holds eq 'DONT') && !$show_holds_now ){ + my $holds_count_per_patron = { map { $_->{borrowernumber} => $_->{hold_count} } + @{ Koha::Holds->search( { biblionumber=> $biblionumber }, { + select => [ "borrowernumber", { count => { distinct => "reserve_id" } } ], + as => [ qw( borrowernumber hold_count ) ], + group_by => [ qw( borrowernumber ) ] } + )->unblessed + } }; my @reserves = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } )->as_list; foreach my $res ( sort { @@ -643,6 +650,10 @@ if ( ( $findborrower && $borrowernumber_hold || $findclub && $club_hold ) $reserve{non_priority} = $res->non_priority(); $reserve{object} = $res; + if ( $holds_count_per_patron->{ $reserve{'borrowernumber'} } == 1 ) { + $reserve{'change_hold_type_allowed'} = 1; + } + push( @reserveloop, \%reserve ); } } --