layout tweaks and propagate metabib attributes for Formats and Editions
authorJason Etheridge <jason@EquinoxOLI.org>
Wed, 19 Oct 2022 11:00:13 +0000 (07:00 -0400)
committerJason Etheridge <jason@EquinoxOLI.org>
Wed, 4 Jan 2023 13:44:00 +0000 (08:44 -0500)
Open-ILS/src/eg2/src/app/share/catalog/bib-record.service.ts
Open-ILS/src/eg2/src/app/staff/share/bib-staff-view/bib-staff-view.component.html
Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm

index a4dd0b0..0bc02cd 100644 (file)
@@ -37,6 +37,7 @@ export class BibRecordSummary {
     id: number; // == record.id() for convenience
     metabibId: number; // If present, this is a metabib summary
     metabibRecords: number[]; // all constituent bib records
+    metabibAttributes: any; // combined attributes for metabib records; would be redundant with attributes if the BibRecordSummary is populated by a metarecord, and so is not populated in that case
     orgId: number;
     orgDepth: number;
     record: IdlObject;
@@ -128,6 +129,9 @@ export class BibRecordService {
         .pipe(map(bibSummary => {
             const summary = new BibRecordSummary(bibSummary.record, orgId);
             summary.net = this.net; // inject
+            summary.metabibId = Number(bibSummary.metabib_id);
+            summary.metabibRecords = bibSummary.metabib_records;
+            summary.metabibAttributes = bibSummary.metabib_attributes;
             summary.display = bibSummary.display;
             summary.attributes = bibSummary.attributes;
             summary.holdCount = bibSummary.hold_count;
index 130c173..471c359 100644 (file)
 <div class='eg-bib-staff-view card tight-card w-100' *ngIf="summary">
 
-  <div class="row" *ngIf="summary.display.title">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Title:</div>
-              <div class="col-lg-4 pl-1">
-                <a href="/eg2/staff/catalog/search?query={{summary.display.title}}&fieldClass=title&joinOp=&matchOp=contains&dateOp=is">
-                    {{summary.display.title}}
-                </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+  <div class="row"><!-- uber row -->
+    <div class="col-md-6"><!-- uber col -->
 
-  <div class="row" *ngFor="let _series of summary.display.series_title">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Series Title:</div>
-              <div class="col-lg-4 pl-1">
-                <a href="/eg2/staff/catalog/search?query={{_series}}&fieldClass=series&joinOp=&matchOp=contains&dateOp=is">
-                    {{_series}}
-                </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <div class="row" *ngIf="summary.display.title">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Title:</div>
+                  <div class="col-lg-8 pl-1">
+                    <a href="/eg2/staff/catalog/search?query={{summary.display.title}}&fieldClass=title&joinOp=&matchOp=contains&dateOp=is">
+                        {{summary.display.title}}
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
 
-  <div class="row" *ngIf="summary.display.edition">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Edition:</div>
-              <div class="col-lg-4 pl-1">
-                {{summary.display.edition}}
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.series_title">
+      <div class="row" *ngFor="let _series of summary.display.series_title">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Series Title:</div>
+                  <div class="col-lg-8 pl-1">
+                    <a href="/eg2/staff/catalog/search?query={{_series}}&fieldClass=series&joinOp=&matchOp=contains&dateOp=is">
+                        {{_series}}
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngIf="summary.display.publisher">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Publisher:</div>
-              <div class="col-lg-4 pl-1">
-                {{summary.display.publisher}}
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <div class="row" *ngIf="summary.display.edition">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Edition:</div>
+                  <div class="col-lg-8 pl-1">
+                    {{summary.display.edition}}
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
 
-  <div class="row" *ngIf="summary.display.author">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Author:</div>
-              <div class="col-lg-4 pl-1">
-                <a href="/eg2/staff/catalog/search?query={{summary.display.author}}&fieldClass=author&joinOp=&matchOp=contains&dateOp=is">
-                    {{summary.display.author}}
-                </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <div class="row" *ngIf="summary.display.publisher">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Publisher:</div>
+                  <div class="col-lg-8 pl-1">
+                    {{summary.display.publisher}}
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
 
-  <div class="row" *ngFor="let _creator of summary.display.creators">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Creator:</div>
-              <div class="col-lg-4 pl-1">
-                <a href="/eg2/staff/catalog/search?query={{_creator}}&fieldClass=author&joinOp=&matchOp=contains&dateOp=is">
-                    {{_creator}}
-                </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <div class="row" *ngIf="summary.display.author">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Author:</div>
+                  <div class="col-lg-8 pl-1">
+                    <a href="/eg2/staff/catalog/search?query={{summary.display.author}}&fieldClass=author&joinOp=&matchOp=contains&dateOp=is">
+                        {{summary.display.author}}
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
 
-  <div class="row" *ngFor="let _performer of summary.display.performers">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Performer:</div>
-              <div class="col-lg-4 pl-1">
-                <a href="/eg2/staff/catalog/search?query={{_performer}}&fieldClass=author&joinOp=&matchOp=contains&dateOp=is">
-                    {{_performer}}
-                </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.creators">
+      <div class="row" *ngFor="let _creator of summary.display.creators">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Creator:</div>
+                  <div class="col-lg-8 pl-1">
+                    <a href="/eg2/staff/catalog/search?query={{_creator}}&fieldClass=author&joinOp=&matchOp=contains&dateOp=is">
+                        {{_creator}}
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _credit of summary.display.production_credits">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Production Credit:</div>
-              <div class="col-lg-4 pl-1">
-                <a href="/eg2/staff/catalog/search?query={{_credit}}&fieldClass=author&joinOp=&matchOp=contains&dateOp=is">
-                    {{_credit}}
-                </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.performers">
+      <div class="row" *ngFor="let _performer of summary.display.performers">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Performer:</div>
+                  <div class="col-lg-8 pl-1">
+                    <a href="/eg2/staff/catalog/search?query={{_performer}}&fieldClass=author&joinOp=&matchOp=contains&dateOp=is">
+                        {{_performer}}
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _isbn of summary.display.isbn">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>ISBN:</div>
-              <div class="col-lg-4 pl-1">
-                  <a href="/eg2/staff/catalog/search?identQuery={{_isbn}}&identQueryType=identifier%7Cisbn">
-                    {{_isbn}}
-                  </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.production_credits">
+      <div class="row" *ngFor="let _credit of summary.display.production_credits">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Production Credit:</div>
+                  <div class="col-lg-8 pl-1">
+                    <a href="/eg2/staff/catalog/search?query={{_credit}}&fieldClass=author&joinOp=&matchOp=contains&dateOp=is">
+                        {{_credit}}
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _issn of summary.display.issn">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>ISSN:</div>
-              <div class="col-lg-4 pl-1">
-                  <a href="/eg2/staff/catalog/search?identQuery={{_issn}}&identQueryType=identifier%7Cissn">
-                    {{_issn}}
-                  </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.isbn">
+      <div class="row" *ngFor="let _isbn of summary.display.isbn">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>ISBN:</div>
+                  <div class="col-lg-8 pl-1">
+                      <a href="/eg2/staff/catalog/search?identQuery={{_isbn}}&identQueryType=identifier%7Cisbn">
+                        {{_isbn}}
+                      </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _upc of summary.display.upc">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>UPC:</div>
-              <div class="col-lg-4 pl-1">
-                  <a href="/eg2/staff/catalog/search?identQuery={{_upc}}&identQueryType=identifier%7Cupc">
-                    {{_upc}}
-                  </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.issn">
+      <div class="row" *ngFor="let _issn of summary.display.issn">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>ISSN:</div>
+                  <div class="col-lg-8 pl-1">
+                      <a href="/eg2/staff/catalog/search?identQuery={{_issn}}&identQueryType=identifier%7Cissn">
+                        {{_issn}}
+                      </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngIf="summary.display.type_of_resource">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Type of Resource:</div>
-              <div class="col-lg-4 pl-1">
-                {{summary.display.type_of_resource}}
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.upc">
+      <div class="row" *ngFor="let _upc of summary.display.upc">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>UPC:</div>
+                  <div class="col-lg-8 pl-1">
+                      <a href="/eg2/staff/catalog/search?identQuery={{_upc}}&identQueryType=identifier%7Cupc">
+                        {{_upc}}
+                      </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _desc of summary.display.physical_description">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Physical Description:</div>
-              <div class="col-lg-4 pl-1">
-                {{_desc}}
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.type_of_resource">
+      <div class="row" *ngIf="summary.display.type_of_resource">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Type of Resource:</div>
+                  <div class="col-lg-8 pl-1">
+                    {{summary.display.type_of_resource}}
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _subj of summary.display.subject">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Subject:</div>
-              <div class="col-lg-4 pl-1">
-                <a href="/eg2/staff/catalog/search?query={{_subj}}&fieldClass=subject&joinOp=&matchOp=contains&dateOp=is">
-                    {{_subj}}
-                </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.physical_description">
+      <div class="row" *ngFor="let _desc of summary.display.physical_description">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Physical Description:</div>
+                  <div class="col-lg-8 pl-1">
+                    {{_desc}}
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _subj of summary.display.subject_name">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Subject Name:</div>
-              <div class="col-lg-4 pl-1">
-                <a href="/eg2/staff/catalog/search?query={{_subj}}&fieldClass=subject&joinOp=&matchOp=contains&dateOp=is">
-                    {{_subj}}
-                </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.subject">
+      <div class="row" *ngFor="let _subj of summary.display.subject">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Subject:</div>
+                  <div class="col-lg-8 pl-1">
+                    <a href="/eg2/staff/catalog/search?query={{_subj}}&fieldClass=subject&joinOp=&matchOp=contains&dateOp=is">
+                        {{_subj}}
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _subj of summary.display.subject_topic">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Subject Topic:</div>
-              <div class="col-lg-4 pl-1">
-                <a href="/eg2/staff/catalog/search?query={{_subj}}&fieldClass=subject&joinOp=&matchOp=contains&dateOp=is">
-                    {{_subj}}
-                </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.subject_name">
+      <div class="row" *ngFor="let _subj of summary.display.subject_name">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Subject Name:</div>
+                  <div class="col-lg-8 pl-1">
+                    <a href="/eg2/staff/catalog/search?query={{_subj}}&fieldClass=subject&joinOp=&matchOp=contains&dateOp=is">
+                        {{_subj}}
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _subj of summary.display.subject_geographic">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Subject Geographic:</div>
-              <div class="col-lg-4 pl-1">
-                <a href="/eg2/staff/catalog/search?query={{_subj}}&fieldClass=subject&joinOp=&matchOp=contains&dateOp=is">
-                    {{_subj}}
-                </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.subject_topic">
+      <div class="row" *ngFor="let _subj of summary.display.subject_topic">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Subject Topic:</div>
+                  <div class="col-lg-8 pl-1">
+                    <a href="/eg2/staff/catalog/search?query={{_subj}}&fieldClass=subject&joinOp=&matchOp=contains&dateOp=is">
+                        {{_subj}}
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _subj of summary.display.subject_temporal">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Subject Temporal:</div>
-              <div class="col-lg-4 pl-1">
-                <a href="/eg2/staff/catalog/search?query={{_subj}}&fieldClass=subject&joinOp=&matchOp=contains&dateOp=is">
-                    {{_subj}}
-                </a>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.subject_geographic">
+      <div class="row" *ngFor="let _subj of summary.display.subject_geographic">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Subject Geographic:</div>
+                  <div class="col-lg-8 pl-1">
+                    <a href="/eg2/staff/catalog/search?query={{_subj}}&fieldClass=subject&joinOp=&matchOp=contains&dateOp=is">
+                        {{_subj}}
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _genre of summary.display.genre">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Genre:</div>
-              <div class="col-lg-4 pl-1">
-                {{_genre}}
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.subject_temporal">
+      <div class="row" *ngFor="let _subj of summary.display.subject_temporal">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Subject Temporal:</div>
+                  <div class="col-lg-8 pl-1">
+                    <a href="/eg2/staff/catalog/search?query={{_subj}}&fieldClass=subject&joinOp=&matchOp=contains&dateOp=is">
+                        {{_subj}}
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngFor="let _bibliography of summary.display.bibliography">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Bibliography:</div>
-              <div class="col-lg-4 pl-1">
-                {{_bibliography}}
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.genre">
+      <div class="row" *ngFor="let _genre of summary.display.genre">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Genre:</div>
+                  <div class="col-lg-8 pl-1">
+                    {{_genre}}
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngIf="summary.display.abstract">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Abstract:</div>
-              <div class="col-lg-4 pl-1">
-                {{summary.display.abstract}}
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.bibliography">
+      <div class="row" *ngFor="let _bibliography of summary.display.bibliography">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Bibliography:</div>
+                  <div class="col-lg-8 pl-1">
+                    {{_bibliography}}
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row" *ngIf="summary.display.toc">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Table of Contents:</div>
-              <div class="col-lg-4 pl-1">
-                {{summary.display.toc}}
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <div class="row" *ngIf="summary.display.abstract">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Abstract:</div>
+                  <div class="col-lg-8 pl-1">
+                    {{summary.display.abstract}}
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
 
-  <div class="row" *ngFor="let _thesis of summary.display.thesis">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Thesis:</div>
-              <div class="col-lg-4 pl-1">
-                {{_thesis}}
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <div class="row" *ngIf="summary.display.toc">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Table of Contents:</div>
+                  <div class="col-lg-8 pl-1">
+                    {{summary.display.toc}}
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
 
-  <div class="row" *ngFor="let _note of summary.display.general_note">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>General Note:</div>
-              <div class="col-lg-4 pl-1">
-                {{_note}}
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.thesis">
+      <div class="row" *ngFor="let _thesis of summary.display.thesis">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Thesis:</div>
+                  <div class="col-lg-8 pl-1">
+                    {{_thesis}}
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Hold count:</div>
-              <div class="col-lg-4 pl-1">
-                {{summary.holdCount}}
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <ng-container *ngIf="summary.display.general_note">
+      <div class="row" *ngFor="let _note of summary.display.general_note">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>General Note:</div>
+                  <div class="col-lg-8 pl-1">
+                    {{_note}}
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+      </ng-container>
 
-  <div class="row">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Has holdable copy:</div>
-              <div class="col-lg-4 pl-1">
-                <span i18n *ngIf="summary.has_holdable_copy">Yes</span>
-                <span i18n *ngIf="!summary.has_holdable_copy">No</span>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+    </div><!-- uber col -->
+    <div class="col-md-6"><!-- uber col -->
 
-  <div class="row">
-    <div class='col-lg-11 pl-0'>
-      <div class="card-body">
-        <ul class="list-group list-group-flush">
-          <li class="list-group-item">
-            <div class="d-flex">
-              <div class="col-lg-2 font-weight-bold" i18n>Copy Counts:</div>
-              <div class="col-lg-4 pl-1">
-                <ul class="list-group">
-                    <li class="list-group-item" *ngFor="let _count of summary.holdingsSummary">
-                        <span i18n>{{_count.available}} of {{_count.count}} copies available at {{orgName(_count.org_unit)}}.</span>
-                    </li>
-                </ul>
-              </div>
-              <div class="col-lg-6 flex-1"></div>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div><!-- col -->
-  </div><!-- row -->
+      <div class="row">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Hold and Copy Counts:</div>
+                  <div class="col-lg-8 pl-1">
+                    <ul class="list-group">
+                        <li class="list-group-item"><span i18n>{{summary.holdCount}} hold requests</span></li>
+                        <li class="list-group-item">
+                            <span i18n *ngIf=" summary.isHoldable">Record is holdable.</span>
+                            <span i18n *ngIf="!summary.isHoldable">Record is not holdable.</span>
+                        </li>
+                        <li class="list-group-item" *ngFor="let _count of summary.holdingsSummary">
+                            <span i18n>{{_count.available}} of {{_count.count}} copies available at {{orgName(_count.org_unit)}}.</span>
+                        </li>
+                    </ul>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
 
+      <div class="row">
+        <div class='col-lg pl-0'>
+          <div class="card-body">
+            <ul class="list-group list-group-flush">
+              <li class="list-group-item">
+                <div class="d-flex">
+                  <div class="col-lg-4 font-weight-bold" i18n>Formats and Editions:</div>
+                  <div class="col-lg-8 pl-1">
+                    <ul class="list-group">
+                        <ng-container *ngIf="summary.metabibAttributes.icon_format">
+                        <li class="list-group-item" *ngFor="let _x of summary.metabibAttributes.icon_format.label | keyvalue">
+                            <span>{{_x.key}} ({{_x.value}})</span>
+                        </li>
+                        </ng-container>
+                        <ng-container *ngIf="summary.metabibAttributes.item_lang">
+                        <li class="list-group-item" *ngFor="let _x of summary.metabibAttributes.item_lang.label | keyvalue">
+                            <span>{{_x.key}} ({{_x.value}})</span>
+                        </li>
+                        </ng-container>
+                    </ul>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div><!-- col -->
+      </div><!-- row -->
+
+    </div><!-- uber col -->
+  </div><!-- uber row -->
 </div>
index 3af4a33..593920b 100644 (file)
@@ -3110,6 +3110,52 @@ sub catalog_record_summary {
             get_one_metarecord_summary($self, $e, $org_id, $rec_id) :
             get_one_record_summary($self, $e, $org_id, $rec_id);
 
+        # Let's get Formats & Editions data FIXME: consider peer bibs?
+        unless ($is_meta) {
+            # metabib variant of this call already handle $response->{metabib_id} and $response->{metabib_records},
+            # and $response->{metabib_attributes} would be redundant with $response->{attributes} in that case, so
+            # is not populated unless using the non-metarecord variants of the call
+            my $meta_search = $e->search_metabib_metarecord_source_map({source => $rec_id});
+            if ($meta_search) {
+                $response->{metabib_id} = $meta_search->[0]->metarecord;
+                my $maps = $e->search_metabib_metarecord_source_map({metarecord => $response->{metabib_id}});
+                my @metabib_records = map { $_->source } @$maps;
+                $response->{metabib_records} = \@metabib_records;
+
+                my $attributes = $U->get_bre_attrs(\@metabib_records);
+                # we get "243":{
+                #       "srce":{
+                #         "code":" ",
+                #         "label":"National bibliographic agency"
+                #       }, ...}
+                my $metabib_attr = {};
+
+                foreach my $bib_id ( keys %{ $attributes } ) {
+                    foreach my $ctype ( keys %{ $attributes->{$bib_id} } ) {
+                        # we want {
+                        #   "srce":{
+                        #     "code": { " ":1, ... } # leaf value is the bib count
+                        #     "label": { "National bibliographic agency":1, ... } 
+                        #   }, ...}
+                        $metabib_attr->{$ctype} = {} unless $metabib_attr->{$ctype};
+                        $metabib_attr->{$ctype}->{code} = {} unless $metabib_attr->{$ctype}->{code};
+                        $metabib_attr->{$ctype}->{label} = {} unless $metabib_attr->{$ctype}->{label};
+                        if ( $metabib_attr->{$ctype}->{code}->{ $attributes->{$bib_id}->{$ctype}->{code} } ) {
+                            $metabib_attr->{$ctype}->{code}->{ $attributes->{$bib_id}->{$ctype}->{code} } += 1;
+                        } else {
+                            $metabib_attr->{$ctype}->{code}->{ $attributes->{$bib_id}->{$ctype}->{code} } = 1;
+                        }
+                        if ( $metabib_attr->{$ctype}->{label}->{ $attributes->{$bib_id}->{$ctype}->{label} } ) {
+                            $metabib_attr->{$ctype}->{label}->{ $attributes->{$bib_id}->{$ctype}->{label} } += 1;
+                        } else {
+                            $metabib_attr->{$ctype}->{label}->{ $attributes->{$bib_id}->{$ctype}->{label} } = 1;
+                        }
+                    }
+                }
+                $response->{metabib_attributes} = $metabib_attr;
+            }
+        }
+
         ($response->{copy_counts}) = $copy_method->run($org_id, $rec_id);
 
         $response->{first_call_number} = get_first_call_number(