From 63489d9aab188ea16e3359c6b120a9c9fde55059 Mon Sep 17 00:00:00 2001
From: Robert Lange <robert.lange@uni-leipzig.de>
Date: Wed, 6 Jan 2021 14:37:30 +0100
Subject: [PATCH] refs #18845 [finc] optimize ajax covers

for details see issue/18845
---
 .../finc/src/finc/View/Helper/Root/Record.php | 18 ++++++++-
 themes/finc/js/covers.js                      | 21 ++++++++++
 themes/finc/scss/compiled.scss                |  8 +++-
 .../DefaultRecord/collection-info.phtml       |  2 +-
 .../RecordDriver/DefaultRecord/core.phtml     |  2 +-
 .../DefaultRecord/record-icon-class.phtml     |  1 -
 .../DefaultRecord/record-icon-text.phtml      | 20 ++++++++++
 .../DefaultRecord/record-icon.phtml           | 38 +++++++------------
 .../DefaultRecord/result-list.phtml           |  3 +-
 .../FincMissing/result-list.phtml             |  2 +-
 .../templates/RecordDriver/SolrAI/core.phtml  |  2 +-
 .../RecordDriver/SolrAI/result-list.phtml     |  1 +
 .../RecordDriver/SolrLido/core.phtml          |  2 +-
 .../RecordDriver/SolrMarc/core.phtml          |  2 +-
 .../templates/myresearch/historicloans.phtml  |  2 +-
 .../templates/myresearch/illrequests.phtml    |  2 +-
 themes/finc/templates/record/cover.phtml      | 37 +++++++++++-------
 17 files changed, 111 insertions(+), 52 deletions(-)
 create mode 100644 themes/finc/templates/RecordDriver/DefaultRecord/record-icon-text.phtml

diff --git a/module/finc/src/finc/View/Helper/Root/Record.php b/module/finc/src/finc/View/Helper/Root/Record.php
index c12efed0937..847bec98d2c 100644
--- a/module/finc/src/finc/View/Helper/Root/Record.php
+++ b/module/finc/src/finc/View/Helper/Root/Record.php
@@ -116,7 +116,7 @@ class Record extends \VuFind\View\Helper\Root\Record
     /**
      * Get the CSS class used to properly render an icon for given value
      *
-     * @param string $value Value to convert into CSS class
+     * @param string $value (identifier) Value to convert into CSS class
      * @param string $classfile Define alternative file for icon class without
      *                              suffix. Default: record-icon-class.phtml
      *
@@ -130,6 +130,20 @@ class Record extends \VuFind\View\Helper\Root\Record
         );
     }
 
+    /**
+     * Get the CSS class used to properly render an icon for given value
+     *
+     * @param string $classfile Define alternative file for icon text without
+     *
+     * @return string
+     */
+    public function getRecordIconText($classfile = 'record-icon-text')
+    {
+        return $this->renderTemplate(
+            $classfile . '.phtml'
+        );
+    }
+
     /**
      * Returns if style based icons should be shown (if covers are disabled!)
      *
@@ -338,7 +352,7 @@ class Record extends \VuFind\View\Helper\Root\Record
             }
             // is pattern set and matches so try rewrite url
             if (isset($r['pattern']) && 0 != preg_match('/' . $r['pattern'] . '/i', trim($link['url']))) {
-                // if function is set and available then perform on url 
+                // if function is set and available then perform on url
                 if (isset($r['function']) && is_callable($r['function'])) {
                     $link['url'] = $r['function']($link['url']);
                 }
diff --git a/themes/finc/js/covers.js b/themes/finc/js/covers.js
index 1f150538799..f54f93b677c 100644
--- a/themes/finc/js/covers.js
+++ b/themes/finc/js/covers.js
@@ -1,3 +1,22 @@
+/* global Finc */
+// show picture in large size after click within a modal
+function registerCoverForModal(anchor, url) {
+  if (anchor === null || anchor === undefined || url === null || url === undefined) {
+    return;
+  }
+
+  anchor.click(function(event) {
+    event.preventDefault();
+    VuFind.modal('show');
+    var largeSizeUrl = url + '&size=large';
+    $.get(largeSizeUrl).done(function() {
+      $('#modal').find('.modal-body').html('<img src="' + largeSizeUrl + '">');
+    }).fail(function() {
+      $('#modal').find('.modal-body').html('<img src="' + url + '">');
+    });
+  });
+}
+
 /* this is a backport from VF 7 core, remove on upgrade */
 /* global VuFind */
 function loadCoverByElement(data, element) {
@@ -15,6 +34,7 @@ function loadCoverByElement(data, element) {
       anchor.show();
       anchor.attr('href', response.data.url);
       anchor.removeClass('hidden'); // finc specific
+      registerCoverForModal(anchor, response.data.url); // finc specific
     } else {
       img.remove();
       if (typeof response.data.html !== 'undefined') {
@@ -45,5 +65,6 @@ function loadCovers() {
     loadCoverByElement(data, $(this));
   });
 }
+
 // deactivated for finc - we load every single cover directly by itself in cover.phtml
 // $(document).ready(loadCovers);
diff --git a/themes/finc/scss/compiled.scss b/themes/finc/scss/compiled.scss
index 094ad9742b4..79421497168 100644
--- a/themes/finc/scss/compiled.scss
+++ b/themes/finc/scss/compiled.scss
@@ -2172,8 +2172,14 @@ footer {
   }
 
   span {
-    font-size: .8em;
+    font-size: 1rem;
+    padding-top: .75rem;
+    text-align: center;
     width: 100%;
+
+    @media screen and (max-width: $screen-xs-max) {
+      display: block;
+    }
   }
 }
 
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/collection-info.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/collection-info.phtml
index da6f1ba8e88..9a632703f39 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/collection-info.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/collection-info.phtml
@@ -6,7 +6,7 @@
   $cover = $coverDetails['html'];
   $preview = $this->record($this->driver)->getPreviews(); ?>
   <?php if ($QRCode || $cover || $preview): ?>
