From d56a1cced5770135914ef725ed3ed00f55652b41 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Mon, 2 May 2016 12:22:54 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20du=20champ=20commun=20`loc`=20dans=20la?= =?UTF-8?q?=20fiche=20compl=C3=A8te.=20Gestion=20compl=C3=A8te=20de=20la?= =?UTF-8?q?=20synchronisation=20avec=20v=C3=A9rification=20avant=20d'enreg?= =?UTF-8?q?istrer=20(deflater->storage)=20avec=20un=20hash=20pour=20=C3=A9?= =?UTF-8?q?viter=20d'enregistrer=20ce=20qui=20n'a=20pas=20chang=C3=A9.=20+?= =?UTF-8?q?=20Synchronisation=20avec=20histoire=20de=20timestamp=20(date?= =?UTF-8?q?=20de=20derni=C3=A8re=20modification)=20entre=20`mini`=20et=20`?= =?UTF-8?q?fiche`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/includes/input-html-data-min.js | 2 +- js/includes/input-html-data.js | 17 +++++-- js/includes/input-phone-fiche-min.js | 34 +++++++------- js/includes/input-phone-fiche.js | 69 +++++++++++++++++++++++++--- js/includes/input-phone-mini-min.js | 8 ++-- js/includes/input-phone-mini.js | 21 +++++++-- js/lib/api-min.js | 4 +- js/lib/api.js | 3 +- manager/module/module.php | 2 +- view/js/input.js | 4 ++ 10 files changed, 124 insertions(+), 40 deletions(-) diff --git a/js/includes/input-html-data-min.js b/js/includes/input-html-data-min.js index 13a3a5b..f536d41 100644 --- a/js/includes/input-html-data-min.js +++ b/js/includes/input-html-data-min.js @@ -1,3 +1,3 @@ var contactBuilder=new HTMLBuilder;contactBuilder.setLayout("

\n\t \n\t \n\t \n\t \n\t \n\t \n\t\n

\n\n"); var miniFicheBuilder=new HTMLBuilder;miniFicheBuilder.setLayout("
\n\t\n\t\n\t\n\t\n\t\n\t

@firstname @lastname (@username)

\n\t
\n\t\t\n\t\t   \n\t
\n\t
\n\t\t\n\t
\n\t
\n\t\t\n\t
\n\t
\n\t\tO\u00f9 habite t-elle/il\u00a0?
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   \n\t
\n
"); -var ficheBuilder=new HTMLBuilder;ficheBuilder.setLayout("
\n\t\n\t\n\t\n\t\n\t

@firstname @lastname (@username)

\n\t
\n\t\t\n\t\t   \n\t
\n\t
\n\t\t\n\t
\n\t
\n\t\t\n\t
\n\t
\n\t\tSituation familiale:
\n\t\t
\n\t\t   
\n\t\t   
\n\t\t   \n\t
\n\t
\n\t\t\n\t
\n\t

Type de relation

\n\t
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t
\n\t

O\u00f9 habite t-elle/il\u00a0?

\n\t
\n\t\t\n\t
\n\t
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t
\n\t
\n\t\tDepuis quand connaissez-vous cette personne ?

\n\t\tmois\n\t\tet    ans.\n\t
\n\t

Contexte de rencontre

\n\t
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t
\n\t
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t
\n\t

Avec quelle fr\u00e9quence discutez-vous avec cette personne\u00a0?

\n\t
\n\t\tFace \u00e0 face
\n\t\t   \n\t\t   \n\t\t   \n\t\t   \n\t
\n\t
\n\t\tT\u00e9l\u00e9phone ou skype et \u00e9quivalent
\n\t\t   \n\t\t   \n\t\t   \n\t\t   \n\t
\n\t
\n\t\tSMS, et \u00e9quivalents
\n\t\t   \n\t\t   \n\t\t   \n\t\t   \n\t
\n\t
\n\t\tCourrier \u00e9lectronique
\n\t\t   \n\t\t   \n\t\t   \n\t\t   \n\t
\n\t
\n\t\tFacebook ou autre r\u00e9seau social
\n\t\t   \n\t\t   \n\t\t   \n\t\t   \n\t
\n\t

