From 1f448a9938c7bde154b4487d5c06244757a564cf Mon Sep 17 00:00:00 2001 From: Lucas Gass Date: Mon, 13 Jan 2025 21:08:02 +0000 Subject: [PATCH] Bug 37334: Add ability to filter by in_bundle Signed-off-by: Emmi Takkinen --- Koha/Item.pm | 4 +++- Koha/Items.pm | 21 +++++++++++++++++++ .../tables/items/catalogue_detail.inc | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Koha/Item.pm b/Koha/Item.pm index 69a8c735188..e76e2c1f7cd 100644 --- a/Koha/Item.pm +++ b/Koha/Item.pm @@ -1477,7 +1477,9 @@ sub _status { push @statuses, 'restricted'; } - # TODO in_bundle? + if ( $self->in_bundle ) { + push @statuses, 'in_bundle'; + } return join ',', @statuses; } diff --git a/Koha/Items.pm b/Koha/Items.pm index a4c2c3dfb3c..f5e7b2c55c3 100644 --- a/Koha/Items.pm +++ b/Koha/Items.pm @@ -317,6 +317,24 @@ sub filter_by_has_recalls { return $self->search( { 'me.itemnumber' => { '-in' => $recalls } } ); } +=head3 filter_by_in_bundle + +Returns a new resultset, containing only those items that currently are part of a bundle. + +=cut + +sub filter_by_in_bundle { + my ($self) = @_; + + my @in_bundle_items; + while ( my $item = $self->next ) { + push @in_bundle_items, $item if $item->in_bundle; + } + + my @bundled_items = map { $_->itemnumber } @in_bundle_items; + return $self->search( { 'me.itemnumber' => { '-in' => \@bundled_items } } ); +} + =head3 filter_by_available my $available_items = $items->filter_by_available; @@ -658,6 +676,9 @@ sub search { if ( $status eq 'recalled' ) { $self = $self->filter_by_has_recalls; } + if ( $status eq 'in_bundle' ) { + $self = $self->filter_by_in_bundle; + } if ( $status eq 'available' ) { $self = $self->filter_by_available; diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers/tables/items/catalogue_detail.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers/tables/items/catalogue_detail.inc index 5ff3bec2214..80803b86075 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers/tables/items/catalogue_detail.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers/tables/items/catalogue_detail.inc @@ -214,7 +214,7 @@ }); const item_types_notforloan = new Map(all_item_types.map( it => [it.itemtype, it.notforloan] )); - const statuses = {checked_out: _("Checked out"), local_use: _("On-site checkout"), in_transit: _("In transit"), lost: _("Lost"), withdrawn: _("Withdrawn"), damaged:_("Damaged"), not_for_loan: _("Not for loan"), on_hold: _("On hold"), recalled: _("Recalled"), available: _("Available"), restricted: _("Restricted")}; + const statuses = {checked_out: _("Checked out"), local_use: _("On-site checkout"), in_transit: _("In transit"), lost: _("Lost"), withdrawn: _("Withdrawn"), damaged:_("Damaged"), not_for_loan: _("Not for loan"), on_hold: _("On hold"), recalled: _("Recalled"), available: _("Available"), restricted: _("Restricted"), in_bundle: _("In bundle")}; const all_statuses = Object.keys(statuses).map(k => {return {_id: k, _str: statuses[k]}}); const can_edit_items_from = [% To.json(can_edit_items_from || []) | $raw %]; -- 2.39.5