Commit 578267ee authored by Eric Seigne's avatar Eric Seigne
Browse files

ik: proposition des itineraires identiques repetitifs

parent 12005e7f
......@@ -453,6 +453,18 @@ fieldset {
margin-left: auto;
}
.input-txt {
position: relative;
margin-left: auto;
}
.input-txt.left input {
padding-left: 18px;
}
.input-txt.right input {
padding-right: 18px;
text-align: end;
}
.input-euro {
position: relative;
margin-left: auto;
......
<ons-page id="ONSFraisIK">
<ons-toolbar modifier="material">
<div id="titreNav" class="left" onclick="gotoPage('menu.html');">
<span class="translate">ik</span>
</div>
<div id="home" class="left" onclick="gotoPage('menu.html');">
<img src="img/logo_square.png" id="homeLogo" />
</div>
<div id="menuHautDroite" class="right">
<ons-toolbar-button onclick="fn.open()">
<ons-icon icon="md-menu"></ons-icon>
</ons-toolbar-button>
</div>
</ons-toolbar>
<div id="container">
<form id="leformIK" name="leformIK">
<input type="hidden" name="typeFrais" value="ik">
<input type="hidden" id="updateID" name="updateID" value="0">
<!-- recycled to store new full path -->
<input type="hidden" id="invites" name="invites" value="">
<ons-row>
<ons-col>
<div id="interobjets"></div>
<fieldset data-role="controlgroup" data-type="horizontal" data-mini="true">
<legend class="translate">date</legend>
<ons-input name="ladate" id="ladate" type="date"></ons-input>
</fieldset>
<div class="feedVehicules" id='feedVehiculesPerso'></div>
<div id="interobjets"></div>
<fieldset data-role="controlgroup" data-type="horizontal" data-mini="true">
<legend class="translate">Objet du déplacement :</legend>
<span class="deleteicon">
<ons-input required modifier="underbar" float name="label" id="label" type="text" placeholder="" value=""></ons-input>
<span class="deleteicon2" onclick="label.value='';label.focus();"><i style="font-size: x-large;" class="zmdi zmdi-close-circle-o"></i></span>
</span>
<ons-list style="clear: both;">
<ons-list-item id="listeObjets" expandable style="float: right; margin-top: -10px;" data-role="listview" data-filter="true" data-filter-reveal="true" data-input="#label">
<span class="translate">favorites</span>
</ons-list-item>
</ons-list>
<div style="text-align: left;">
<ons-list>
<ons-list-item tappable>
<label class="left">
<ons-checkbox input-id="rememberMe" value="1"></ons-checkbox>
</label>
<label for="rememberMe" class="translate">Mémoriser cet itinéraire</label>
</ons-list-item>
</ons-list>
</div>
</fieldset>
<div id="interobjets"></div>
<fieldset data-role="controlgroup" data-type="horizontal" data-mini="true">
<legend class="translate">Itinéraire :</legend>
<div id="interobjets"></div>
<div style="display: flex; align-items:baseline;">
<ons-input required modifier="underbar" float name="depart" id="depart" type="text" placeholder="Ville de départ (ou code postal)" onchange="$('#departSlug').val('');"></ons-input>
<ons-button modifier="material" id="btnSearchDepart" onclick="searchVille('leformIK','depart', 'departSlug');"><i class="zmdi zmdi-cloud-outline zmdib"></i></ons-button>
</div>
<ons-list style="clear: both;">
<input type="hidden" id="departSlug" name="departSlug" value="">
<ons-list-item class="listeVille" id="listeDepart" expandable data-role="listview" data-filter="true" data-filter-reveal="true" data-input="#label">
<span class="translate">favorites</span>
</ons-list-item>
</ons-list>
<div id="iketape"></div>
<div id="interobjets"></div>
<div>
<div style="width: 48%; float:right;">
<ons-button style="height: 3em; line-height: 1.2em; padding-top: 4px;" id="btnRetourDepart" modifier="material" onclick="ikRetourDepart('leformIK');"><span class="translate">Retour au point de départ</span></ons-button>
</div>
<div style="width: 48%;">
<ons-button style="height: 3em; line-height: 1.2em; padding-top: 4px;" id="btnAjoutEtape" modifier="material" onclick="ikAjoutEtape('leformIK');"><span class="translate">Ajouter une nouvelle étape</span></ons-button>
</div>
</div>
<div style="align-items:baseline;">
<ons-button id="btnCalculTotal" modifier="material large" onclick="calculTotal('leformIK');"><span class="translate">Parcours terminé</span></ons-button>
</div>
<div id="interobjets"></div>
<!-- sera completé par le submit -->
<input type="hidden" id="arrivee" name="arrivee" value="">
<div style="display: flex; align-items:baseline;">
<ons-input required modifier="underbar" float name="distance" id="distance" type="number" placeholder="Distance totale (km)" value="" min="0"></ons-input>
<!-- <ons-button modifier="material" id="btnCalculDistance" onclick="distanceAutomatique(depart.value, arrivee.value, departSlug.value, arriveeSlug.value, 'calcul');"><i class="zmdi zmdi-cloud-outline zmdib"></i></ons-button> -->
</div>
</fieldset>
<div id="interobjets"></div>
<fieldset data-role="controlgroup" data-type="horizontal" data-mini="true">
<legend class="translate">Mémoriser comme itinéraire favoris :</legend>
<span class="deleteicon">
<ons-input required modifier="underbar" float name="favoriteiti" id="favoriteiti" type="text" placeholder="Nom de l'itinéraire" value=""></ons-input>
<span class="deleteicon2" onclick="favoriteiti.value='';favoriteiti.focus();"><i style="font-size: x-large;" class="zmdi zmdi-close-circle-o"></i></span>
</span>
</fieldset>
<div id="interobjets"></div>
<div id="zoneEnvoyer">
<div style="width: 48%; float:right;">
<ons-button id="envoyer" modifier="material large" onclick="checkForm('leformIK');"><span class="translate">validate</span></ons-button>
</div>
<div style="width: 48%;">
<ons-button id="modifier" modifier="material large" onclick="$('#btnAjoutEtape').prop('disabled', false);$('#btnRetourDepart').prop('disabled', false);"><span class="translate">Modifier</span></ons-button>
</div>
</div>
</ons-col>
</ons-row>
</form>
</div>
<script type="text/javascript">
//Au lancement on supprime les éventuelles étapes de la saisie précédente
$('#iketape').empty();
$("#envoyer").hide();
$("#modifier").hide();
var nbEtape = 1;
function ikAjoutEtape(leform) {
myDebug(" ikAjoutEtape ...");
let form = document.getElementById(leform);
let obj = form.iketape;
let html = "";
html += " <fieldset id=\"cgEtape" + nbEtape + "\" data-role=\"controlgroup\" data-type=\"horizontal\" data-mini=\"true\">";
html += " <legend>Étape " + nbEtape + ":</legend>"
html += " <span id=\"btnSupprEtape" + nbEtape + "\" class=\"deleteicon\" style=\"float: right;margin-top: -35px;background: white;margin-right: -4px;padding: 2px;\">";
html += " <span class=\"\" onclick=\"ikSupprimeEtape(" + nbEtape + ",'leformIK');\"><i style=\"font-size: x-large;\" class=\"zmdi zmdi-close-circle-o\"></i></span>";
html += " </span>";
html += " <div id=\"interobjets\"></div>";
html += " <div style=\"display: flex; align-items:baseline;\">";
html += " <ons-input required modifier=\"underbar\" float name=\"etape" + nbEtape + "\" id=\"etape" + nbEtape + "\" type=\"text\" placeholder=\"Étape " + nbEtape + " (ou code postal)\" onchange=\"$('#etape" + nbEtape + "Slug').val('');$('#etape" + nbEtape + "Distance').val('');\"></ons-input>";
html += " <ons-input required modifier=\"underbar\" float name=\"etape" + nbEtape + "Distance\" id=\"etape" + nbEtape + "Distance\" type=\"number\" min=\"0\" max=\"5000\" placeholder=\"Distance\" style=\"width:6em;\"></ons-input>";
html += " <ons-button modifier=\"material\" id=\"btnCalculDistanceEtape" + nbEtape + "\" onclick=\"distanceAutomatiqueEtape('leformIK','etape" + nbEtape + "'," + nbEtape + ");\"><i class=\"zmdi zmdi-cloud-outline zmdib\"></i></ons-button>";
html += " </div>";
html += " <ons-list style=\"clear: both;\">";
html += " <input type=\"hidden\" id=\"etape" + nbEtape + "Slug\" name=\"etape" + nbEtape + "Slug\" value=\"\">";
html += " <ons-list-item class=\"listeVille\" id=\"listeEtape" + nbEtape + "\" expandable data-role=\"listview\" data-filter=\"true\" data-filter-reveal=\"true\" data-input=\"#label\">";
html += " <span class=\"translate\">favorites</span>";
html += " </ons-list-item>";
html += " </ons-list>";
html += " </fieldset>";
$("#iketape").append(html);
//On supprime le bouton qui permet de supprimer l'étape précédente pour ne pas avoir à gérer de liste avec des trous
//-> seule la dernière étape peut-être supprimée
//en vérité, on cache le bouton car il faut pouvoir réafficher le bouton suppr de l'étape d'avant quand on en supprime une
if (nbEtape > 1) {
$("#btnSupprEtape" + (nbEtape - 1)).hide();
}
//On complete la liste des etapes
cities = JSON.parse(localGetData("cities"));
if (cities) {
//On limite à 15 pour eviter de bloquer le terminal ...
for (var i = 0; i < cities.length && i < 15; i++) {
$('#listeEtape' + nbEtape).append('<div class=\"expandable-content list-item__expandable-content\"><a href="#" onclick="selectEtape(' + nbEtape + ',\'' + cities[i] + '\');">' + cities[i] + '</a></div>');
}
}
nbEtape++;
myDebug(" ikAjoutEtape end, nbEtape=" + nbEtape);
}
function ikRetourDepart(leform) {
let form = document.getElementById(leform);
let obj = form.iketape;
let html = "";
html += " <fieldset id=\"cgEtape" + nbEtape + "\" data-role=\"controlgroup\" data-type=\"horizontal\" data-mini=\"true\">";
html += " <legend>Retour au point de départ :</legend>"
html += " <span id=\"btnSupprEtape" + nbEtape + "\" class=\"deleteicon\" style=\"float: right;margin-top: -35px;background: white;margin-right: -4px;padding: 2px;\">";
html += " <span class=\"\" onclick=\"ikSupprimeEtape(" + nbEtape + ",'leformIK');\"><i style=\"font-size: x-large;\" class=\"zmdi zmdi-close-circle-o\"></i></span>";
html += " </span>";
html += " <div id=\"interobjets\"></div>";
html += " <div style=\"display: flex; align-items:baseline;\">";
html += " <ons-input required modifier=\"underbar\" float name=\"etape" + nbEtape + "\" id=\"etape" + nbEtape + "\" type=\"text\" value=\"" + $('#depart').val() + "\"></ons-input>";
html += " <ons-input required modifier=\"underbar\" float name=\"etape" + nbEtape + "Distance\" id=\"etape" + nbEtape + "Distance\" type=\"number\" min=\"0\" max=\"5000\" placeholder=\"Distance\" style=\"width:6em;\"></ons-input>";
html += " <ons-button modifier=\"material\" id=\"btnCalculDistanceEtape" + nbEtape + "\" onclick=\"distanceAutomatiqueEtape('leformIK','etape" + nbEtape + "'," + nbEtape + ");\"><i class=\"zmdi zmdi-cloud-outline zmdib\"></i></ons-button>";
html += " </div>";
html += " <ons-list style=\"clear: both;\">";
html += " <input type=\"hidden\" id=\"etape" + nbEtape + "Slug\" name=\"etape" + nbEtape + "Slug\" value=\"\">";
html += " <ons-list-item class=\"listeVille\" id=\"listeEtape" + nbEtape + "\" expandable data-role=\"listview\" data-filter=\"true\" data-filter-reveal=\"true\" data-input=\"#label\">";
html += " <span class=\"translate\">favorites</span>";
html += " </ons-list-item>";
html += " </ons-list>";
html += " </fieldset>";
$("#iketape").append(html);
//On supprime le bouton qui permet de supprimer l'étape précédente pour ne pas avoir à gérer de liste avec des trous
//-> seule la dernière étape peut-être supprimée
//en vérité, on cache le bouton car il faut pouvoir réafficher le bouton suppr de l'étape d'avant quand on en supprime une
if (nbEtape > 1) {
$("#btnSupprEtape" + (nbEtape - 1)).hide();
}
//On complete la liste des etapes
cities = JSON.parse(localGetData("cities"));
if (cities) {
//On limite à 15 pour eviter de bloquer le terminal ...
for (var i = 0; i < cities.length && i < 15; i++) {
$('#listeEtape' + nbEtape).append('<div class=\"expandable-content list-item__expandable-content\"><a href="#" onclick="selectEtape(' + nbEtape + ',\'' + cities[i] + '\');">' + cities[i] + '</a></div>');
}
}
//On désactive le bouton ajouter étape
$("#btnAjoutEtape").prop('disabled', true);
//On désactive le bouton retour au point de départ aussi
$("#btnRetourDepart").prop('disabled', true);
//On lance le calcul de distance du dernier morceau
$("#btnCalculDistanceEtape" + nbEtape - 1).ready(function () {
distanceAutomatiqueEtape('leformIK', 'etape' + nbEtape - 1, nbEtape - 1);
});
//On se déplace à la fin du formulaire
document.getElementById('zoneEnvoyer').scrollIntoView();
$("#btnCalculTotal").focus();
nbEtape++;
}
function ikSupprimeEtape(nb, leform) {
$("#cgEtape" + nb).remove();
nbEtape--;
nb--;
//Et on réaffiche le bouton supprimer de l'étape précédente
if (nb > 0) {
$("#btnSupprEtape" + nb).show();
}
}
function calculTotal(leform) {
let total = 0;
for (i = 1; i < nbEtape; i++) {
let d = parseInt($("#etape" + i + "Distance").val());
total += d;
}
$("#distance").val(total);
$("#envoyer").show();
$("#modifier").show();
//On désactive le bouton ajouter étape
$("#btnAjoutEtape").prop('disabled', true);
//On désactive le bouton retour au point de départ aussi
$("#btnRetourDepart").prop('disabled', true);
document.getElementById('envoyer').scrollIntoView();
}
function checkForm(leform) {
// on complète l'arrivée
if (nbEtape > 0) {
let derniereEtape = $("#etape" + (nbEtape - 1)).val();
$("#arrivee").val(derniereEtape);
myDebug(" checkForm on ajoute l'arrivée : " + $("#arrivee").val());
}
if (genericCheckForm(leform)) {
let objForm = document.getElementById(leform);
addLocalStorageEntry('objetsIK', objForm.elements['label'].value);
addLocalStorageEntry('cities', objForm.elements['depart'].value);
for (i = 1; i < nbEtape; i++) {
addLocalStorageEntry('cities', objForm.elements['etape' + i].value);
}
// les etapes partent dans le champ "invites"
// on ameliore le label avec la liste des etapes -> ça sera fait sur le serveur
// myDebug(" checkForm on ameliore le champ label avec les etape");
// let label = $("#label").val();
// let invites = "";
// if (nbEtape > 2) {
// invites = "Étapes : "
// for (i = 1; i < nbEtape; i++) {
// let s = $("#etape" + i).val();
// let pos = s.indexOf('(');
// invites += s.slice(0, pos).trim();
// myDebug(" checkForm on ajoute :" + s.slice(0, pos) + " a " + invites);
// if (i > 1) {
// invites += ', ';
// }
// }
// }
// myDebug(" checkForm on ameliore le champ invites :" + $("#invites").val());
// $("#invites").val(invites);
sendForm(leform);
}
}
$('#depart').keyup(function () {
$('#listeDepart').show();
});
function selectDepart(ville) {
$('#listeDepart').hide();
$('#depart').val(ville);
// $('#arrivee').focus();
$('#departSlug').val('xxx');
document.querySelector('#listeDepart').hideExpansion();
$('#listeDepart').show();
}
function selectEtape(nb, ville) {
$('#listeEtape' + nb).hide();
$('#etape' + nb).val(ville);
$('#etape' + nb + 'Slug').val('xxx');
document.querySelector('#listeEtape' + nb).hideExpansion();
$('#listeEtape' + nb).show();
}
testVP = localGetData("vehicules");
if (testVP == null || testVP.length == 0) {
ons.notification.alert("Si vous voulez saisir des IK ajoutez un véhicule personnel dans le menu Configuration.", { title: "Attention" }).then(function () {
gotoPage("config.html", true);
});
}
</script>
</ons-page>
\ No newline at end of file
<ons-page id="ONSFraisIK">
<ons-toolbar modifier="material">
<div id="titreNav" class="left" onclick="gotoPage('menu.html');">
<span class="translate">ik</span>
</div>
<div id="home" class="left" onclick="gotoPage('menu.html');">
<img src="img/logo_square.png" id="homeLogo" />
</div>
<div id="menuHautDroite" class="right">
<ons-toolbar-button onclick="fn.open()">
<ons-icon icon="md-menu"></ons-icon>
</ons-toolbar-button>
</div>
</ons-toolbar>
<div id="container">
<form id="leformIK" name="leformIK">
<input type="hidden" name="typeFrais" value="ik">
<input type="hidden" id="updateID" name="updateID" value="0">
<!-- recycled to store new full path -->
<ons-row>
<ons-col>
<div id="interobjets"></div>
<fieldset data-role="controlgroup" data-type="horizontal" data-mini="true">
<legend class="translate">date</legend>
<ons-input name="ladate" id="ladate" type="date"></ons-input>
</fieldset>
<div class="feedVehicules" id='feedVehiculesPerso'></div>
<div id="interobjets"></div>
<fieldset data-role="controlgroup" data-type="horizontal" data-mini="true">
<legend class="translate">Objet du déplacement :</legend>
<ons-input modifier="underbar" float name="label" id="label" type="text" value="" readonly></ons-input>
<div id="interobjets"></div>
<div style="display: flex; align-items: center;">
<legend class="translate">Départ</legend>
<span class="input-txt right">
<input name="depart" id="depart" type="text" readonly>
</span>
</div>
<div style="display: flex; align-items: center;">
<legend class="translate">Arrivée</legend>
<span class="input-txt right">
<input name="arrivee" id="arrivee" type="text" readonly>
</span>
</div>
<div style="display: flex; align-items: center;">
<legend class="translate">Itinéraire</legend>
<span class="input-txt right">
<input name="invites" id="invites" type="text" readonly>
</span>
</div>
<div style="display: flex; align-items: center;">
<legend class="translate">Distance totale</legend>
<span class="input-txt right">
<input name="distance" id="distance" type="text" readonly>
</span>
</div>
</fieldset>
<div id="interobjets"></div>
<div id="zoneEnvoyer">
<div style="width: 48%; float:right;">
<ons-button id="envoyer" modifier="material large" onclick="checkForm('leformIK');"><span class="translate">validate</span></ons-button>
</div>
</div>
</ons-col>
</ons-row>
</form>
</div>
<script type="text/javascript">
if (globalIkToReuse !== undefined) {
let decode = JSON.parse(atob(globalIkToReuse));
$("#label").val(decode.label);
$("#depart").val(decode.depart);
$("#arrivee").val(decode.arrivee);
$("#distance").val(decode.distance);
let nb = 1;
if (decode.etapes.length > 0) {
let txt = "Etapes : ";
let etxt = "";
decode.etapes.forEach((v, key) => {
if (etxt != "")
etxt += ", ";
etxt += v;
//Il faut "pousser" un objet etapeNB sur le formulaire
addHiddenValue('leformIK', "etape" + nb, v);
nb++;
});
$("#invites").val(txt + etxt);
}
}
else {
myDebug("globalIkToReuse is undegined !")
}
function addHiddenValue(leform, key, value) {
let objForm = document.getElementById(leform);
// Create a hidden input element, and append it to the form:
var input = document.createElement('input');
input.type = 'hidden';
input.name = key; // 'the key/name of the attribute/field that is sent to the server
input.value = value;
objForm.appendChild(input);
}
function checkForm(leform) {
if (genericCheckForm(leform)) {
let objForm = document.getElementById(leform);
sendForm(leform);
}
}
testVP = localGetData("vehicules");
if (testVP == null || testVP.length == 0) {
ons.notification.alert("Si vous voulez saisir des IK ajoutez un véhicule personnel dans le menu Configuration.", { title: "Attention" }).then(function () {
gotoPage("config.html", true);
});
}
</script>
</ons-page>
\ No newline at end of file
This diff is collapsed.
......@@ -2,7 +2,7 @@
* (c) Éric Seigne <eric.seigne@cap-rel.fr> - 2019-2020 - GNU AGPLv3
* full source code in src/ subfolder, this file is minifyed
*/
var globalAppVersion="1.9.0";var globalDevMode=true;var globalMyCamera;var globalpictureSource;var globaldestinationType;var globalNetworkResponse=Date.now();var globalCurrentPage="";var globalCurrentTitle="";var globalTenMinuts=60*10*1000;var globalCompatibleWithAPIVersion=4;var globalDoliScanDomain="";var globalLastInsertId="";var globalSyncInProgress=false;var globalPictureFileName="";var globalPicturesAvailable=[];var globalSyncObject=[];var dataLDF="";var dataIK="";var globalMyNavigator=undefined;var globalResumable=undefined;var globalProgressBar=undefined;var globalTypeFrais="";var globalVehiculeEd=undefined;var loginAPIKeyErrorInProgress=false;var globalSrvKeys=['email','api_token','firstname','name','adresse','cp','ville','pays','send_copy_to','compta_email','compta_ik','compta_peage','compta_hotel','compta_train','compta_carburant','compta_taxi','compta_restauration','compta_divers','compta_compteperso','compta_tvadeductible','official_app_version','official_app_message','mode_simple','compta_tva_tx1','compta_tva_tx2','compta_tva_tx3','compta_tva_tx4'];function errorHandlerCustomFile(title,message){myDebug('errorHandlerCustomFile : '+title+' -- message follow:');myDebug(message);}
var globalAppVersion="1.9.2";var globalDevMode=false;var globalMyCamera;var globalpictureSource;var globaldestinationType;var globalNetworkResponse=Date.now();var globalCurrentPage="";var globalCurrentTitle="";var globalTenMinuts=60*10*1000;var globalCompatibleWithAPIVersion=4;var globalDoliScanDomain="";var globalLastInsertId="";var globalSyncInProgress=false;var globalPictureFileName="";var globalPicturesAvailable=[];var globalSyncObject=[];var globalIkToReuse=undefined;var dataLDF="";var dataIK="";var globalMyNavigator=undefined;var globalResumable=undefined;var globalProgressBar=undefined;var globalTypeFrais="";var globalVehiculeEd=undefined;var loginAPIKeyErrorInProgress=false;var globalSrvKeys=['email','api_token','firstname','name','adresse','cp','ville','pays','send_copy_to','compta_email','compta_ik','compta_peage','compta_hotel','compta_train','compta_carburant','compta_taxi','compta_restauration','compta_divers','compta_compteperso','compta_tvadeductible','official_app_version','official_app_message','mode_simple','compta_tva_tx1','compta_tva_tx2','compta_tva_tx3','compta_tva_tx4'];function errorHandlerCustomFile(title,message){myDebug('errorHandlerCustomFile : '+title+' -- message follow:');myDebug(message);}
function loadCustomCSS(){if((typeof cordova=='undefined')||(cordova===null)||(cordova=="")){return;}
if((typeof cordova.file=='undefined')||(cordova.file===null)||(cordova.file=="")){return;}
if((typeof cordova.file.cacheDirectory=='undefined')||(cordova.file.cacheDirectory===null)||(cordova.file.cacheDirectory=="")){return;}
......@@ -40,7 +40,7 @@ ajaxDistance.abort();var ajaxDistance=$.ajax({type:"GET",timeout:5000,url:"https
else if(result.arriveesNb==1){functionChooseVille(encodeHTMLEntities(result.arrivee)+" ("+result.arriveeCP+")",result.arriveeSlug,etape,etape+'Slug',true);if(result.distanceKM>0){updateDistanceEtapeFromServer(result,etape,nb);}
else{myDebug('distanceAutomatiqueEtape ajax aucune réponse disponible ');ons.notification.alert("Le calcul automatique de distance n'a rien trouvé.\n\nVeuillez saisir la distance manuellement.",{title:"Erreur #1a"});}}
else{popupChoixEtape(result,etape,nb);}}
else{hideWait();ons.notification.alert("Saisie manuelle nécessaire, cet itinéraire n'est pas connue sur nos serveurs",{title:"Erreur #1"});}},error:function(result){myDebug('distanceAutomatiqueEtape ajax erreur'+result);hideWait();ons.notification.alert("Saisie manuelle nécessaire, cet itinéraire n'est pas connue sur nos serveurs",{title:"Erreur #2"});}});}
else{hideWait();ons.notification.alert("Saisie manuelle nécessaire, cet itinéraire n'est pas connue sur nos serveurs",{title:"Erreur #1"});}},error:function(result){myDebug('distanceAutomatiqueEtape ajax erreur'+JSON.stringify(result));hideWait();ons.notification.alert("Saisie manuelle nécessaire, cet itinéraire n'est pas connue sur nos serveurs",{title:"Erreur #2"});}});}
function popupChoixDepart(result){myDebug('popupChoixDepart');return new Promise((resolve,reject)=>{if(result.departsNb!==undefined){if(result.departsNb==1){functionChooseDepart2(encodeHTMLEntities(result.depart)+" ("+result.departCP+")",result.departSlug,true);}
else{let btn=[];let btnNb=0;for(btnNb=0;btnNb<result.departsNb;btnNb++){btn.push({label:encodeHTMLEntities(result.depart[btnNb])+" ("+result.departCP[btnNb]+")",slug:result.departSlug[btnNb]});}
if(globalMyNavigator!==undefined){resolve(globalMyNavigator.pushPage("choix-liste.html",{data:{title:"Précisez la ville de départ",callFunction:'functionChooseDepart2',btn:btn,btnNb:btnNb,},animation:'fade',}));}
......@@ -65,6 +65,8 @@ blinkElement("#btnCalculDistanceArrivee",3,800);}
else{myDebug("functionChooseDepart2: slug is undef !")}}
function updateDistanceFromServer(result){$('#distance').val(result.distanceKM);$('#btnCalculDistance').attr('style',"");}
function updateDistanceEtapeFromServer(result,etape,nb){$('#etape'+nb+'Distance').val(result.distanceKM);$('#distance').val();$('#btnCalculDistance').attr('style',"");}
function addFrequentRoute(storageKey,depart,arrivee,distance,label,etapes){return new Promise((resolve,reject)=>{let rNew={"depart":depart,"arrivee":arrivee,"distance":distance,"label":label,"etapes":etapes};let rs=JSON.parse(localGetData(storageKey));if(rs===null){rs=[];}
rs.push(rNew);resolve(localStoreData(storageKey,JSON.stringify(rs)));});}
function feedVehicules(storageKey){let htmlCode="";let html="";let htmlSingleVehicule="";let hasVehicule=false;let hasMultiVehicules=false;let v=localGetData(storageKey);if(v==null){return;}
vehicules=JSON.parse(v);for(let i=0;i<vehicules.length&&i<4;i++){let vA=vehicules[i]['nom'];let vE=vehicules[i]['energie'];let vP=vehicules[i]['puissance'];let vT=vehicules[i]['type'];let vKM=vehicules[i]['kmbefore'];let vIMMAT=vehicules[i]['immat'];let vUUID=vehicules[i]['uuid'];let option=vA+";"+vE+";"+vP+";"+vT+";"+vKM+";"+vIMMAT+";"+vUUID;if(vA!==null){html+="<div class=\"segment__item\">";html+=" <input type=\"radio\" name=\"vehicule\" id=\"vehicule-"+i+"\" value=\""+option+"\" checked=\"checked\" class=\"segment__input\" />";html+=" <div class=\"segment__button\">"+vA+"</div>";html+="</div>";htmlSingleVehicule=option;if(hasVehicule==true){hasMultiVehicules=true;}
hasVehicule=true;}}
......@@ -156,10 +158,11 @@ function genericCheckForm(leform=null){myDebug("genericCheckForm "+leform);if(le
let probleme="";fieldsToValidate=['nom','arrivee','depart','distance','energievalue','label','ladate','email','password','puissancevalue','immat','ttc','typeFrais','typevalue','photoFacturette'];fieldsTexte=["Nom","Arrivée","Départ","Distance","Type de carburant","Objet","La date","Courrier électronique","Mot de passe","Puissance du véhicule","Plaque d'immatriculation","Montant TTC","Type de frais","Type","Photo de la facturette"];if(globalDevMode){fieldsToValidate.splice(-1,1);fieldsTexte.splice(-1,1);}
let objForm=document.getElementById(leform);if(objForm==null||objForm==undefined){myDebug("genericCheckForm objForm null");return false;}
myDebug("mode d'utilisation pour cette personne : "+localGetData('mode_simple'));if(localGetData('mode_simple')==1){fieldsToValidate=['photoFacturette'];fieldsTexte=["Photo de la facturette"];}
for(let i=0;i<fieldsToValidate.length;i++){let field=fieldsToValidate[i];myDebug("on cherche a valider le champ : "+field);if(objForm.elements[field]!==undefined){myDebug("Cet element existe, "+field+"("+i+") quelle est sa valeur ..."+objForm.elements[field].value);if(!objForm.elements[field].value){$('#'+field).attr('style',"border-radius: 5px; border:#FF0000 2px solid;");probleme+="<ul>"+fieldsTexte[i]+"</ul>";}
for(let i=0;i<fieldsToValidate.length;i++){let field=fieldsToValidate[i];myDebug("on cherche a valider le champ : "+field);if(objForm.elements[field]!==undefined){myDebug("Cet element existe, "+field+"("+i+"), de type "+objForm.elements[field].type+", quelle est sa valeur ..."+objForm.elements[field].value);if(!objForm.elements[field].value){$('#'+field).attr('style',"border-radius: 5px; border:#FF0000 2px solid;");probleme+="<ul>"+fieldsTexte[i]+"</ul>";}
else if(objForm.elements[field].type=="number"&&objForm.elements[field].value<0){$('#'+field).attr('style',"border-radius: 5px; border:#FF0000 2px solid;");probleme+="<ul>Montant négatif interdit</ul>";}
else{$('#'+field).attr('style',"");}}
else{myDebug("le champ suivant n'existe pas : "+field);}}
if(probleme!=""){ons.notification.alert("Certaines informations sont manquantes:<ul> "+probleme+"</ul>",{title:"Attention"}).then(function(){return false;});}
if(probleme!=""){ons.notification.alert("Certaines informations sont manquantes ou incorrectes :<ul> "+probleme+"</ul>",{title:"Attention"}).then(function(){return false;});}
else{myDebug("genericCheckForm return true");return true;}}
function initialiseForm(){myDebug('initialiseForm ... ');if(document.getElementById('feedPaiements')){myDebug('feedPaiements ...');$('#feedPaiements').load('parts/paiement.html',function(){myDebug('feedPaiements load ...');$('#feedPaiements').trigger("create");$('#feedPaiements').find('.translate').each(function(i,obj){if($(obj).html()){let t=trans($(obj).html());$(obj).html(t.trim());}});if(dataLDF!=""){if(dataLDF['moyenPaiement']){myDebug("Choix du moyen de paiement : ");$('#moyenPaiement-'+dataLDF['moyenPaiement']).click();myDebug("On a cliqué sur "+dataLDF['moyenPaiement']);}}
else{if(localGetData('moyenPaiement')){$('#moyenPaiement-'+localGetData('moyenPaiement')).click();myDebug("On a prévalidé le moyenPaiement-"+localGetData('moyenPaiement'));}
......@@ -214,8 +217,8 @@ ajaxRequestPasswordJSON.abort();var ajaxRequestPasswordJSON=$.ajax({type:"POST",
else{ons.notification.alert("Erreur ... contactez le service technique pour plus d'informations.",{title:"Erreur"}).then(function(){myDebug("carouselPassword call 1");carouselPassword();});}}});}
function loginButtonPressed(accountID=null){let remember=0;let lemail=document.getElementById('email').value;if(document.getElementById('rememberMe').checked){remember=1;}
localStoreData("email",lemail);localStoreData("rememberMe",remember);myDebug("loginButtonPressed pour "+lemail);showWait();globalDoliScanDomain=lemail.replace(/.*@/,"doliscan.");myDebug('On cherche '+globalDoliScanDomain);var testURL="https://"+globalDoliScanDomain+"/api/hello";myDebug("-> tentative de découverte d'un serveur doliscan sur "+testURL);showWait();if(ajaxRequestDiscover)
ajaxRequestDiscover.abort();var ajaxRequestDiscover=$.ajax({url:testURL,timeout:5000,type:"POST",data:{email:lemail,},dataType:"json",success:function(data,textStatus,request){hideWait();myDebug('success ! -> '+data);myDebug(request);localStoreData("email",lemail);localStoreData("api_server","https://"+globalDoliScanDomain);localStoreData("name_server",globalDoliScanDomain);myDebug("Request finished (api/hello)");loginJson();},error:function(request,textStatus,error){hideWait();if(textStatus==="timeout"){myDebug("Request finished (error signal) : "+textStatus);}
myDebug("Request finished (error signal) : "+textStatus);myDebug(request);myDebug(error);myDebug('error, fallback to doliscan.fr !');localStoreData("api_server","https://doliscan.fr");localStoreData("name_server","doliscan.fr");loginJson();}});}
ajaxRequestDiscover.abort();var ajaxRequestDiscover=$.ajax({url:testURL,debug:true,timeout:15000,type:"POST",data:{email:lemail,},dataType:"json",success:function(data,textStatus,request){hideWait();myDebug('success ! -> '+data);myDebug(request);localStoreData("email",lemail);localStoreData("api_server","https://"+globalDoliScanDomain);localStoreData("name_server",globalDoliScanDomain);myDebug("Request finished (api/hello)");loginJson();},error:function(request,textStatus,error){hideWait();if(textStatus==="timeout"){myDebug("Request finished (error signal) : "+textStatus);}
myDebug("Request finished (error signal) : "+textStatus+" : "+error);myDebug(JSON.stringify(request));myDebug('error, fallback to doliscan.fr !');localStoreData("api_server","https://doliscan.fr");localStoreData("name_server","doliscan.fr");loginJson();}});}
function loginJson(){myDebug("Tentative de connexion JSON ...");let lemail=document.getElementById('email').value;let lpassword=document.getElementById('password').value;let carousel=document.getElementById('carousel');showWait();var loginURI=localGetData("api_server")+"/api/login";myDebug(' loginJson : tentative de login via ajax request vers le serveur '+loginURI+' pour '+lemail+' **'+lpassword+"**");let remember=0;if(document.getElementById('rememberMe').checked){remember=1;}
localStoreData("rememberMe",remember);if(ajaxRequestLoginJSON)
ajaxRequestLoginJSON.abort();var ajaxRequestLoginJSON=$.ajax({url:loginURI,timeout:5000,type:"POST",data:{email:lemail,password:lpassword,},success:function(result,textStatus,request){hideWait();myDebug("loginJson success ");globalNetworkResponse=Date.now();if(typeof result!='undefined'){if(typeof result.data!='undefined'&&typeof result.data.api_token!='undefined'){if(result.data.api_version==globalCompatibleWithAPIVersion){updateLocalUserFromServer(result,updateLocalUserFromServerSuccess);}
......@@ -244,6 +247,7 @@ else{if((typeof result[key]!='undefined')&&(result[key]!==null)&&(result[key]!="
myDebug(" on cherche si on a des vehicules ...");myDebug(result.vehicules);localStoreData("vehicules",null);localStoreData("vehiculesPro",null);if((typeof result.vehicules!='undefined')&&(result.vehicules!==null)&&(result.vehicules!="")){myDebug(" on a des vehicules ...");result.vehicules.forEach((v,key)=>{let storageKey="vehiculesPro"
if(v.is_perso)
storageKey="vehicules";addVehicule(storageKey,v.name,v.energy,v.power,v.type,v.kmbefore,v.number,v.uuid);});ret=true;}
myDebug(" mostFrequentRoutes:: on cherche si on a des itinéraires ...");myDebug(result.mostFrequentRoutes);localStoreData("mostFrequentRoutes",null);if((typeof result.mostFrequentRoutes!='undefined')&&(result.mostFrequentRoutes!==null)&&(result.mostFrequentRoutes!="")){myDebug(" mostFrequentRoutes:: on a des itinéraires ...");result.mostFrequentRoutes.forEach((v,key)=>{let storageKey="mostFrequentRoutes";addFrequentRoute(storageKey,v.depart,v.arrivee,v.distance,v.label,v.etapes);});ret=true;}
if(compareVersions(localGetData("official_app_version"),globalAppVersion)>0){myDebug("index.html : "+