Comment \u00eates-vous \u00ab\u00a0connect\u00e9\u00a0\u00bb \u00e0 cette personne\u00a0?

\n\t
\n\t\tSes coordonn\u00e9es sont dans votre carnet d\u2019adresse
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tSon num\u00e9ro de mobile est enregistr\u00e9 sur votre mobile (ou vous-m\u00eames \u00eates sur le sien)
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tElle figure parmi vos amis facebook
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tElle figure parmi vos amis facebook et vous interagissez avec elle sur ce dispositif r\u00e9guli\u00e8rement
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tVous le suivez sur Twitter
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tVous communiquez avec cette personne sur Twitter
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tVous communiquez dans autre r\u00e9seau social : \n\t
\n\t
\n\t\tVous communiquez dans un autre dispositif (blogs, jeu vid\u00e9o ou autre) : \n\t
\n
\n"); +var ficheBuilder=new HTMLBuilder;ficheBuilder.setLayout("
\n\t\n\t\n\t\n\t\n\t

@firstname @lastname (@username)

\n\t
\n\t\t\n\t\t   \n\t
\n\t
\n\t\t\n\t
\n\t
\n\t\t\n\t
\n\t
\n\t\tSituation familiale:
\n\t\t
\n\t\t   
\n\t\t   
\n\t\t   \n\t
\n\t
\n\t\t\n\t
\n\t

Type de relation

\n\t
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t
\n\t

O\u00f9 habite t-elle/il\u00a0?

\n\t
\n\t\t\n\t
\n\t
\n\t\tO\u00f9 habite t-elle/il\u00a0?
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   \n\t
\n\t
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t
\n\t
\n\t\tDepuis quand connaissez-vous cette personne ?

\n\t\tmois\n\t\tet    ans.\n\t
\n\t

Contexte de rencontre

\n\t
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t
\n\t
\n\t\t   
\n\t\t   
\n\t\t   
\n\t\t   
\n\t
\n\t

Avec quelle fr\u00e9quence discutez-vous avec cette personne\u00a0?

\n\t
\n\t\tFace \u00e0 face
\n\t\t   \n\t\t   \n\t\t   \n\t\t   \n\t
\n\t
\n\t\tT\u00e9l\u00e9phone ou skype et \u00e9quivalent
\n\t\t   \n\t\t   \n\t\t   \n\t\t   \n\t
\n\t
\n\t\tSMS, et \u00e9quivalents
\n\t\t   \n\t\t   \n\t\t   \n\t\t   \n\t
\n\t
\n\t\tCourrier \u00e9lectronique
\n\t\t   \n\t\t   \n\t\t   \n\t\t   \n\t
\n\t
\n\t\tFacebook ou autre r\u00e9seau social
\n\t\t   \n\t\t   \n\t\t   \n\t\t   \n\t
\n\t

Comment \u00eates-vous \u00ab\u00a0connect\u00e9\u00a0\u00bb \u00e0 cette personne\u00a0?