-    <div class="media-left <?=$this->escapeHtmlAttr($coverDetails['size'])?>" aria-hidden="<?=$cover?'true':'false'?>>
+    <div class="media-left <?=$this->escapeHtmlAttr($coverDetails['size'])?>">
       <?php /* Display thumbnail if appropriate: */ ?>
       <?php if ($cover): ?>
         <?=$cover?>
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/core.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/core.phtml
index abfa3146c70..2fb24aa1bf3 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/core.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/core.phtml
@@ -9,7 +9,7 @@
   $preview = $this->record($this->driver)->getPreviews();
   ?>
   <?php if ($QRCode || $cover || $preview): ?>
-    <div class="media-left <?= $this->escapeHtmlAttr($coverDetails['size']) ?> img-col" aria-hidden="<?=$cover?'true':'false'?>">
+    <div class="media-left <?= $this->escapeHtmlAttr($coverDetails['size']) ?> img-col">
       <?php /* Display thumbnail if appropriate: */ ?>
       <?php if ($cover): ?>
         <?=$cover?>
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/record-icon-class.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/record-icon-class.phtml
index 7e915e408fb..c9db1eba114 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/record-icon-class.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/record-icon-class.phtml
@@ -2,7 +2,6 @@
 $normalizedValue = preg_replace('/[^a-z0-9]/', '', strtolower($this->value));
 
 // Convert normalizedValue to styles
