From 496fa18d95969c91c7c31be3e217b181d7b957f9 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Mon, 14 Sep 2020 17:35:02 +0200 Subject: [PATCH 01/14] first shot at implementing #359 --- catalogues/dictionary_de.xml | 5 ++++- catalogues/dictionary_en.xml | 5 ++++- modules/api.xqm | 11 +++++++++++ modules/facets.xqm | 29 ++++++++++++++++++++++++++++- modules/search.xqm | 12 +++++++++++- templates/ajax/correspondence.html | 2 ++ templates/ajax/documents.html | 3 +++ 7 files changed, 63 insertions(+), 4 deletions(-) diff --git a/catalogues/dictionary_de.xml b/catalogues/dictionary_de.xml index b7cb8716c..d03d80bef 100644 --- a/catalogues/dictionary_de.xml +++ b/catalogues/dictionary_de.xml @@ -600,4 +600,7 @@ Nächstes Suchergebnis Datenübernahme aus weitere Informationen siehe dort - + intern (WeGA) + extern + ohne + \ No newline at end of file diff --git a/catalogues/dictionary_en.xml b/catalogues/dictionary_en.xml index 6532c8891..db166a167 100644 --- a/catalogues/dictionary_en.xml +++ b/catalogues/dictionary_en.xml @@ -570,4 +570,7 @@ Next Match Data migrated from further information see there - + internal (WeGA) + external + without + \ No newline at end of file diff --git a/modules/api.xqm b/modules/api.xqm index 475333569..9e43a1e77 100644 --- a/modules/api.xqm +++ b/modules/api.xqm @@ -733,6 +733,17 @@ declare function api:validate-repository($model as map()) as map()? { else error($api:INVALID_PARAMETER, 'Unsupported value for parameter "repository".' ) }; + +(:~ + : Check parameter facsimile ('internal','external','without') + : multiple values allowed as input, either by providing multiple URL parameters + : or by sending a comma separated list as the value of one URL parameter +~:) +declare function api:validate-facsimile($model as map()) as map()? { + if(xmldb:decode-uri($model?facsimile) = ('internal','external','without')) then $model + else error($api:INVALID_PARAMETER, 'Unsupported value for parameter "facsimile". Must be one of "internal", "external", or "without".') +}; + (:~ : Fallback for unknown API parameters : Simply returns an error message diff --git a/modules/facets.xqm b/modules/facets.xqm index 85fe3211e..fd78fcc4a 100644 --- a/modules/facets.xqm +++ b/modules/facets.xqm @@ -39,7 +39,7 @@ declare let $facet := $node/data(@name) let $selected := $model?filters?($facet) let $selectedObjs as array(*)? := - if(count($selected) gt 0) then facets:createFacets($model?search-results, $facet, -1, $lang) + if(count($selected) gt 0) then facets:facets($model?search-results, $facet, -1, $lang) else () return element {name($node)} { @@ -67,6 +67,7 @@ declare declare function facets:facets($nodes as node()*, $facet as xs:string, $max as xs:integer, $lang as xs:string) as array(*) { switch($facet) case 'textType' return facets:from-docType($nodes, $facet, $lang) + case 'facsimile' return facets:facsimile($nodes, $facet, $lang) default return facets:createFacets($nodes, $facet, $max, $lang) }; @@ -84,6 +85,32 @@ declare %private function facets:from-docType($collection as node()*, $facet as ] }; +declare %private function facets:facsimile($collection as node()*, $facet as xs:string, $lang as xs:string) as array(*) { + let $facsimiles := $collection ! query:facsimile(.) + let $external := count($facsimiles[@sameAs]/root()) + let $internal := count($facsimiles[not(@sameAs)][tei:graphic]/root()) + let $noFacs := count($collection) - $external - $internal + return + [ + map { + 'value' : 'internal', + 'label' : lang:get-language-string('internal', $lang), + 'frequency' : $internal + }, + map { + 'value' : 'external', + 'label' : lang:get-language-string('external', $lang), + 'frequency' : $external + }, + map { + 'value' : 'without', + 'label' : lang:get-language-string('without', $lang), + 'frequency' : $noFacs + } + ] +}; + + (:~ : Create facets : diff --git a/modules/search.xqm b/modules/search.xqm index 389ebd7dc..a993b6231 100644 --- a/modules/search.xqm +++ b/modules/search.xqm @@ -34,7 +34,7 @@ declare variable $search:valid-params := ('biblioType', 'editors', 'authors', 'w 'occupations', 'docSource', 'composers', 'librettists', 'lyricists', 'dedicatees', 'journals', 'docStatus', 'addressee', 'sender', 'textType', 'residences', 'places', 'placeOfAddressee', 'placeOfSender', 'fromDate', 'toDate', 'undated', 'hideRevealed', 'docTypeSubClass', 'sex', 'surnames', 'forenames', - 'asksam-cat', 'vorlageform', 'einrichtungsform', 'placenames', 'repository'); + 'asksam-cat', 'vorlageform', 'einrichtungsform', 'placenames', 'repository', 'facsimile'); (:~ : Main function called from the templating module @@ -302,6 +302,7 @@ declare %private function search:filter-result($collection as document-node()*, else if($filter = ('fromDate', 'toDate')) then wdt:lookup($docType, $collection)?filter-by-date(try {$filters?fromDate cast as xs:date} catch * {()}, try {$filters?toDate cast as xs:date} catch * {()} ) else if($filter = 'textType') then search:textType-filter($collection, $filters) else if($filter = 'hideRevealed') then search:revealed-filter($collection, $filters) + else if($filter = 'facsimile') then search:facsimile-filter($collection, $filters) (: exact search for terms -> range:eq :) else if($filter = ('journals', 'forenames', 'surnames', 'sex', 'occupations')) then query:get-facets($collection, $filter)[range:eq(.,$filters($filter))]/root() (: range:contains for tokens within key values :) @@ -350,6 +351,15 @@ declare %private function search:revealed-filter($collection as document-node()* $collection//tei:correspDesc[not(@n='revealed')]/root() }; +declare %private function search:facsimile-filter($collection as document-node()*, $filters as map(*)) as document-node()* { + let $facsimiles := $collection ! query:facsimile(.) + return + switch($filters?facsimile) + case 'internal' return $facsimiles[not(@sameAs)][tei:graphic]/root() + case 'external' return $facsimiles[@sameAs]/root() + default return $collection except $facsimiles/root() +}; + (:~ : ~:) diff --git a/templates/ajax/correspondence.html b/templates/ajax/correspondence.html index f4a753189..2703daec7 100644 --- a/templates/ajax/correspondence.html +++ b/templates/ajax/correspondence.html @@ -26,6 +26,8 @@