\n\t
\n\t\tSes coordonn\u00e9es sont dans votre carnet d\u2019adresse
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tSon num\u00e9ro de mobile est enregistr\u00e9 sur votre mobile (ou vous-m\u00eames \u00eates sur le sien)
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tElle figure parmi vos amis facebook
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tElle figure parmi vos amis facebook et vous interagissez avec elle sur ce dispositif r\u00e9guli\u00e8rement
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tVous le suivez sur Twitter
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tVous communiquez avec cette personne sur Twitter
\n\t\t   \n\t\t   \n\t
\n\t
\n\t\tVous communiquez dans autre r\u00e9seau social : \n\t
\n\t
\n\t\tVous communiquez dans un autre dispositif (blogs, jeu vid\u00e9o ou autre) : \n\t
\n
\n"); diff --git a/js/includes/input-html-data.js b/js/includes/input-html-data.js index 45101b8..745f696 100644 --- a/js/includes/input-html-data.js +++ b/js/includes/input-html-data.js @@ -277,10 +277,19 @@ ficheBuilder.setLayout( "\t
\n"+ - "\t\t   
\n"+ - "\t\t   
\n"+ - "\t\t   
\n"+ - "\t\t   
\n"+ + "\t\tOù habite t-elle/il ?
\n"+ + "\t\t   
\n"+ + "\t\t   
\n"+ + "\t\t   
\n"+ + "\t\t   \n"+ + "\t
\n"+ + + + "\t
\n"+ + "\t\t   
\n"+ + "\t\t   
\n"+ + "\t\t   
\n"+ + "\t\t   
\n"+ "\t
\n"+ "\t
\n"+ diff --git a/js/includes/input-phone-fiche-min.js b/js/includes/input-phone-fiche-min.js index c277dbb..b5c467a 100644 --- a/js/includes/input-phone-fiche-min.js +++ b/js/includes/input-phone-fiche-min.js @@ -1,21 +1,23 @@ function inputPhoneFiche(a,b){this.container=a;this.nav_container=b} -inputPhoneFiche.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null,defaultData:{firstname:"",lastname:"",username:"",sexe:[{status:!0},{status:!1}],age:"",job:".",famsit:[{status:!0},{status:!1},{status:!1}],studies:".",reltype:[{status:!0},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1}],reltypeSpecial:"",city:"",loc:[{status:!0},{status:!1},{status:!1},{status:!1}],duration:["",""],context:[{status:!0},{status:!1}, -{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1}],contextSpecial:["","",""],freq:[[{status:!0},{status:!1},{status:!1},{status:!1}],[{status:!0},{status:!1},{status:!1},{status:!1}],[{status:!0},{status:!1},{status:!1},{status:!1}],[{status:!0},{status:!1},{status:!1},{status:!1}],[{status:!0},{status:!1},{status:!1},{status:!1}]],connect:[[{status:!1},{status:!0}],[{status:!1},{status:!0}],[{status:!1}, -{status:!0}],[{status:!1},{status:!0}],[{status:!1},{status:!0}],[{status:!1},{status:!0}]],connectSpecial:["",""]}}; -inputPhoneFiche.prototype.fieldsToStorage=function(){console.log("FICHE: FIELDS TO STORAGE");for(var a=$$("article.relation-panel .fiche-relation"),b=0;b FICHE UPDATE");c={uid:c.uid.value,firstname:e.firstname,lastname:e.lastname,username:e.username, +sexe:c.sexe,age:c.age.value,job:c.job.value,famsit:c.famsit,studies:c.studies.value,reltype:c.reltype,reltypeSpecial:c.reltypeSpecial.value,city:c.city.value,loc:c.loc,loc2:c.loc2,duration:[c.duration[0].value,c.duration[1].value],context:c.context,contextSpecial:[c.contextSpecial[0].value,c.contextSpecial[1].value,c.contextSpecial[2].value],freq:[c.freq0,c.freq1,c.freq2,c.freq3,c.freq4],connect:[c.connect0,c.connect1,c.connect2,c.connect3,c.connect4,c.connect5],connectSpecial:[c.connectSpecial[0].value, +c.connectSpecial[1].value],hash:d};c.valid=this.check(c);c.timestamp=Date.now();lsi.set("fiches",c.uid,c)}}; inputPhoneFiche.prototype.add=function(a){console.log("FICHE: ADD");if(null==a.uid)return!1;a.firstname=null!=a.firstname?a.firstname:this.defaultData.firstname;a.lastname=null!=a.lastname?a.lastname:this.defaultData.lastname;a.username=null!=a.username?a.username:this.defaultData.username;a.age=null!=a.age?a.age:this.defaultData.age;a.city=null!=a.city?a.city:this.defaultData.city;a.duration[0]=null!=a.duration[0]?a.duration[0]:this.defaultData.duration[0];a.duration[1]=null!=a.duration[1]?a.duration[1]: this.defaultData.duration[1];a.reltypeSpecial=null!=a.reltypeSpecial?a.reltypeSpecial:this.defaultData.reltypeSpecial;a.contextSpecial[0]=null!=a.contextSpecial[0]?a.contextSpecial[0]:this.defaultData.contextSpecial[0];a.contextSpecial[1]=null!=a.contextSpecial[1]?a.contextSpecial[1]:this.defaultData.contextSpecial[1];a.contextSpecial[2]=null!=a.contextSpecial[2]?a.contextSpecial[2]:this.defaultData.contextSpecial[2];a.connectSpecial[0]=null!=a.connectSpecial[0]?a.connectSpecial[0]:this.defaultData.connectSpecial[0]; -a.connectSpecial[1]=null!=a.connectSpecial[1]?a.connectSpecial[1]:this.defaultData.connectSpecial[1];a.job=null!=a.job?a.job:this.defaultData.job;a.studies=null!=a.studies?a.studies:this.defaultData.studies;a.sexe=null!=a.sexe?a.sexe:this.defaultData.sexe;a.famsit=null!=a.famsit?a.famsit:this.defaultData.famsit;a.reltype=null!=a.reltype?a.reltype:this.defaultData.reltype;a.loc=null!=a.loc?a.loc:this.defaultData.loc;a.context=null!=a.context?a.context:this.defaultData.context;a.freq=null!=a.freq?a.freq: -this.defaultData.freq;a.connect=null!=a.connect?a.connect:this.defaultData.connect;this.container.innerHTML+=ficheBuilder.build({firstname:a.firstname,lastname:a.lastname,username:a.username,uid:a.uid,age:a.age,city:a.city,duration0:a.duration[0],duration1:a.duration[1],reltypespecial:a.reltypeSpecial,contextspecial0:a.contextSpecial[0],contextspecial1:a.contextSpecial[1],contextspecial2:a.contextSpecial[2],connectspecial0:a.connectSpecial[0],connectspecial1:a.connectSpecial[1]});var b=$('article.fiche-relation input[data-name="uid"][value="'+ -a.uid+'"] ~ h5>span>select[data-name="job"]>option[value="'+a.job+'"]');null!=b&&b.setAttribute("selected","selected");b=$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+a.studies+'"]');null!=b&&b.setAttribute("selected","selected");for(var c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'),b=0;binput[type="radio"][data-name="famsit"]');for(b=0;binput[type="radio"][data-name="reltype"]');for(b=0;binput[type="radio"][data-name="loc"]');for(b=0;binput[type="radio"][data-name="context"]');for(b=0;binput[type="radio"][data-name="freq'+c+'"]'),b=0;binput[type="radio"][data-name="connect'+c+'"]'),b=0;bb;b++){var c=lsi.get("contacts",a[b]),d=lsi.get("fiches",a[b]);null==d&&(d=this.defaultData);d.uid=c.uid;d.firstname=c.firstname;d.lastname=c.lastname;d.username=c.username;lsi.set("fiches",a[b],d)}}; -inputPhoneFiche.prototype.nav=function(a){if("undefined"==typeof a||isNaN(a.innerHTML)||"nav-fiche"!=a.parentNode.id)return!1;for(var b=$$("#nav-fiche > span.active"),c=0;cspan>select[data-name="job"]>option[value="'+a.job+'"]');null!=b&&b.setAttribute("selected","selected");b=$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+a.studies+'"]');null!=b&&b.setAttribute("selected","selected");for(var c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'),b=0;binput[type="radio"][data-name="famsit"]');for(b=0;binput[type="radio"][data-name="reltype"]');for(b=0;binput[type="radio"][data-name="loc"]');for(b=0;binput[type="radio"][data-name="loc2"]');for(b=0;binput[type="radio"][data-name="context"]');for(b=0;binput[type="radio"][data-name="freq'+c+'"]'),b=0;binput[type="radio"][data-name="connect'+c+'"]'),b=0;bb;b++){var c=lsi.get("contacts",a[b]),d=lsi.get("fiches",a[b]);null==d&&(d=this.defaultData);d.uid=c.uid;d.firstname=c.firstname;d.lastname=c.lastname;d.username=c.username;lsi.set("fiches",a[b],d)}var a=lsi["export"]("mini-fiches"),d=lsi["export"]("fiches"),e;for(e in d)d[e].timestamp>a[e].timestamp?(a[e].sexe=d[e].sexe,a[e].age=d[e].age,a[e].job=d[e].job,a[e].loc=d[e].loc):(d[e].sexe= +a[e].sexe,d[e].age=a[e].age,d[e].job=a[e].job,d[e].loc=a[e].loc),lsi.set("mini-fiches",e,a[e]),lsi.set("fiches",e,d[e])};inputPhoneFiche.prototype.nav=function(a){if("undefined"==typeof a||isNaN(a.innerHTML)||"nav-fiche"!=a.parentNode.id)return!1;for(var b=$$("#nav-fiche > span.active"),c=0;c"}for(var d in a)b=this.nav_container.children[a[d].uid],b.innerHTML=a[d].uid+1,!0===a[d].valid?b.addClass("done"):b.remClass("done");this.nav(this.nav_container.children[this.selected])}; -inputPhoneFiche.prototype.check=function(a){if(isNaN(parseInt(a.age))||2>a.city.length||isNaN(parseInt(a.duration[0]))&&0a.reltypeSpecial.length||a.context[11].status&&2>a.contextSpecial[0].length||a.context[12].status&&2>a.contextSpecial[1].length||a.context[13].status&&2>a.contextSpecial[2].length?!1:!0}; +inputPhoneFiche.prototype.check=function(a){if(isNaN(parseInt(a.age))||2>a.city.length||isNaN(parseInt(a.duration[0]))&&0a.reltypeSpecial.length||a.context[11].status&&2>a.contextSpecial[0].length||a.context[12].status&&2>a.contextSpecial[1].length||a.context[13].status&&2>a.contextSpecial[2].length?!1:!0}; inputPhoneFiche.prototype.attach=function(a){console.log("FICHE: ATTACH");lsi.createDataset("fiches");this.storageToFields();this.handler=a;var b=this,b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)}; diff --git a/js/includes/input-phone-fiche.js b/js/includes/input-phone-fiche.js index a1c7ec8..5ab6339 100644 --- a/js/includes/input-phone-fiche.js +++ b/js/includes/input-phone-fiche.js @@ -26,6 +26,7 @@ inputPhoneFiche.prototype = { reltypeSpecial: '', city: '', loc: [ {status:true}, {status:false}, {status:false}, {status:false} ], + loc2: [ {status:true}, {status:false}, {status:false}, {status:false} ], duration: ['', ''], context: [ {status:true}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, @@ -44,7 +45,9 @@ inputPhoneFiche.prototype = { [ {status:false}, {status:true} ], [ {status:false}, {status:true} ], [ {status:false}, {status:true} ]], - connectSpecial: ['', ''] + connectSpecial: ['', ''], + timestamp: 0, + valid: false } }; @@ -63,9 +66,11 @@ inputPhoneFiche.prototype.fieldsToStorage = function(){ // {3} On enregistre ce contact si le numéro n'est pas vide et soit pseudo/prénom/nom // var deflated = deflater.deflate(); + // On crée le hash + var deflatedHash = crc32(JSON.stringify(deflated)); - // console.log(deflated); + // console.log( deflated ); // {4} On récupère les données du LSI si elles existent // @@ -80,6 +85,13 @@ inputPhoneFiche.prototype.fieldsToStorage = function(){ // {5} On récupère et met en forme les valeurs du deflater // + // Si le hash est le même, on ne fait rien + if( existingData.hash != null && existingData.hash == deflatedHash ) + return; + + console.warn('> FICHE UPDATE'); + + var obj = { uid: deflated.uid.value, firstname: existingData.firstname, @@ -94,6 +106,7 @@ inputPhoneFiche.prototype.fieldsToStorage = function(){ reltypeSpecial: deflated.reltypeSpecial.value, city: deflated.city.value, loc: deflated.loc, // Choix 1 à 3 + loc2: deflated.loc2, // Choix 1 à 3 duration: [ deflated.duration[0].value, // Durée de la relation en mois deflated.duration[1].value // Durée de la relation en années @@ -122,14 +135,16 @@ inputPhoneFiche.prototype.fieldsToStorage = function(){ connectSpecial: [ deflated.connectSpecial[0].value, deflated.connectSpecial[1].value - ] + ], + hash: deflatedHash }; - /* (6) On vérifie la validité des données et on l'enregistre dans l'objet */ - obj.valid = this.check(obj); + /* (6) On vérifie la validité des données et on l'enregistre dans l'objet avec la date de modification */ + obj.valid = this.check(obj); + obj.timestamp = Date.now(); - // {6} On enregistre les données dans le 'localStorage' // + /* (7) On enregistre les données dans le 'localStorage' */ lsi.set('fiches', obj.uid, obj); } }; @@ -181,6 +196,7 @@ inputPhoneFiche.prototype.add = function(objectData){ objectData.famsit = (objectData.famsit != null) ? objectData.famsit : this.defaultData.famsit; objectData.reltype = (objectData.reltype != null) ? objectData.reltype : this.defaultData.reltype; objectData.loc = (objectData.loc != null) ? objectData.loc : this.defaultData.loc; + objectData.loc2 = (objectData.loc2 != null) ? objectData.loc2 : this.defaultData.loc2; objectData.context = (objectData.context != null) ? objectData.context : this.defaultData.context; objectData.freq = (objectData.freq != null) ? objectData.freq : this.defaultData.freq; objectData.connect = (objectData.connect != null) ? objectData.connect : this.defaultData.connect; @@ -243,6 +259,12 @@ inputPhoneFiche.prototype.add = function(objectData){ if( objectData.loc[i].status ) locCreated[i].setAttribute('checked', 'checked'); else locCreated[i].removeAttribute('checked'); + /* (7bis) On sélectionna la valeur des boutons pour la LOCATION */ + var loc2Created = $$('article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="loc2"]'); + for( var i = 0 ; i < loc2Created.length && i < objectData.loc2.length ; i++ ) + if( objectData.loc2[i].status ) loc2Created[i].setAttribute('checked', 'checked'); + else loc2Created[i].removeAttribute('checked'); + /* (8) On sélectionna la valeur des boutons pour le CONTEXTE DE RENCONTRE */ var contextCreated = $$('article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="context"]'); @@ -324,6 +346,8 @@ inputPhoneFiche.prototype.storageToFields = function(){ inputPhoneFiche.prototype.sync = function(){ console.log('FICHE: SYNC'); + /* (1) Mise à jour en fonction des contacts + ---------------------------------------------------------*/ /* (1) On récupère les clés de tous les CONTACTS */ var contactUIDs = lsi.keys('contacts'); @@ -351,7 +375,37 @@ inputPhoneFiche.prototype.sync = function(){ /* (7) On enregistre les modification */ lsi.set('fiches', contactUIDs[i], ficheData); + } + /* (2) Mise à jour en fonction des MINI fiches + ---------------------------------------------------------*/ + /* (1) On récupère les valeurs des MINI fiches et des FICHES */ + var miniData = lsi.export('mini-fiches'); + var ficheData = lsi.export('fiches'); + + + /* (2) Pour chaque champ, on synchronise les MINI fiches avec les FICHES associées */ + for( var key in ficheData ){ + var ficheModifiedLast = ficheData[key].timestamp > miniData[key].timestamp; + + /* (3) Si la FICHE a été modifiée en dernier, on utilise ses données */ + if( ficheModifiedLast ){ + miniData[key].sexe = ficheData[key].sexe; + miniData[key].age = ficheData[key].age; + miniData[key].job = ficheData[key].job; + miniData[key].loc = ficheData[key].loc; + + /* (4) Sinon, on utilise les données de la MINI */ + }else{ + ficheData[key].sexe = miniData[key].sexe; + ficheData[key].age = miniData[key].age; + ficheData[key].job = miniData[key].job; + ficheData[key].loc = miniData[key].loc; + } + + /* (5) On enregistre les modifications */ + lsi.set('mini-fiches', key, miniData[key]); + lsi.set('fiches', key, ficheData[key]); } }; @@ -472,6 +526,9 @@ inputPhoneFiche.prototype.check = function(ficheData){ // 11. La DISTANCE DE DOMICILE (location) a un et un seul choix if( !checkRadioValue(ficheData.loc) ) return false; + // 11bis. La DISTANCE DE DOMICILE (location 2) a un et un seul choix + if( !checkRadioValue(ficheData.loc2) ) + return false; // 12. Le CONTEXTE DE RENCONTRE a un et un seul choix if( !checkRadioValue(ficheData.context) ) return false; diff --git a/js/includes/input-phone-mini-min.js b/js/includes/input-phone-mini-min.js index 733abc9..f65d932 100644 --- a/js/includes/input-phone-mini-min.js +++ b/js/includes/input-phone-mini-min.js @@ -1,10 +1,10 @@ -function inputPhoneMini(a,b){this.container=a;this.nav_container=b}inputPhoneMini.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null,defaultData:{firstname:"",lastname:"",username:"",sexe:[{status:!0},{status:!1}],age:"",job:".",loc:[{status:!0},{status:!1},{status:!1},{status:!1}]}}; -inputPhoneMini.prototype.fieldsToStorage=function(){console.log("MINI FICHE: FIELDS TO STORAGE");for(var a=$$("article.mini-relation-panel .mini-fiche-relation"),b=0;b MINI UPDATE");c={uid:c.uid.value,firstname:d.firstname,lastname:d.lastname, +username:d.username,sexe:c.sexe,age:c.age.value,job:c.job.value,loc:c.loc,hash:e};c.valid=this.check(c);c.timestamp=Date.now();lsi.set("mini-fiches",c.uid,c)}}; inputPhoneMini.prototype.add=function(a){console.log("MINI FICHE: ADD");if(null==a||null==a.uid)return!1;a.firstname=null!=a.firstname?a.firstname:this.defaultData.firstname;a.lastname=null!=a.lastname?a.lastname:this.defaultData.lastname;a.username=null!=a.username?a.username:this.defaultData.username;a.age=null!=a.age?a.age:this.defaultData.age;a.sexe=null!=a.sexe?a.sexe:this.defaultData.sexe;a.job=null!=a.job?a.job:this.defaultData.job;a.loc=null!=a.loc?a.loc:this.defaultData.loc;this.container.innerHTML+= miniFicheBuilder.build({firstname:a.firstname,lastname:a.lastname,username:a.username,uid:a.uid,age:a.age,job:a.job});var b=$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="job"]>option[value="'+a.job+'"]');null!=b&&b.setAttribute("selected","selected");for(var c=$$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'),b=0;binput[type="radio"][data-name="loc"]');for(b=0;b span.active"),c=0;c"}for(var d in a)b=this.nav_container.children[a[d].uid],b.innerHTML=a[d].uid+1,!0===a[d].valid?b.addClass("done"):b.remClass("done");this.nav(this.nav_container.children[this.selected])}; +inputPhoneMini.prototype.updateNavBar=function(){var a=lsi["export"]("mini-fiches"),b=Object.keys(a).length;if(this.nav_container.children.length!=b){this.nav_container.innerHTML="";for(var c=0;c"}for(var e in a)b=this.nav_container.children[a[e].uid],b.innerHTML=a[e].uid+1,!0===a[e].valid?b.addClass("done"):b.remClass("done");this.nav(this.nav_container.children[this.selected])}; inputPhoneMini.prototype.check=function(a){return!isNaN(parseInt(a.age))&&checkRadioValue(a.sexe)&&"."!=a.job&&checkRadioValue(a.loc)?!0:!1};inputPhoneMini.prototype.attach=function(a){console.log("MINI FICHE: ATTACH");lsi.createDataset("mini-fiches");this.storageToFields();this.handler=a;var b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)}; diff --git a/js/includes/input-phone-mini.js b/js/includes/input-phone-mini.js index 31ff70b..128d315 100644 --- a/js/includes/input-phone-mini.js +++ b/js/includes/input-phone-mini.js @@ -19,7 +19,9 @@ inputPhoneMini.prototype = { sexe: [{status:true}, {status:false}], age: '', job: '.', - loc: [{status:true}, {status:false}, {status:false}, {status:false}] + loc: [{status:true}, {status:false}, {status:false}, {status:false}], + timestamp: 0, + valid: false } }; @@ -37,6 +39,8 @@ inputPhoneMini.prototype.fieldsToStorage = function(){ // {3} On enregistre ce contact si le numéro n'est pas vide et soit pseudo/prénom/nom // var deflated = deflater.deflate(); + // On crée le hash + var deflatedHash = crc32(JSON.stringify(deflated)); // console.log(deflated); @@ -54,6 +58,13 @@ inputPhoneMini.prototype.fieldsToStorage = function(){ // {5} On récupère et met en forme les valeurs du deflater // + // Si le hash est le même, on ne fait rien + if( existingData.hash != null && existingData.hash == deflatedHash ) + return; + + console.warn('> MINI UPDATE'); + + var obj = { uid: deflated.uid.value, firstname: existingData.firstname, @@ -62,11 +73,13 @@ inputPhoneMini.prototype.fieldsToStorage = function(){ sexe: deflated.sexe, // [0] Homme, [1] Femme age: deflated.age.value, job: deflated.job.value, - loc: deflated.loc // [0] Choix 1 -> [3] Choix 4 + loc: deflated.loc, // [0] Choix 1 -> [3] Choix 4 + hash: deflatedHash }; - /* (8) On vérifie la validité des données et on l'enregistre dans l'objet */ - obj.valid = this.check(obj); + /* (8) On vérifie la validité des données et on l'enregistre dans l'objet avec la date de modification */ + obj.valid = this.check(obj); + obj.timestamp = Date.now(); /* (9) On enregistre les données dans le 'localStorage' */ diff --git a/js/lib/api-min.js b/js/lib/api-min.js index e116455..daa0b69 100644 --- a/js/lib/api-min.js +++ b/js/lib/api-min.js @@ -1,3 +1,3 @@ function APIClass(b){this.target=b} -APIClass.prototype={xhr:[],send:function(b,d,g){b.hasOwnProperty("path")||d({ModuleError:4});for(var a=0;a$methodData) - $markdown .= "- `$methodName` - ".$methodData['description']."
"; + $markdown .= "`$methodName` - ".$methodData['description']."
"; $markdown .= '----
'; diff --git a/view/js/input.js b/view/js/input.js index cb1d683..78e77f4 100644 --- a/view/js/input.js +++ b/view/js/input.js @@ -99,8 +99,12 @@ function dynamicUpdate(target){ miniManager.sync(); /* (5) On synchronise les FICHE avec les CONTACTS */ + // La synchronisation des champs communs est aussi faite entre `mini` et `fiches` + // 1. Si les valeurs de `fiche` sont pas définis, on prend les valeurs de `mini` + // 2. Sinon, on prend les valeurs de `fiche` ficheManager.sync(); + /* (6) On affiche le tout */ miniManager.storageToFields(); ficheManager.storageToFields();