Loading plugins/ead_search/ead_search.css +47 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,10 @@ margin-top: 100px; } .ead-search button{ cursor: pointer; } .ead-search-ul { list-style-type: none; display: inline-block; Loading Loading @@ -56,12 +60,54 @@ top:0; left: 10px; border:1px solid #999; min-width:400px; min-width:500px; background-color: white; z-index:10; font-size:0.8rem; } .ead-search-close-popup { position: absolute; top :5px; right: 5px; } .ead-search-popup button { border-radius: 16px; border: 1px solid #ccc; display:flex; justify-content: center; align-items: center; max-width: 32px; max-height: 32px; min-width: 32px; min-height: 32px; } .ead-search-popup ul { list-style-type: none; margin-left: 0; padding-left:0; } .ead-search-popup-alphabet{ text-align :center; } .ead-search-index-pager{ display:flex; justify-content: center; align-items: center; } .ead-search-index-pager button{ margin: 5px; } .ead-search-index-pager input{ max-width: 80px; } .ead-search-index-n{ display: inline-block; margin-right: 15px; min-width: 25px; font-weight: bold; text-align:right; } No newline at end of file plugins/ead_search/ead_search.js +99 −14 Original line number Diff line number Diff line import {Plugin} from '../../core/ui/js/Plugin.js'; const PAGE_LENGTH = 10; class EadSearchPlugin extends Plugin{ constructor(name) { Loading Loading @@ -57,22 +57,58 @@ class EadSearchPlugin extends Plugin{ } togglePopup(tagName){ let popupElt = document.getElementById('ead-search-popup-'+tagName); if(popupElt.style.display=='block'){ popupElt.style.display = 'none'; } else this.popupIndex(tagName); } popupIndex(tagName){ if(!document.getElementById('ul-'+tagName)){//needs first fetch this.fetchPage(tagName, 1); } let popupElt = document.getElementById('ead-search-popup-'+tagName); popupElt.style.display='block'; } fetchPage(tagName, pageNumber){ let popupElt = document.getElementById('ead-search-popup-'+tagName); let popupContent = document.getElementById('ead-search-popup-'+tagName+"-contents"); popupContent.innerHTML = ''; let url = baseURI + projectId + '/search-index/'+tagName+'.json'; let list = document.createElement('ol'); fetch(baseURI + projectId + '/search-index/'+tagName+'.json').then((res) => res.json()).then( (json) => { //popupContent.innerHTML = ''; //let url = baseURI + projectId + '/search-index/'+tagName+'.json?p='+pageNumber; let listTarget = document.getElementById('ul-'+tagName); if(!listTarget){ listTarget = document.createElement('ul'); listTarget.setAttribute('id', 'ul-'+tagName); popupContent.appendChild(listTarget); } fetch(baseURI + projectId + '/search-index/'+tagName+'.json?page='+pageNumber).then((res) => res.json()).then( (json) => { let entries = json.entries entries.forEach((entry) => { let total = json.total; if(pageNumber === 1) { let totalElt = document.createElement('h5'); totalElt.innerHTML = total + (entries > 1 ? ' entrée' : ' entrées'); popupContent.appendChild(totalElt); } listTarget.innerHTML = ''; entries.forEach((entry, n) => { let li = document.createElement('li'); li.innerHTML = decodeURIComponent(entry.normal); list.appendChild(li); }) let spanNumber = document.createElement('span'); spanNumber.classList.add('ead-search-index-n'); spanNumber.innerHTML = (PAGE_LENGTH * (pageNumber-1) + n + 1); let entryText = document.createTextNode(decodeURIComponent(entry.normal)); li.appendChild(spanNumber); li.appendChild(entryText); listTarget.appendChild(li); }); if(!document.getElementById('ead-search-index-pager-'+tagName)) popupContent.appendChild(this.buildPager(tagName, total)); }) popupContent.appendChild(list); popupElt.style.display='block'; } // // fetchIndexLists(){ Loading Loading @@ -126,6 +162,55 @@ class EadSearchPlugin extends Plugin{ }) } buildPager(tagName, total, url){ let nbPage = Math.floor(total / PAGE_LENGTH); console.log('nbPager = ' + nbPage) let pagerElt = document.createElement('div'); let firstArrowElt = document.createElement('button'); firstArrowElt.innerHTML = '<<'; let prevArrowElt = document.createElement('button'); prevArrowElt.innerHTML = '<'; let lastArrowElt = document.createElement('button'); lastArrowElt.innerHTML = '>>'; let nextArrowElt = document.createElement('button'); nextArrowElt.innerHTML = '>'; let inputPageElt = document.createElement('input'); inputPageElt.type='number'; inputPageElt.value=1; pagerElt.appendChild(firstArrowElt); pagerElt.appendChild(prevArrowElt); pagerElt.appendChild(inputPageElt); pagerElt.appendChild(nextArrowElt); pagerElt.appendChild(lastArrowElt); let gotoPage = function(n){ inputPageElt.value = n; inputPageElt.dispatchEvent(new Event('change')); } firstArrowElt.addEventListener('click', () => gotoPage(1)); prevArrowElt.addEventListener('click', () => gotoPage(Number(inputPageElt.value)-1)); lastArrowElt.addEventListener('click', () => gotoPage(nbPage)); nextArrowElt.addEventListener('click', () => gotoPage(Number(inputPageElt.value)+1)); inputPageElt.addEventListener('change', (evt) => { let pageTarget = inputPageElt.value; this.fetchPage(tagName, pageTarget); }) // for(let i = 1; i <= nbPage; i++){ // let pageElt = document.createElement('span'); // pageElt.innerHTML = i; // pagerElt.appendChild(pageElt); // } pagerElt.classList.add('ead-search-index-pager'); pagerElt.setAttribute('id','ead-search-index-pager-'+tagName) return pagerElt; } runEadSearch(){ let query = 'resultats.html'; Loading plugins/ead_search/ead_search.xqm +54 −27 Original line number Diff line number Diff line Loading @@ -29,10 +29,17 @@ function max.plugin.ead_search:searchPage($project){ <label>{string($indexTag/@label)}</label> <input type="text" class="ead-search-input" data-index="{$tagName}" id="{$tagName}-input" list="{$tagName}" multiple="multiple"></input> <div class="ead-search-popup-wrap"> <button onclick="window.eadSearch.popupIndex('{$tagName}')">📖</button> <button onclick="window.eadSearch.togglePopup('{$tagName}')">📖</button> <div class="ead-search-popup" id="ead-search-popup-{$tagName}"> <button class="ead-search-close-popup" onclick="window.eadSearch.togglePopup('{$tagName}')">×</button> <div id="ead-search-popup-{$tagName}-alphabet" class="ead-search-popup-alphabet"> {for $l in 1 to 26 return <a>{codepoints-to-string(($l+64))}</a>} {for $l in 1 to 26 return let $letter:= codepoints-to-string($l+64) return <a>{codepoints-to-string($l+64)}</a> (: if(max.plugin.ead_search:countTagsWithFirstLetter($project, $tagName, $letter) > 0):) (: then <a>{codepoints-to-string($l+64)}</a>:) (: else():) } </div> <div id="ead-search-popup-{$tagName}-contents"></div> </div> Loading Loading @@ -94,19 +101,10 @@ function max.plugin.ead_search:runSearch($project as xs:string, $indexes as xs:s let $joinedSubQueries := fn:string-join($subqueries,'') let $fullQuery := $queryStart || $joinedSubQueries || ' return $c' (: let $fullQuery := $queryStart:) (: || (if($joinedSubQueries) then ($joinedSubQueries ||' and ') else ' where '):) (: || max.plugin.ead_search:buildDateQuery($project, $from, $to, $in)||' return $c':) (: fn:string-join($subqueries,'') || ' ' || max.plugin.ead_search:buildDateQuery($project, $from, $to, $in)||' return $c':) (: return $fullQuery:) return try{ let $matches := max.plugin.ead_search:dateFilter( $project,$from, $to, $in, xquery:eval($fullQuery, map { '': db:open($dbPath) })) let $html:= <ul>{ for $c in $matches return <li>{$c/*:did/*:unitid/text()} | <em>{string($c/*:did/*:unitdate[1]/@normal)}</em></li> Loading Loading @@ -184,8 +182,7 @@ declare %private function max.plugin.ead_search:dateIntervalFilter($from as xs:s }; declare function max.plugin.ead_search:buildSimpleDateQuery($project as xs:string, $in as xs:string){ '2=2' true() (: xs:dateTime(max.plugin.ead_search:parseDateParameter($from)) || ' to ' || xs:dateTime(max.plugin.ead_search:parseDateParameter($to)):) }; Loading @@ -203,18 +200,30 @@ function max.plugin.ead_search:searchIndexesListAsJSON($project, $tag, $page as order by $entry/@normal where fn:string-length($entry/@normal) > 0 return '{"normal":"' || encode-for-uri($entry/@normal) || '", "tag":"' || $tag || '", "role" :"'||$entry/@role||'"}' return json:parse('{"entries" :[' || string-join($jsonStr,',') ||']}') return json:parse( '{ "entries" :[' || string-join($jsonStr,',') ||'], "total": '||$entries/@total||', "start" :'||$entries/@start||', "end" : '||$entries/@end||' }') }; declare %private function max.plugin.ead_search:searchIndexesList($project, $tag, $page as xs:integer, $query as xs:string?){ declare %rest:GET %rest:query-param("q", "{$query}") %rest:query-param("page", "{$page}",1) %rest:path("/{$project}/search-index/{$tag}.xml") function max.plugin.ead_search:searchIndexesList($project, $tag, $page as xs:integer, $query as xs:string?){ let $pageLength := 10 let $dbPath := max.config:getProjectDBPath($project) let $tagParameters := max.plugin.ead_search:getSearchConfiguration($project)//tag[@name=$tag] (:select all nodes with required tag and attributes :) let $allEntries := for $elt in collection($dbPath)//*[fn:local-name()=$tag and @normal] order by $elt/@normal where( if($tagParameters/@attribute) then $elt/@*[local-name(.)=string($tagParameters/@attribute) and string(.)=string($tagParameters/@value)] Loading @@ -233,25 +242,43 @@ declare %private function max.plugin.ead_search:searchIndexesList($project, $tag return string($e/@normal) (:positions computing according to page number:) let $start := $page * 10 - 9 let $end := $start + 10 let $start := $page * $pageLength - ($pageLength -1) let $end := $start + $pageLength (:filter : avoid doublons:) return <entries>{ return <entries total='{count(distinct-values($allNormals))}' start='{$start}' end='{($end - 1)}'>{ for $normal at $pos in distinct-values($allNormals) order by $normal where $pos >= $start and $pos < $end return $allEntries[@normal=$normal][1] }</entries> } </entries> }; }; (: declare %private function max.plugin.ead_search:countTagsWithFirstLetter($project, $tagName, $letter){ let $dbPath := max.config:getProjectDBPath($project) let $tagParameters := max.plugin.ead_search:getSearchConfiguration($project)//tag[@name=$tagName] let $nodes := for $elt in collection($dbPath)//*[fn:local-name()=$tagName and @normal] where( if($tagParameters/@attribute) then $elt/@*[local-name(.)=string($tagParameters/@attribute) and string(.)=string($tagParameters/@value)] else true() ) and( starts-with($elt/@normal, $letter) ) return $elt return count($nodes) }; :) (:test index:) (:----------------------------test index-------------------------------------------:) declare Loading rxq/config.xqm +8 −2 Original line number Diff line number Diff line Loading @@ -57,8 +57,14 @@ declare function max.config:getPluginByName($projectId, $pluginName){ }; declare function max.config:getPluginParameterValue($projectId, $pluginName, $parameterKey){ doc($max.config:CONFIGURATION_FILE)//edition[@xml:id=$projectId]//plugin[@name=$pluginName] //parameter[@key=$parameterKey]/@value/string() let $param := doc($max.config:CONFIGURATION_FILE)//edition[@xml:id=$projectId]//plugin[@name=$pluginName] //parameter[@key=$parameterKey] return if($param/@value) then $param/@value/string() else $param (: doc($max.config:CONFIGURATION_FILE)//edition[@xml:id=$projectId]//plugin[@name=$pluginName]:) (: //parameter[@key=$parameterKey]/@value/string():) }; Loading Loading
plugins/ead_search/ead_search.css +47 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,10 @@ margin-top: 100px; } .ead-search button{ cursor: pointer; } .ead-search-ul { list-style-type: none; display: inline-block; Loading Loading @@ -56,12 +60,54 @@ top:0; left: 10px; border:1px solid #999; min-width:400px; min-width:500px; background-color: white; z-index:10; font-size:0.8rem; } .ead-search-close-popup { position: absolute; top :5px; right: 5px; } .ead-search-popup button { border-radius: 16px; border: 1px solid #ccc; display:flex; justify-content: center; align-items: center; max-width: 32px; max-height: 32px; min-width: 32px; min-height: 32px; } .ead-search-popup ul { list-style-type: none; margin-left: 0; padding-left:0; } .ead-search-popup-alphabet{ text-align :center; } .ead-search-index-pager{ display:flex; justify-content: center; align-items: center; } .ead-search-index-pager button{ margin: 5px; } .ead-search-index-pager input{ max-width: 80px; } .ead-search-index-n{ display: inline-block; margin-right: 15px; min-width: 25px; font-weight: bold; text-align:right; } No newline at end of file
plugins/ead_search/ead_search.js +99 −14 Original line number Diff line number Diff line import {Plugin} from '../../core/ui/js/Plugin.js'; const PAGE_LENGTH = 10; class EadSearchPlugin extends Plugin{ constructor(name) { Loading Loading @@ -57,22 +57,58 @@ class EadSearchPlugin extends Plugin{ } togglePopup(tagName){ let popupElt = document.getElementById('ead-search-popup-'+tagName); if(popupElt.style.display=='block'){ popupElt.style.display = 'none'; } else this.popupIndex(tagName); } popupIndex(tagName){ if(!document.getElementById('ul-'+tagName)){//needs first fetch this.fetchPage(tagName, 1); } let popupElt = document.getElementById('ead-search-popup-'+tagName); popupElt.style.display='block'; } fetchPage(tagName, pageNumber){ let popupElt = document.getElementById('ead-search-popup-'+tagName); let popupContent = document.getElementById('ead-search-popup-'+tagName+"-contents"); popupContent.innerHTML = ''; let url = baseURI + projectId + '/search-index/'+tagName+'.json'; let list = document.createElement('ol'); fetch(baseURI + projectId + '/search-index/'+tagName+'.json').then((res) => res.json()).then( (json) => { //popupContent.innerHTML = ''; //let url = baseURI + projectId + '/search-index/'+tagName+'.json?p='+pageNumber; let listTarget = document.getElementById('ul-'+tagName); if(!listTarget){ listTarget = document.createElement('ul'); listTarget.setAttribute('id', 'ul-'+tagName); popupContent.appendChild(listTarget); } fetch(baseURI + projectId + '/search-index/'+tagName+'.json?page='+pageNumber).then((res) => res.json()).then( (json) => { let entries = json.entries entries.forEach((entry) => { let total = json.total; if(pageNumber === 1) { let totalElt = document.createElement('h5'); totalElt.innerHTML = total + (entries > 1 ? ' entrée' : ' entrées'); popupContent.appendChild(totalElt); } listTarget.innerHTML = ''; entries.forEach((entry, n) => { let li = document.createElement('li'); li.innerHTML = decodeURIComponent(entry.normal); list.appendChild(li); }) let spanNumber = document.createElement('span'); spanNumber.classList.add('ead-search-index-n'); spanNumber.innerHTML = (PAGE_LENGTH * (pageNumber-1) + n + 1); let entryText = document.createTextNode(decodeURIComponent(entry.normal)); li.appendChild(spanNumber); li.appendChild(entryText); listTarget.appendChild(li); }); if(!document.getElementById('ead-search-index-pager-'+tagName)) popupContent.appendChild(this.buildPager(tagName, total)); }) popupContent.appendChild(list); popupElt.style.display='block'; } // // fetchIndexLists(){ Loading Loading @@ -126,6 +162,55 @@ class EadSearchPlugin extends Plugin{ }) } buildPager(tagName, total, url){ let nbPage = Math.floor(total / PAGE_LENGTH); console.log('nbPager = ' + nbPage) let pagerElt = document.createElement('div'); let firstArrowElt = document.createElement('button'); firstArrowElt.innerHTML = '<<'; let prevArrowElt = document.createElement('button'); prevArrowElt.innerHTML = '<'; let lastArrowElt = document.createElement('button'); lastArrowElt.innerHTML = '>>'; let nextArrowElt = document.createElement('button'); nextArrowElt.innerHTML = '>'; let inputPageElt = document.createElement('input'); inputPageElt.type='number'; inputPageElt.value=1; pagerElt.appendChild(firstArrowElt); pagerElt.appendChild(prevArrowElt); pagerElt.appendChild(inputPageElt); pagerElt.appendChild(nextArrowElt); pagerElt.appendChild(lastArrowElt); let gotoPage = function(n){ inputPageElt.value = n; inputPageElt.dispatchEvent(new Event('change')); } firstArrowElt.addEventListener('click', () => gotoPage(1)); prevArrowElt.addEventListener('click', () => gotoPage(Number(inputPageElt.value)-1)); lastArrowElt.addEventListener('click', () => gotoPage(nbPage)); nextArrowElt.addEventListener('click', () => gotoPage(Number(inputPageElt.value)+1)); inputPageElt.addEventListener('change', (evt) => { let pageTarget = inputPageElt.value; this.fetchPage(tagName, pageTarget); }) // for(let i = 1; i <= nbPage; i++){ // let pageElt = document.createElement('span'); // pageElt.innerHTML = i; // pagerElt.appendChild(pageElt); // } pagerElt.classList.add('ead-search-index-pager'); pagerElt.setAttribute('id','ead-search-index-pager-'+tagName) return pagerElt; } runEadSearch(){ let query = 'resultats.html'; Loading
plugins/ead_search/ead_search.xqm +54 −27 Original line number Diff line number Diff line Loading @@ -29,10 +29,17 @@ function max.plugin.ead_search:searchPage($project){ <label>{string($indexTag/@label)}</label> <input type="text" class="ead-search-input" data-index="{$tagName}" id="{$tagName}-input" list="{$tagName}" multiple="multiple"></input> <div class="ead-search-popup-wrap"> <button onclick="window.eadSearch.popupIndex('{$tagName}')">📖</button> <button onclick="window.eadSearch.togglePopup('{$tagName}')">📖</button> <div class="ead-search-popup" id="ead-search-popup-{$tagName}"> <button class="ead-search-close-popup" onclick="window.eadSearch.togglePopup('{$tagName}')">×</button> <div id="ead-search-popup-{$tagName}-alphabet" class="ead-search-popup-alphabet"> {for $l in 1 to 26 return <a>{codepoints-to-string(($l+64))}</a>} {for $l in 1 to 26 return let $letter:= codepoints-to-string($l+64) return <a>{codepoints-to-string($l+64)}</a> (: if(max.plugin.ead_search:countTagsWithFirstLetter($project, $tagName, $letter) > 0):) (: then <a>{codepoints-to-string($l+64)}</a>:) (: else():) } </div> <div id="ead-search-popup-{$tagName}-contents"></div> </div> Loading Loading @@ -94,19 +101,10 @@ function max.plugin.ead_search:runSearch($project as xs:string, $indexes as xs:s let $joinedSubQueries := fn:string-join($subqueries,'') let $fullQuery := $queryStart || $joinedSubQueries || ' return $c' (: let $fullQuery := $queryStart:) (: || (if($joinedSubQueries) then ($joinedSubQueries ||' and ') else ' where '):) (: || max.plugin.ead_search:buildDateQuery($project, $from, $to, $in)||' return $c':) (: fn:string-join($subqueries,'') || ' ' || max.plugin.ead_search:buildDateQuery($project, $from, $to, $in)||' return $c':) (: return $fullQuery:) return try{ let $matches := max.plugin.ead_search:dateFilter( $project,$from, $to, $in, xquery:eval($fullQuery, map { '': db:open($dbPath) })) let $html:= <ul>{ for $c in $matches return <li>{$c/*:did/*:unitid/text()} | <em>{string($c/*:did/*:unitdate[1]/@normal)}</em></li> Loading Loading @@ -184,8 +182,7 @@ declare %private function max.plugin.ead_search:dateIntervalFilter($from as xs:s }; declare function max.plugin.ead_search:buildSimpleDateQuery($project as xs:string, $in as xs:string){ '2=2' true() (: xs:dateTime(max.plugin.ead_search:parseDateParameter($from)) || ' to ' || xs:dateTime(max.plugin.ead_search:parseDateParameter($to)):) }; Loading @@ -203,18 +200,30 @@ function max.plugin.ead_search:searchIndexesListAsJSON($project, $tag, $page as order by $entry/@normal where fn:string-length($entry/@normal) > 0 return '{"normal":"' || encode-for-uri($entry/@normal) || '", "tag":"' || $tag || '", "role" :"'||$entry/@role||'"}' return json:parse('{"entries" :[' || string-join($jsonStr,',') ||']}') return json:parse( '{ "entries" :[' || string-join($jsonStr,',') ||'], "total": '||$entries/@total||', "start" :'||$entries/@start||', "end" : '||$entries/@end||' }') }; declare %private function max.plugin.ead_search:searchIndexesList($project, $tag, $page as xs:integer, $query as xs:string?){ declare %rest:GET %rest:query-param("q", "{$query}") %rest:query-param("page", "{$page}",1) %rest:path("/{$project}/search-index/{$tag}.xml") function max.plugin.ead_search:searchIndexesList($project, $tag, $page as xs:integer, $query as xs:string?){ let $pageLength := 10 let $dbPath := max.config:getProjectDBPath($project) let $tagParameters := max.plugin.ead_search:getSearchConfiguration($project)//tag[@name=$tag] (:select all nodes with required tag and attributes :) let $allEntries := for $elt in collection($dbPath)//*[fn:local-name()=$tag and @normal] order by $elt/@normal where( if($tagParameters/@attribute) then $elt/@*[local-name(.)=string($tagParameters/@attribute) and string(.)=string($tagParameters/@value)] Loading @@ -233,25 +242,43 @@ declare %private function max.plugin.ead_search:searchIndexesList($project, $tag return string($e/@normal) (:positions computing according to page number:) let $start := $page * 10 - 9 let $end := $start + 10 let $start := $page * $pageLength - ($pageLength -1) let $end := $start + $pageLength (:filter : avoid doublons:) return <entries>{ return <entries total='{count(distinct-values($allNormals))}' start='{$start}' end='{($end - 1)}'>{ for $normal at $pos in distinct-values($allNormals) order by $normal where $pos >= $start and $pos < $end return $allEntries[@normal=$normal][1] }</entries> } </entries> }; }; (: declare %private function max.plugin.ead_search:countTagsWithFirstLetter($project, $tagName, $letter){ let $dbPath := max.config:getProjectDBPath($project) let $tagParameters := max.plugin.ead_search:getSearchConfiguration($project)//tag[@name=$tagName] let $nodes := for $elt in collection($dbPath)//*[fn:local-name()=$tagName and @normal] where( if($tagParameters/@attribute) then $elt/@*[local-name(.)=string($tagParameters/@attribute) and string(.)=string($tagParameters/@value)] else true() ) and( starts-with($elt/@normal, $letter) ) return $elt return count($nodes) }; :) (:test index:) (:----------------------------test index-------------------------------------------:) declare Loading
rxq/config.xqm +8 −2 Original line number Diff line number Diff line Loading @@ -57,8 +57,14 @@ declare function max.config:getPluginByName($projectId, $pluginName){ }; declare function max.config:getPluginParameterValue($projectId, $pluginName, $parameterKey){ doc($max.config:CONFIGURATION_FILE)//edition[@xml:id=$projectId]//plugin[@name=$pluginName] //parameter[@key=$parameterKey]/@value/string() let $param := doc($max.config:CONFIGURATION_FILE)//edition[@xml:id=$projectId]//plugin[@name=$pluginName] //parameter[@key=$parameterKey] return if($param/@value) then $param/@value/string() else $param (: doc($max.config:CONFIGURATION_FILE)//edition[@xml:id=$projectId]//plugin[@name=$pluginName]:) (: //parameter[@key=$parameterKey]/@value/string():) }; Loading