-// finc: same list of states for icons like in de_15 #13704 - VE
 switch ($normalizedValue) {
   case 'local':
     echo 'fa-home';
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/record-icon-text.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/record-icon-text.phtml
new file mode 100644
index 00000000000..50bd4d1b6e9
--- /dev/null
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/record-icon-text.phtml
@@ -0,0 +1,20 @@
+<!-- finc: recordDriver - DefaultRecord - record-icon-text  -->
+<?php
+  /* block copied from record-icon - RL */
+  $recordType = $this->driver->getRecordType();
+  if ($recordType == "marcfincpda") {
+    $type = $recordType;
+  } elseif ($recordType == "lido") {
+    $type = "object";
+  } else {
+    $type = implode('', $this->driver->getFacetAvail());
+  }
+?>
+<?php if ($iconClass = $this->record($this->driver)->getRecordIconClass($type)): ?>
+  <span class="access-icon hidden-print">
+    <span>
+      <?=$this->translate("($iconClass)")?>
+    </span>
+  </span>
+<?php endif; ?>
+<!-- finc: recordDriver - DefaultRecord - record-icon-text - END -->
\ No newline at end of file
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/record-icon.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/record-icon.phtml
index b1326e32980..b36f126e35c 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/record-icon.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/record-icon.phtml
@@ -1,30 +1,18 @@
 <!-- finc: recordDriver - DefaultRecord - record-icon  -->
 <?php
-/* finc: template is identical with de_15 #13704 - VE */
-
-/*$formats = [];
-foreach ($this->driver->getFormats() as $format) {
-  $formats[] = $this->record($this->driver)->getRecordIconClass($format);
-}
-$formats = array_unique($formats);
-asort($formats);
-?>
-<span class="record-icon"><img src="<?=$this->imageLink("small/".array_pop($formats).".png")?>" class="hidden-xs" alt="<?=$this->transEsc("record icon")?>" /></span>
-*/
-
-if ($this->driver->getRecordType() == "marcfincpda") {
-  $iconClass = $this->record($this->driver)->getRecordIconClass("marcfincpda");
-} elseif ($this->driver->getRecordType() == "lido") {
-  $iconClass = $this->record($this->driver)->getRecordIconClass("object");
-} else {
-  /* finc: solr field facet_avail instead of access_facet (field deprecated) #15375 - GG */
-  $facetAvail = $this->driver->getFacetAvail();
-  $facetAvail = implode('', $facetAvail);
-  $iconClass = $this->record($this->driver)->getRecordIconClass($facetAvail);
-}
+  /* finc: template is NOT identical with de_15 - RL */
+  $recordType = $this->driver->getRecordType();
+  if ($recordType == "marcfincpda") {
+    $type = $recordType;
+  } elseif ($recordType == "lido") {
+    $type = "object";
+  } else {
+    $type = implode('', $this->driver->getFacetAvail());
+  }
+  $iconClass = $this->record($this->driver)->getRecordIconClass($type);
 ?>
 <span class="access-icon hidden-print">
-  <i class="fa <?=$iconClass?>"></i>
-  <span class="hidden-xs"> <?=$this->transEsc("$this->escapeHtml($iconClass)")?></span>
+  <i aria-hidden="true" class="fa <?=$iconClass?>"></i>
+  <?php /* separate access text from icon - moved to cover.phtml */ ?>
 </span>
-<!-- finc: recordDriver - DefaultRecord - record-icon - END -->
+<!-- finc: recordDriver - DefaultRecord - record-icon - END -->
\ No newline at end of file
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml
index 384afa895b7..767f185304e 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml
@@ -8,7 +8,7 @@ $thumbnailAlignment = $this->record($this->driver)->getThumbnailAlignment('resul
 $describedById = $driver->getSourceIdentifier() . '|' . $driver->getUniqueId();
 if ($cover):
   ob_start(); ?>
-  <div class="media-<?=$thumbnailAlignment?> <?=$this->escapeHtmlAttr($coverDetails['size'])?>" aria-hidden="true">
+  <div class="media-<?=$thumbnailAlignment?> <?=$this->escapeHtmlAttr($coverDetails['size'])?>">
     <?=$cover?>
   </div>
   <?php $thumbnail = ob_get_contents(); ?>
@@ -18,6 +18,7 @@ if ($cover):
   <?php ob_start(); ?>
   <div class="media-<?=$thumbnailAlignment?> record-icon">
     <?=$this->record($this->driver)->getRecordIcon()?>
+    <?=$this->record($this->driver)->getRecordIconText()?>
   </div>
   <?php $thumbnail = ob_get_contents(); ?>
   <?php ob_end_clean(); ?>
diff --git a/themes/finc/templates/RecordDriver/FincMissing/result-list.phtml b/themes/finc/templates/RecordDriver/FincMissing/result-list.phtml
index aab0e1066fe..d6edbf31147 100644
--- a/themes/finc/templates/RecordDriver/FincMissing/result-list.phtml
+++ b/themes/finc/templates/RecordDriver/FincMissing/result-list.phtml
@@ -13,7 +13,7 @@ $thumbnail = false;
 $thumbnailAlignment = $this->record($this->driver)->getThumbnailAlignment('result');
 if ($cover):
   ob_start(); ?>
-  <div class="media-<?=$thumbnailAlignment?> <?=$this->escapeHtmlAttr($coverDetails['size'])?>" aria-hidden="true">
+  <div class="media-<?=$thumbnailAlignment?> <?=$this->escapeHtmlAttr($coverDetails['size'])?>">
     <?=$cover?>
   </div>
   <?php $thumbnail = ob_get_contents(); ?>
diff --git a/themes/finc/templates/RecordDriver/SolrAI/core.phtml b/themes/finc/templates/RecordDriver/SolrAI/core.phtml
index 0898ed1578e..8ff58d1fdd3 100644
--- a/themes/finc/templates/RecordDriver/SolrAI/core.phtml
+++ b/themes/finc/templates/RecordDriver/SolrAI/core.phtml
@@ -10,7 +10,7 @@
   $preview = $this->record($this->driver)->getPreviews();
   ?>
   <?php if ($QRCode || $cover || $preview): ?>
-    <div class="media-left <?= $this->escapeHtmlAttr($coverDetails['size']) ?> img-col" aria-hidden="<?=$cover?'true':'false'?>">
+    <div class="media-left <?= $this->escapeHtmlAttr($coverDetails['size']) ?> img-col">
       <?php /* Display thumbnail if appropriate: */ ?>
       <?php if ($cover): ?>
         <?=$cover?>
diff --git a/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml b/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml
index 0b8dc222334..16be9bd855b 100644
--- a/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml
+++ b/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml
@@ -16,6 +16,7 @@ if ($cover):
   <?php ob_start(); ?>
   <div class="media-<?=$thumbnailAlignment?> record-icon">
     <?=$this->record($this->driver)->getRecordIcon()?>
+    <?=$this->record($this->driver)->getRecordIconText()?>
   </div>
   <?php $thumbnail = ob_get_contents(); ?>
   <?php ob_end_clean(); ?>
diff --git a/themes/finc/templates/RecordDriver/SolrLido/core.phtml b/themes/finc/templates/RecordDriver/SolrLido/core.phtml
index a2022ca6cc3..8eed15270f9 100644
--- a/themes/finc/templates/RecordDriver/SolrLido/core.phtml
+++ b/themes/finc/templates/RecordDriver/SolrLido/core.phtml
@@ -30,7 +30,7 @@
   $preview = $this->record($this->driver)->getPreviews();
   ?>
   <?php if ($QRCode || $cover || $preview): ?>
-    <div class="media-left <?=$this->escapeHtmlAttr($coverDetails['size'])?> img-col" aria-hidden="<?=$cover?'true':'false'?>">
+    <div class="media-left <?=$this->escapeHtmlAttr($coverDetails['size'])?> img-col"?>">
       <?php /* Display thumbnail if appropriate: */ ?>
       <?php if ($cover): ?>
         <?=$cover?>
diff --git a/themes/finc/templates/RecordDriver/SolrMarc/core.phtml b/themes/finc/templates/RecordDriver/SolrMarc/core.phtml
index d0013407559..36078b3bbbd 100644
--- a/themes/finc/templates/RecordDriver/SolrMarc/core.phtml
+++ b/themes/finc/templates/RecordDriver/SolrMarc/core.phtml
@@ -10,7 +10,7 @@
   $preview = $this->record($this->driver)->getPreviews();
   ?>
   <?php if ($QRCode || $cover || $preview): ?>
-  <div class="media-left <?=$this->escapeHtmlAttr($coverDetails['size'])?> img-col" aria-hidden="<?=$cover?'true':'false'?>">
+  <div class="media-left <?=$this->escapeHtmlAttr($coverDetails['size'])?> img-col">
       <?php /* Display thumbnail if appropriate: */ ?>
       <?php if ($cover): ?>
         <?=$cover?>
diff --git a/themes/finc/templates/myresearch/historicloans.phtml b/themes/finc/templates/myresearch/historicloans.phtml
index a86d384a051..44605abc8de 100644
--- a/themes/finc/templates/myresearch/historicloans.phtml
+++ b/themes/finc/templates/myresearch/historicloans.phtml
@@ -51,7 +51,7 @@
           $thumbnailAlignment = $this->record($resource)->getThumbnailAlignment('account');
           if ($cover):
             ob_start(); ?>
-            <div class="media-<?=$thumbnailAlignment ?> <?=$this->escapeHtmlAttr($coverDetails['size'])?>" aria-hidden="true">
+            <div class="media-<?=$thumbnailAlignment ?> <?=$this->escapeHtmlAttr($coverDetails['size'])?>">
               <?=$cover ?>
             </div>
             <?php $thumbnail = ob_get_contents();
diff --git a/themes/finc/templates/myresearch/illrequests.phtml b/themes/finc/templates/myresearch/illrequests.phtml
index 32f59dd9217..6f87f860b07 100644
--- a/themes/finc/templates/myresearch/illrequests.phtml
+++ b/themes/finc/templates/myresearch/illrequests.phtml
@@ -66,7 +66,7 @@
           $thumbnailAlignment = $this->record($resource)->getThumbnailAlignment('account');
           if ($cover):
             ob_start(); ?>
-            <div class="media-<?=$thumbnailAlignment ?> <?=$this->escapeHtmlAttr($coverDetails['size'])?>" aria-hidden="true">
+            <div class="media-<?=$thumbnailAlignment ?> <?=$this->escapeHtmlAttr($coverDetails['size'])?>">
               <?=$cover ?>
             </div>
             <?php $thumbnail = ob_get_contents(); ?>
diff --git a/themes/finc/templates/record/cover.phtml b/themes/finc/templates/record/cover.phtml
index d528c97f635..ccc96247aef 100644
--- a/themes/finc/templates/record/cover.phtml
+++ b/themes/finc/templates/record/cover.phtml
@@ -3,22 +3,31 @@
 <?php /* If you want to load covers in lightbox use .recordcover;
   the class .nocover prevents nocover images from loading in lightbox or can be used to hide the images */ ?>
 <?php $alt = $alt ?? $this->transEsc('Cover Image')?>
+<?php $coverId = "cover-" . $driver->getUniqueID() . "-" . time(); ?>
 <?php if ($cover): ?>
-  <?php if ($this->link): ?><a href="<?=$this->escapeHtmlAttr($this->link)?>" target="_blank" tabindex="-1"><?php endif; ?>
-  <img alt="<?=$alt?>" <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?>class="recordcover" src="<?=$this->escapeHtmlAttr($cover); ?>" aria-hidden="true"/>
-  <?php if ($this->link): ?></a><?php endif; ?>
+  <?php if ($this->link): ?><a id="<?=$coverId?>" href="<?=$this->escapeHtmlAttr($this->link)?>" tabindex="-1" aria-hidden="true"><?php endif; ?>
+  <img alt="<?=$alt?>" <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?>class="recordcover" src="<?=$this->escapeHtmlAttr($cover); ?>" />
+  <?php if ($this->link): ?>
+  </a>
+  <script>
+    registerCoverForModal($('#<?=$coverId?>'), '<?=$this->link?>');
+  </script>
+  <?php endif; ?>
 <?php elseif ($cover === false): ?>
-  <img src="<?=$this->url('cover-unavailable')?>" <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?>class="nocover" alt="<?=$this->transEsc('No Cover Image')?>" aria-hidden="true" />
+  <img src="<?=$this->url('cover-unavailable')?>" <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?>class="nocover" alt="<?=$this->transEsc('No Cover Image')?>" aria-hidden="true" tabindex="-1" />
 <?php else: ?>
-    <div id="cover-<?=$driver->getUniqueID()?>" class="ajaxcover">
-        <div class="spinner"><i class="fa fa-spinner fa-spin"></i></div>
-        <div class="cover-container">
-          <?=$this->render('record/coverReplacement')?>
-          <a class="coverlink hidden" tabindex="-1">
-            <img src onerror="loadCoverByElement({source:'<?=$this->escapeHtmlAttr($driver->getSourceIdentifier())?>', recordId:'<?=$this->escapeHtmlAttr($driver->getUniqueID())?>', size:'<?=$this->escapeHtmlAttr($size)?>'}, $('#cover-<?=$driver->getUniqueID()?>'))"
-              <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?> class="recordcover ajax" alt="<?=$this->escapeHtmlAttr($alt); ?>" />
-          </a>
-        </div>
-    </div>
+  <div id="<?=$coverId?>" class="ajaxcover">
+      <div class="spinner"><i class="fa fa-spinner fa-spin"></i></div>
+      <div class="cover-container">
+        <?=$this->render('record/coverReplacement')?>
+        <a class="coverlink hidden" aria-hidden="true" tabindex="-1">
+          <img <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?> class="recordcover ajax" alt="<?=$this->escapeHtmlAttr($alt); ?>" />
+        </a>
+        <script>
+          loadCoverByElement({source:'<?=$this->escapeHtmlAttr($driver->getSourceIdentifier())?>', recordId:'<?=$this->escapeHtmlAttr($driver->getUniqueID())?>', size:'<?=$this->escapeHtmlAttr($size)?>'}, $('#<?=$coverId?>'));
+        </script>
+      </div>
+  </div>
 <?php endif; ?>
+<?=$this->record($this->driver)->getRecordIconText()?>
 <!-- finc: record - cover - END -->
-- 
GitLab