LP1881607 Angular catalog e-resource links display
authorBill Erickson <berickxx@gmail.com>
Mon, 1 Jun 2020 16:32:21 +0000 (12:32 -0400)
committerChris Sharp <csharp@georgialibraries.org>
Fri, 8 Jan 2021 19:52:53 +0000 (14:52 -0500)
Display electronic resource links (MARC 856's) in the Angular staff
catalog.  The extraction logic, which matches the TPAC, has been put
into its own API.

To test in concerto, navigate to:

/eg2/staff/catalog/record/208

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/eg2/src/app/share/catalog/bib-record.service.ts
Open-ILS/src/eg2/src/app/staff/share/bib-summary/bib-summary.component.html
Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/Authority.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm

index 7510fe0..ce352c7 100644 (file)
@@ -17,6 +17,11 @@ export const NAMESPACE_MAPS = {
 export const HOLDINGS_XPATH =
     '/holdings:holdings/holdings:counts/holdings:count';
 
+interface EResourceUrl {
+    href: string;
+    note: string;
+    label: string;
+}
 
 export class BibRecordSummary {
     id: number; // == record.id() for convenience
@@ -32,6 +37,7 @@ export class BibRecordSummary {
     bibCallNumber: string;
     net: NetService;
     displayHighlights: {[name: string]: string | string[]} = {};
+    eResourceUrls: EResourceUrl[] = [];
 
     constructor(record: IdlObject, orgId: number, orgDepth?: number) {
         this.id = Number(record.id());
@@ -106,6 +112,7 @@ export class BibRecordService {
             summary.attributes = bibSummary.attributes;
             summary.holdCount = bibSummary.hold_count;
             summary.holdingsSummary = bibSummary.copy_counts;
+            summary.eResourceUrls = bibSummary.urls;
             return summary;
         }));
     }
index e91a4e4..042394a 100644 (file)
               </div>
             </li>
           </ng-container>
+          <ng-container *ngIf="expand && summary.eResourceUrls.length">
+            <li class="list-group-item" *ngFor="let url of summary.eResourceUrls">
+              <div class="d-flex">
+                <div class="flex-1 font-weight-bold" i18n>
+                  Electronic Resource:
+                </div>
+                <div class="flex-5">
+                  <a href="{{url.href}}">{{url.label}}</a>
+                </div>
+                <div class="flex-4">{{url.note}}</div>
+              </div>
+            </li>
+          </ng-container>
         </ul>
       </div>
     </div><!-- col -->
index 9bf9285..e062363 100644 (file)
@@ -1,5 +1,7 @@
 package OpenILS::Application::AppUtils;
 use strict; use warnings;
+use MARC::Record;
+use MARC::File::XML (BinaryEncoding => 'utf8', RecordFormat => 'USMARC');
 use OpenILS::Application;
 use base qw/OpenILS::Application/;
 use OpenSRF::Utils::Cache;
@@ -23,7 +25,7 @@ use Digest::MD5 qw(md5_hex);
 # Pile of utilty methods used accross applications.
 # ---------------------------------------------------------------------------
 my $cache_client = "OpenSRF::Utils::Cache";
-
+my $MARC_NAMESPACE = 'http://www.loc.gov/MARC21/slim';
 
 # ---------------------------------------------------------------------------
 # on sucess, returns the created session, on failure throws ERROR exception
@@ -2429,5 +2431,16 @@ sub verify_migrated_user_password {
 }
 
 
+# generate a MARC XML document from a MARC XML string
+sub marc_xml_to_doc {
+    my ($class, $xml) = @_;
+    my $marc_doc = XML::LibXML->new->parse_string($xml);
+    $marc_doc->documentElement->setNamespace($MARC_NAMESPACE, 'marc', 1);
+    $marc_doc->documentElement->setNamespace($MARC_NAMESPACE);
+    return $marc_doc;
+}
+
+
+
 1;
 
index 82d04f5..746f528 100644 (file)
@@ -11,19 +11,13 @@ use OpenILS::Utils::Fieldmapper;
 use OpenILS::Const qw/:const/;
 use OpenILS::Event;
 my $U = 'OpenILS::Application::AppUtils';
-my $MARC_NAMESPACE = 'http://www.loc.gov/MARC21/slim';
-
 
 # generate a MARC XML document from a MARC XML string
 sub marc_xml_to_doc {
     my $xml = shift;
-    my $marc_doc = XML::LibXML->new->parse_string($xml);
-    $marc_doc->documentElement->setNamespace($MARC_NAMESPACE, 'marc', 1);
-    $marc_doc->documentElement->setNamespace($MARC_NAMESPACE);
-    return $marc_doc;
+    return $U->marc_xml_to_doc($xml);
 }
 
-
 __PACKAGE__->register_method(
     method  => 'import_authority_record',
     api_name    => 'open-ils.cat.authority.record.import',
index 64d92cf..db89145 100644 (file)
@@ -2899,6 +2899,9 @@ sub record_urls {
 
         my $marc_doc = $U->marc_xml_to_doc($bib->marc);
 
+        # Logic copied from TPAC misc_utils.tts
+        my @urls;
+
         for my $node ($marc_doc->findnodes(
             '//*[@tag="856" and @ind1="4" and (@ind2="0" or @ind2="1")]')) {