works

+

facsimile

+ diff --git a/templates/ajax/documents.html b/templates/ajax/documents.html index 10ec9fe44..ae27cd591 100644 --- a/templates/ajax/documents.html +++ b/templates/ajax/documents.html @@ -21,6 +21,9 @@

docType

repository

+

docStatus

+

Faksimile

+

Dokumentenstatus

diff --git a/testing/expected-results/var/Dokumente b/testing/expected-results/var/Dokumente index 15c5ca44b..cb154b4fe 100644 --- a/testing/expected-results/var/Dokumente +++ b/testing/expected-results/var/Dokumente @@ -255,6 +255,10 @@ +

Faksimile

+ +

Dokumentenstatus

From dc35fd449a551602a19675d7ec4cf3a9da788a43 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 16 Sep 2020 00:17:07 +0200 Subject: [PATCH 09/14] fix expected result --- testing/expected-results/var/Dokumente | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/expected-results/var/Dokumente b/testing/expected-results/var/Dokumente index cb154b4fe..e14321c61 100644 --- a/testing/expected-results/var/Dokumente +++ b/testing/expected-results/var/Dokumente @@ -256,7 +256,7 @@

Faksimile

-

Dokumentenstatus

From 21e9df5c7cf8987850d887a39438a59a0474931e Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 16 Sep 2020 08:17:23 +0200 Subject: [PATCH 10/14] yet another fix for multiple values --- modules/search.xqm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/search.xqm b/modules/search.xqm index bd592ffa0..af07eaf40 100644 --- a/modules/search.xqm +++ b/modules/search.xqm @@ -372,10 +372,12 @@ declare %private function search:revealed-filter($collection as document-node()* declare %private function search:facsimile-filter($collection as document-node()*, $filters as map(*)) as document-node()* { let $facsimiles := $collection ! query:facsimile(.) return - switch($filters?facsimile) - case 'internal' return $facsimiles[not(@sameAs)][tei:graphic]/root() - case 'external' return $facsimiles[@sameAs]/root() - default return $collection except $facsimiles/root() + for $filter in $filters?facsimile + return + switch($filter) + case 'internal' return $facsimiles[not(@sameAs)][tei:graphic]/root() + case 'external' return $facsimiles[@sameAs]/root() + default return $collection except $facsimiles/root() }; (:~ From 156ead0e3eaaafe750da234ef06b7e435871d8b8 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 16 Sep 2020 08:27:28 +0200 Subject: [PATCH 11/14] add translation of facsimile facet --- modules/facets.xqm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/facets.xqm b/modules/facets.xqm index e800c509d..ae2508c1a 100644 --- a/modules/facets.xqm +++ b/modules/facets.xqm @@ -153,7 +153,7 @@ declare %private function facets:display-term($facet as xs:string, $term as xs:s case 'sex' return if($term ='Art der Institution') then lang:get-language-string('organisationsInstitutions', $lang) else lang:get-language-string('sex_' || $term, $lang) - case 'docTypeSubClass' case 'docStatus' case 'textType' return lang:get-language-string($term, $lang) + case 'docTypeSubClass' case 'docStatus' case 'textType' case 'facsimile' return lang:get-language-string($term, $lang) case 'repository' return facets:display-term-repository($term) default return str:normalize-space($term) }; From b740ee9ef0a29aa723c02c599063acbddcf9d962 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 16 Sep 2020 08:27:47 +0200 Subject: [PATCH 12/14] add facsimile facet to writings list view --- templates/ajax/writings.html | 3 +++ testing/expected-results/var/Schriften | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/templates/ajax/writings.html b/templates/ajax/writings.html index 89a7170ff..0bb57dae0 100644 --- a/templates/ajax/writings.html +++ b/templates/ajax/writings.html @@ -26,6 +26,9 @@

journals

docType

+

docStatus

+

Faksimile

+ +

Dokumentenstatus

From 240625540ee65218fdc03bafe8b04a0f1a0f5706 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 16 Sep 2020 09:01:25 +0200 Subject: [PATCH 13/14] fix propagation of dates --- resources/js/init.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/resources/js/init.js b/resources/js/init.js index bb236a5de..af584c0a0 100644 --- a/resources/js/init.js +++ b/resources/js/init.js @@ -51,6 +51,8 @@ $.fn.facets = function () limit = 25, newParams; //console.log(curParams); + delete curParams.sliderDates.oldFromDate; // delete the property oldFromDate and oldToDate which we don't need for the facets and which is not a valid API parameter + delete curParams.sliderDates.oldToDate; $(this).each( function(a, b) { $(b).select2({ closeOnSelect: false, @@ -72,6 +74,7 @@ $.fn.facets = function () //lang: getLanguage() }, curParams.facets, + curParams.sliderDates, { limit: limit } // need to go after curParams.facets to overwrite the limit setting there ) return query; @@ -720,8 +723,14 @@ function active_facets() { to=slider.attr('data-to-slider'); min=slider.attr('data-min-slider'); max=slider.attr('data-max-slider'); - if(from > min) { params.sliderDates.fromDate = from } - if(to < max) { params.sliderDates.toDate = to } + if(from > min) { + params.sliderDates.fromDate = from; + params.sliderDates.oldFromDate = min; + } + if(to < max) { + params.sliderDates.toDate = to; + params.sliderDates.oldToDate = max; + } } /* get values from checkboxes for docTypes at search page * as well as for other checkboxes on list pages like 'revealed' or 'undated' From 449494f4cf4ec176eb29649e01bebd279c02c1cc Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 16 Sep 2020 09:09:28 +0200 Subject: [PATCH 14/14] output zero for unavailable options --- modules/facets.xqm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/facets.xqm b/modules/facets.xqm index ae2508c1a..d1a77ce49 100644 --- a/modules/facets.xqm +++ b/modules/facets.xqm @@ -54,12 +54,16 @@ declare for $i in $selected (: let $log := util:log-system-out($i):) let $display-term := facets:display-term($facet, $i, $lang) - order by $display-term + let $freq := + if ($selectedObjs?*[?value = $i]?frequency castable as xs:int) + then $selectedObjs?*[?value = $i]?frequency + else 0 + order by $display-term return element option { attribute selected {'selected'}, attribute value {$i}, - $display-term || ' (' || $selectedObjs?*[?value = $i]?frequency || ')' + $display-term || ' (' || $freq || ')' } } };