Commit 1c01038b authored by Jerome Chauveau's avatar Jerome Chauveau
Browse files

pagination, tri & optimisation

parent 2eb86963
Loading
Loading
Loading
Loading
+47 −1
Original line number Diff line number Diff line
@@ -2,6 +2,10 @@
    margin-top: 100px;
}

.ead-search button{
    cursor: pointer;
}

.ead-search-ul {
    list-style-type: none;
    display: inline-block;
@@ -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
+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) {
@@ -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(){
@@ -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';
+54 −27
Original line number Diff line number Diff line
@@ -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}')">&#x1F4D6;</button>
                    <button onclick="window.eadSearch.togglePopup('{$tagName}')">&#x1F4D6;</button>
                    <div class="ead-search-popup" id="ead-search-popup-{$tagName}">
                            <button class="ead-search-close-popup" onclick="window.eadSearch.togglePopup('{$tagName}')">&#215;</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>
@@ -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>
@@ -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)):)
};
@@ -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)]
@@ -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
+8 −2
Original line number Diff line number Diff line
@@ -55,8 +55,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():)
  
};