Commit bd653c8c authored by ZettaScript's avatar ZettaScript

Add search by uid/title in live

parent 6f4849de
# WorldWotMap
WorldWotMap v0.4.0, © 2018 Pascal Engélibert, Licence GNU AGPL v3
WorldWotMap v0.5.0, © 2018 Pascal Engélibert, Licence GNU AGPL v3
Ceci est une carte affichant les comptes Ğ1 et leurs certifications. La carte peut être incomplète, car il est facultatif de renseigner sa position géographique sur Cesium+.
......@@ -32,19 +32,19 @@ Chaque ligne reliant deux points rouges représente une certification.
Vous pouvez sélectionner une personne en cliquant sur son point. Les certifications qu'elle a reçues s'affichent en rouges, celles qu'elle a émises en vert. (si il y a un chevauchement entre une certification reçue et une émise, une seule couleur peut apparaître **(bug à corriger)**) Pour n'afficher que les certifications liées à cette personne, cochez la case "_Afficher uniquement ses certifications_".
Cherchez un compte en entrant sa clé publique en entier ou que le début, son titre Cesium+ ou son UID dans le champ de recherche.
### Paramètres GET
* **lat**, **lon** : Latitude et longitude au centre de la carte (en degrés)
* Zoom sur Bordeaux https://zettascript.org/tux/g1/worldwotmap.html?lat=44.82543879996824&lon=-0.5458831787109376&zoom=13
* Zoom sur Toulouse https://zettascript.org/tux/g1/worldwotmap.html?lat=43.595559991515586&lon=1.4560317993164065&zoom=12
* **zoom** : Niveau de zoom
* **pubkey** : Clé publique du compte à sélectionner (ne se déplace pas vers lui). Peut aussi contenir uniquement le début de la clé (insensible à la casse), auquel cas un compte ne sera sélectionné que si il n'y a qu'un seul résultat.
* https://zettascript.org/tux/g1/worldwotmap.html?pubkey=rml12&popup=1#map
* **a** : Terme de recherche pour le compte à sélectionner. Peut contenir une clé publique entière ou son début, le titre Cesium+ d'une identité ou son uid. Insensible à la casse.
* https://zettascript.org/tux/g1/worldwotmap.html?a=rml12&popup#map
* **only** : Nombre de niveaux de certifications à afficher autour du compte sélectionné. Une valeur numérique supérieure _0_ active ce mode.
* https://zettascript.org/tux/g1/worldwotmap.html?lat=47.331377157798244&lon=2.9443359375&zoom=6&pubkey=45GfjkWCWQhJ3epJVGC2NSg1Rcu4Ue1vDD3kk9eLs5TQ&only=3#map
* **goto** : Centrer la carte sur le compte sélectionné. La valeur est le niveau de zoom.
* Zoom sur _tuxmain_ https://zettascript.org/tux/g1/worldwotmap.html?pubkey=45GfjkWCWQhJ3epJVGC2NSg1Rcu4Ue1vDD3kk9eLs5TQ&goto=14
* **popup** : Affiche initialement la popup sur le compte sélectionné avec _pubkey_ si égal à _1_.
* **popup** : Affiche initialement la popup sur le compte sélectionné avec _pubkey_.
## Contribuer
......
......@@ -69,6 +69,13 @@ body {
#mapmenu li {
list-style-type: none;
}
.searchresult {
border-bottom: 1px solid #e2dfd9;
cursor: pointer;
}
.searchresult:hover {
background-color: #e8e3da;
}
a, a:visited {
color: #c8191b;
}
......@@ -82,7 +89,7 @@ a, a:visited {
<div id="header-text">
<h1>WorldWotMap</h1>
<a href="#map">&#11015; Voir la map &#11015;</a>
<p>WorldWotMap v0.4.0, &copy; 2018 <a href="https://zettascript.org/contact.php">Pascal Engélibert</a> (<a href="https://www.gnu.org/licenses/agpl.html">Licence GNU AGPL v3</a>)<br />
<p>WorldWotMap v0.5.0, &copy; 2018 <a href="https://zettascript.org/contact.php">Pascal Engélibert</a> (<a href="https://www.gnu.org/licenses/agpl.html">Licence GNU AGPL v3</a>)<br />
Dépôts Git&nbsp;: <a href="https://framagit.org/ZettaScript/worldwotmap/">Framagit</a> et <a href="https://git.duniter.org/tuxmain/worldwotmap">Duniter</a></p>
<p>Ceci est une carte affichant les comptes Ğ1 et leurs certifications. La carte peut être incomplète, car il est facultatif de renseigner sa position géographique sur Cesium+.</p>
<a href="gencache.py">Programme Python pour exporter les données de duniter.db</a>
......@@ -98,10 +105,9 @@ a, a:visited {
<li><span style="color:red;">Rouge</span>&nbsp;: identité</li>
<li><span style="color:#0c0;">Vert</span>&nbsp;: référent</li>
</ul>
<span id="mapmenu-naccounts"></span>
<details><summary>Rechercher</summary>
<input type="text" id="mapmenu-searchinput" aria-label="Rechercher un compte" placeholder="Clé publique" onkeypress="if(event.keyCode==13)search(this.value);" />
</details><hr />
<span id="mapmenu-naccounts"></span><br />
<input type="text" id="mapmenu-searchinput" value="" aria-label="Chercher un compte" placeholder="Chercher un compte" onkeyup="search(this.value, event.keyCode==13);" />
<div id="mapmenu-searchresults"></div>
<div id="mapmenu-idcard" class="idcard" style="display: none;">
<input type="button" id="mapmenu-idcard-bt" value="Déselectionner" onclick="" />
<input type="button" id="mapmenu-idcard-goto" value="Centrer" onclick="map.setView(accounts[active_account].pos);showURL();" /><br />
......@@ -126,7 +132,7 @@ a, a:visited {
</html>
<!--
Copyright 2018 Pascal Engélibert
This file is part of WorldWotMap 0.4.0.
This file is part of WorldWotMap 0.5.0.
WorldWotMap is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
......
/*
Copyright 2018 Pascal Engélibert
This file is part of WorldWotMap 0.4.0.
This file is part of WorldWotMap 0.5.0.
WorldWotMap is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
......@@ -39,9 +39,9 @@ class Account {
}
mapActiveAccount() {// `this` is the Leaflet Circle, not the Account
if(active_account != null)
mapInactiveAccount(active_account);
var account = accounts[this.options["pubkey"]];
if(active_account != null && active_account != account.pubkey)
mapInactiveAccount(active_account);
active_account = account.pubkey;
onlyShowCertsOfSelected()
$("#mapmenu-idcard").attr("style", "display: initial;");
......@@ -73,6 +73,8 @@ class Cert {
}
function mapInactiveAccount(pubkey) {
if(accounts[active_account].point.isPopupOpen())
accounts[active_account].point.closePopup();
active_account = null;
onlyShowCertsOfSelected()
var account = accounts[pubkey];
......@@ -173,15 +175,21 @@ function showURL() {
var pos = map.getCenter();
var url = window.location.pathname + "?lat="+pos.lat+"&lon="+pos.lng+"&zoom="+map.getZoom();
if(active_account != null)
url += "&pubkey="+active_account;
url += "&a="+active_account;
if(document.getElementById("mapmenu-idcard-onlycertsofsel").checked)
url += "&only="+document.getElementById("mapmenu-idcard-onlycertsofsel-n").value;
$("#mapmenu-maplink").attr("href", url+"#map");
}
function search(term, popup=true) {
function search(term, goto=true, popup=true, title=true) {
term = term.trim();
var obj = document.getElementById("mapmenu-searchresults");
obj.innerHTML = "";
if(term == "")
return 0;
if(term in accounts) {// lazy
active_account = term;
map.setView(accounts[active_account].pos);
if(popup)
accounts[active_account].point.openPopup();
else
......@@ -189,10 +197,11 @@ function search(term, popup=true) {
alertOnMap(accounts[active_account].pos);
return 1;
}
else {// zealous
// zealous
var results = [];
var n = 0;
if(term.match(/^[0-9a-z]{1,43}$/i)) {
var re = new RegExp("^"+term, "i");// starting by
var results = [];
var n = 0;
for(a in accounts) {
if(a.match(re)) {
results.push(a);
......@@ -201,16 +210,44 @@ function search(term, popup=true) {
break;
}
}
if(n == 1) {
active_account = results[0];
if(popup)
accounts[active_account].point.openPopup();
else
accounts[active_account].point.fire("popupopen");
alertOnMap(accounts[active_account].pos);
return 1;
}
if(title) {
var re = new RegExp(term, "i");
for(a in accounts) {
var positive = accounts[a].title.match(re);
if(!positive && a in ids) {
if(ids[a][0] != null)
positive = ids[a][0].match(re);
}
if(positive && results.indexOf(a) == -1) {
results.push(a);
n ++;
if(n > 20)// too many results
break;
}
}
}
if(n == 1 && goto) {
active_account = results[0];
map.setView(accounts[active_account].pos);
if(popup)
accounts[active_account].point.openPopup();
else
accounts[active_account].point.fire("popupopen");
alertOnMap(accounts[active_account].pos);
}
else {
var htmlresults = "";
for(result in results) {
htmlresults += '<div class="searchresult" onclick="search(\''+results[result]+'\','+popup+');" title="'+accounts[results[result]].pubkey;
if(results[result] in ids) {
if(ids[results[result]][0] != null)
htmlresults += " / "+ids[results[result]][0];
}
htmlresults += '">'+accounts[results[result]].title+'</div>';
}
obj.innerHTML = htmlresults;
}
}
function alertOnMap(pos, radius=64, color="red", opacity=0.3) {
......@@ -223,6 +260,7 @@ function alertOnMap(pos, radius=64, color="red", opacity=0.3) {
setTimeout(function(){point.removeFrom(map);}, 500);
}
var ids = {};
var accounts = {};
var certs = [];
var ncerts = 0;
......@@ -266,6 +304,8 @@ $.post(cesium_data_url+"user/profile/_search", '{"query":{"bool":{"must":[{"exis
}
$.get(duniterdb_url, null, function(data) {
ids = data["ids"];
// Add certs
for(var i=0; i < data["certs"].length; i ++) {
if(data["certs"][i][0] in accounts && data["certs"][i][1] in accounts && data["certs"][i][3] == 0) {
......@@ -294,15 +334,15 @@ $.post(cesium_data_url+"user/profile/_search", '{"query":{"bool":{"must":[{"exis
}
// Select account given in URL
var url_account = getParam("pubkey");
if(search(url_account, getParam("popup")) == 1) {
if(getParam("only", 0) > 0) {
$("#mapmenu-idcard-onlycertsofsel").attr("checked", "checked");
$("#mapmenu-idcard-onlycertsofsel-n").attr("value", getParam("only"));
onlyShowCertsOfSelected();
var url_account = getParam("a");
if(url_account != null) {
if(search(url_account, true, getParam("popup")) == 1) {
if(getParam("only", 0) > 0) {
$("#mapmenu-idcard-onlycertsofsel").attr("checked", "checked");
$("#mapmenu-idcard-onlycertsofsel-n").attr("value", getParam("only"));
onlyShowCertsOfSelected();
}
}
if(getParam("goto", 0) > 0)
map.setView(accounts[active_account].pos, getParam("goto"));
}
});
});
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment