From c071b1ec2541df3e59a138af73c85e465ea64d11 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Tue, 18 Apr 2023 10:57:09 +0200 Subject: [PATCH] Bug 33568: enumchron/volinfo MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Owen Leonard Signed-off-by: Laurence Rault Signed-off-by: Emily Lamancusa Signed-off-by: Tomás Cohen Arazi Signed-off-by: Katrin Fischer --- Koha/Item.pm | 12 +++++++ Koha/REST/V1/Biblios.pm | 1 + Koha/Serial/Item.pm | 13 ++++++++ api/v1/swagger/definitions/item.yaml | 4 +++ api/v1/swagger/paths/biblios.yaml | 1 + .../prog/en/modules/catalogue/detail.tt | 32 ++++++++++++++----- 6 files changed, 55 insertions(+), 8 deletions(-) diff --git a/Koha/Item.pm b/Koha/Item.pm index 6fa6bd7ae4..f677abac76 100644 --- a/Koha/Item.pm +++ b/Koha/Item.pm @@ -51,6 +51,7 @@ use Koha::Plugins; use Koha::Recalls; use Koha::Result::Boolean; use Koha::SearchEngine::Indexer; +use Koha::Serial::Items; use Koha::StockRotationItem; use Koha::StockRotationRotas; use Koha::TrackedLinks; @@ -444,6 +445,17 @@ sub checkout { return Koha::Checkout->_new_from_dbic( $checkout_rs ); } +=head3 serialitem + +=cut + +sub serialitem { + my ( $self ) = @_; + my $rs = $self->_result->serialitem; + return unless $rs; + return Koha::Serial::Item->_new_from_dbic($rs); +} + =head3 item_group my $item_group = $item->item_group; diff --git a/Koha/REST/V1/Biblios.pm b/Koha/REST/V1/Biblios.pm index 0f66754f83..94d9ddc59e 100644 --- a/Koha/REST/V1/Biblios.pm +++ b/Koha/REST/V1/Biblios.pm @@ -302,6 +302,7 @@ sub get_items { my $items_rs = $biblio->items; $items_rs = $items_rs->filter_by_bookable if $bookable_only; + # FIXME We need to order_by serial.publisheddate if we have _order_by=+me.serial_issue_number my $items = $c->objects->search($items_rs); return $c->render( status => 200, diff --git a/Koha/Serial/Item.pm b/Koha/Serial/Item.pm index a68a729994..b611eee28a 100644 --- a/Koha/Serial/Item.pm +++ b/Koha/Serial/Item.pm @@ -24,6 +24,8 @@ use Koha::Database; use base qw(Koha::Object); +use Koha::Serials; + =head1 NAME Koha::Serial::Item - Koha Serial Item Object class @@ -34,6 +36,17 @@ Koha::Serial::Item - Koha Serial Item Object class =cut +=head3 serial + +=cut + +sub serial { + my ($self) = @_; + my $rs = $self->_result->serialid; + return unless $rs; + return Koha::Serial->_new_from_dbic($rs); +} + =head3 type =cut diff --git a/api/v1/swagger/definitions/item.yaml b/api/v1/swagger/definitions/item.yaml index 5c9a0d230d..bb5a96ffb5 100644 --- a/api/v1/swagger/definitions/item.yaml +++ b/api/v1/swagger/definitions/item.yaml @@ -238,6 +238,10 @@ properties: type: - object - "null" + serialitem: + type: + - object + - "null" _strings: type: - object diff --git a/api/v1/swagger/paths/biblios.yaml b/api/v1/swagger/paths/biblios.yaml index ff3edf6093..a15997e3ba 100644 --- a/api/v1/swagger/paths/biblios.yaml +++ b/api/v1/swagger/paths/biblios.yaml @@ -425,6 +425,7 @@ - +strings - cover_image_ids - item_group_item.item_group.description + - serialitem.serial collectionFormat: csv - $ref: "../swagger.yaml#/parameters/match" - $ref: "../swagger.yaml#/parameters/order_by" diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt index ca5b0eddec..73499267ce 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt @@ -712,9 +712,7 @@ Item group [% END %] Call number - [% IF volinfo %] - Serial enumeration / chronology - [% END %] + Serial enumeration / chronology Status Last seen Checkouts @@ -2498,6 +2496,9 @@ [% IF Koha.Preference('EnableItemGroups') %] embed.push('item_group_item.item_group.description'); [% END %] + [% IF biblio.serial %] + embed.push('serialitem.serial'); + [% END %] let table_settings = [% TablesSettings.GetTableSettings('catalogue', 'detail','holdings_table','json') | $raw %]; var items_table = $("#table_items").kohaTable({ ajax: { url: table_url }, @@ -2631,17 +2632,32 @@ } }, - [% IF volinfo %] { - data: "", + data: "me.serial_issue_number", className: "enumchron", - searchable: false, // FIXME + searchable: true, orderable: true, render: function (data, type, row, meta) { - return "volinfo"; // FIXME volinfo/enumchron/serial_issue_number + let nodes = ""; + [%# FIXME Previously we displayed the column if at least one item of the biblio had an enumchron/serial_issue_number. Now it's only if one item of the ones displayed on the current page, how is that bad? How can it be fixed in an elegant way? Should we display the column only if biblio.serial? %] + let serial = row.serialitem ? row.serialitem.serial : null; + if ( row.serial_issue_number && serial && serial.serialseq ) { + nodes += '%s'.format(row.serial_issue_number); + if ( serial.serialseq && row.serial_issue_number != serial.serialseq ) { + nodes += ' -- ' + nodes += ' %s'.format(serial.serialseq); + } + } else if ( row.serial_issue_number ) { + nodes += ' %s'.format(row.serial_issue_number); + } else if ( serial && serial.serialseq ) { + nodes += '%s'.format(serial.serialseq); + } + if ( serial && serial.publisheddate ) { + nodes += ' (%s)'.format($date(serial.publisheddate)); + } + return nodes; } }, - [% END %] { data: "", className: "status", -- 2.39.5