From 0e961f69b97a51e1bbaf7c241274fd40d5dfd787 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Fri, 21 Oct 2016 14:11:47 +0200 Subject: [PATCH] =?UTF-8?q?Calcul=20du=20hash=20lors=20du=20`storageToFiel?= =?UTF-8?q?ds`=20car=20c'est=20la=20qu'on=20verra=20s'il=20y=20a=20de=20"r?= =?UTF-8?q?=C3=A9elles"=20modifications=20par=20l'utilisateur=20+=20V?= =?UTF-8?q?=C3=A9rification=20du=20hash=20lors=20de=20`fieldsToStorage`=20?= =?UTF-8?q?[POUR=20LES=20PHONE.FICHES]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public_html/js/includes/input-phone-fiche.js | 114 +++++++++--------- .../js/includes/min/input-phone-fiche.js | 21 ++-- 2 files changed, 68 insertions(+), 67 deletions(-) diff --git a/public_html/js/includes/input-phone-fiche.js b/public_html/js/includes/input-phone-fiche.js index 4633370..110cf62 100644 --- a/public_html/js/includes/input-phone-fiche.js +++ b/public_html/js/includes/input-phone-fiche.js @@ -42,41 +42,29 @@ inputPhoneFiche.prototype = { inputPhoneFiche.prototype.fieldsToStorage = function(){ console.group('[phone.fiche] fields to storage'); - // {1} Pour chaque formulaire de contact présent // + var i, l, deflater, deflated, existingData, obj, hash; + + /* (1) Pour chaque formulaire de contact présent + ---------------------------------------------------------*/ var existingFiches = $$('[data-sublink="phone"] article.relation-panel .fiche-relation'); - for( var i = 0 ; i < existingFiches.length ; i++ ){ + for( i = 0, l = existingFiches.length ; i < l ; i++ ){ - // {2} On initialise notre deflater pour récupérer les valeurs // - var deflater = new FormDeflater(existingFiches[i], ['input', 'select'], ['data-name']); + /* (1) On initialise notre deflater pour récupérer les valeurs */ + deflater = new FormDeflater(existingFiches[i], ['input', 'select'], ['data-name']); - // {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)); + /* (2) On récupère les données */ + deflated = deflater.deflate(); + /* (3) On récupère les données du LSI si elles existent */ + existingData = lsi.get('p_fiches', deflated.uid); - // console.log( deflated ); - - - // {4} On récupère les données du LSI si elles existent // - var existingData = lsi.get('p_fiches', deflated.uid); - - - // Si n'existe pas, on passe au suivant + // Si erreur, on passe à la fiche suivante if( existingData === false ) continue; - // {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 != null && existingData.hash != null ) - if( existingData.hash === 0 ) - console.log('FICHE#'+existingData.uid+' UPDATED BUT NO TIMESTAMP UPDATE'); - else if( existingData.hash == deflatedHash ) - return; - - - var obj = { + /* (4) On récupère et met en forme les valeurs du deflater */ + obj = { contact: parseInt(deflated.contact), uid: parseInt(deflated.uid), sexe: deflated.sexe, @@ -95,38 +83,30 @@ inputPhoneFiche.prototype.fieldsToStorage = function(){ contextSpecial: deflated.contextSpecial, freq: deflated.freq, connect: deflated.connect, - connectSpecial: deflated.connectSpecial, - hash: deflatedHash + connectSpecial: deflated.connectSpecial }; + /* (5) On calcule/compare le hash */ - /* (6) On vérifie la validité des données et on l'enregistre dans l'objet avec la date de modification */ + // {5.1} On calcule le hash // + hash = crc32( JSON.stringify(obj) ); + + // {5.2} Si le hash est identique, on ne fait rien // + if( existingData != null && existingData.hash != null && hash == existingData.hash ) + continue; + + // {5.3} On enregistre le hash // + obj.hash = hash; + + + /* (6) On calcule la validité des données */ obj.valid = this.check(obj); - // On met à jour la date de modification, si on a pas qu'@uid de différent - // {6.1} Si on doit mettre à jour // - if( existingData.hash !== 0 ){ + /* (7) On met à jour le `timestamp` (car à ce point, on a une modification) */ + obj.timestamp = Date.now(); + console.warn('> FICHE UPDATE ('+(obj.timestamp-input_ts)+')'); - // Si on a des modifications, on met à jour le `timestamp` // - if( diff(existingData, obj, ['hash', 'valid', 'timestamp']).length > 0 ){ - console.log( diff(existingData, obj, ['hash', 'valid', 'timestamp']) ); - - obj.timestamp = Date.now(); - console.warn('> FICHE UPDATE ('+(obj.timestamp-input_ts)+')'); - - } - - if( existingData['timestamp'] == undefined || !isNaN(existingData.timestamp) ) - obj.timestamp = Date.now(); - - // {6.2} Initialisation du `timestamp` si pas encore fait // - }else if( existingData['timestamp'] == undefined || !isNaN(existingData.timestamp) ) - obj.timestamp = 0; - - - - /* (7) On enregistre les données dans le 'localStorage' */ - console.warn('saving fiche#'+obj.uid+' with timestamp of '+obj.timestam+' and hash of '+existingData.hash+' and now '+obj.hash); + /* (8) On enregistre les données dans le 'localStorage' */ lsi.set('p_fiches', obj.uid, obj); } @@ -327,16 +307,38 @@ inputPhoneFiche.prototype.add = function(objectData){ inputPhoneFiche.prototype.storageToFields = function(){ console.group('[phone.fiche] storage to fields'); - // {1} Pour chaque contact du 'localStorage' // + var clone, hash; + + /* (1) On récupère les fiches du 'localStorage' */ var ficheData = lsi.export('p_fiches'); - // On réinitialise le HTML + /* (2) On réinitialise le HTML */ this.container.innerHTML = ''; - for( var key in ficheData ) - if( ficheData[key].uid == this.selected ) + /* (3) Pour chaque fiche */ + for( var key in ficheData ){ + + // {3.1} Pour toutes les fiches // + + // On enregistre le hash (sans `timestamp`, `hash`, `valid`) + clone = cloneObject( ficheData[key] ); + delete clone['hash']; + delete clone['timestamp']; + delete clone['valid']; + ficheData[key].hash = crc32( JSON.stringify(clone) ); + + // On enregistre dans le `localStorage` + lsi.set('p_fiches', ficheData[key].uid, ficheData[key]); + + // {3.2} Pour la fiche à rendre graphiquement // + if( ficheData[key].uid == this.selected ){ + this.add(ficheData[key]); + } + + } + // {4} On met à jour la navigation // this.updateNavBar(); diff --git a/public_html/js/includes/min/input-phone-fiche.js b/public_html/js/includes/min/input-phone-fiche.js index 1efbe86..3ac621e 100644 --- a/public_html/js/includes/min/input-phone-fiche.js +++ b/public_html/js/includes/min/input-phone-fiche.js @@ -1,7 +1,6 @@ function inputPhoneFiche(a,c){this.container=a;this.nav_container=c;this.top_size=10}inputPhoneFiche.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null,defaultData:{sexe:"2",age:".",job:".",famsit:"0",studies:"0",reltype:"0",reltypeSpecial:"",city:"",quartier:"",cp:"",loc:"0",duration:["",""],context:"0",contextSpecial:["","",""],freq:["4","9","14","19","24"],connect:"1 3 5 7 9 11".split(" "),connectSpecial:["",""],timestamp:0,valid:!1}}; -inputPhoneFiche.prototype.fieldsToStorage=function(){console.group("[phone.fiche] fields to storage");for(var a=$$('[data-sublink="phone"] article.relation-panel .fiche-relation'),c=0;c FICHE UPDATE ("+(b.timestamp- -input_ts)+")")),void 0!=g.timestamp&&isNaN(g.timestamp)||(b.timestamp=Date.now())):void 0!=g.timestamp&&isNaN(g.timestamp)||(b.timestamp=0);console.warn("saving fiche#"+b.uid+" with timestamp of "+b.timestam+" and hash of "+g.hash+" and now "+b.hash);lsi.set("p_fiches",b.uid,b)}}console.groupEnd()}; +inputPhoneFiche.prototype.fieldsToStorage=function(){console.group("[phone.fiche] fields to storage");var a,c,b,d,k,e=$$('[data-sublink="phone"] article.relation-panel .fiche-relation');a=0;for(c=e.length;a FICHE UPDATE ("+(d.timestamp-input_ts)+")"),lsi.set("p_fiches",d.uid,d);console.groupEnd()}; inputPhoneFiche.prototype.add=function(a){if(null==a.uid||isNaN(a.uid)||null==a.contact||isNaN(a.contact))return!1;a.city=null!=a.city?a.city:this.defaultData.city;a.quartier=null!=a.quartier?a.quartier:this.defaultData.quartier;a.cp=null!=a.cp?a.cp:this.defaultData.cp;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.age=null!=a.age?a.age:this.defaultData.age;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: @@ -12,13 +11,13 @@ contextspecial2:a.contextSpecial[2],connectspecial0:a.connectSpecial[0],connects a.uid+'"] ~ h5>input[type="radio"][data-name="famsit"]');for(c=0;cinput[type="radio"][data-name="reltype"]');for(c=0;cinput[type="radio"][data-name="loc"]');for(c=0;cinput[type="radio"][data-name="context"]');for(c=0;cinput[type="radio"][data-name="freq"]');for(c=0;cinput[type="radio"][data-name="connect"]');for(c=0;c=h)break}var d,e,k,h={};g={};var a=lsi["export"]("p_fiches"), -c=lsi["export"]("p_mini-fiches"),l;for(l in a)if(d=lsi.get("p_contacts",a[l].contact),!(0 span.active'),b=0;bAPPELS");20>h&&b'+(h%20+1)+"  ":(20==h&&(this.nav_container.innerHTML+='
   SMS   '),this.nav_container.innerHTML+=''+(h%20+1)+"")}for(var g in a)c=$('[data-sublink="phone"] #p_nav-fiche [data-n="'+a[g].uid+'"]'),null!=c&&(!0===a[g].valid?c.addClass("done"):c.remClass("done"));this.nav($('[data-sublink="phone"] #p_nav-fiche [data-n="'+this.selected+'"]'))}; +inputPhoneFiche.prototype.storageToFields=function(){console.group("[phone.fiche] storage to fields");var a,c=lsi["export"]("p_fiches");this.container.innerHTML="";for(var b in c)a=cloneObject(c[b]),delete a.hash,delete a.timestamp,delete a.valid,c[b].hash=crc32(JSON.stringify(a)),lsi.set("p_fiches",c[b].uid,c[b]),c[b].uid==this.selected&&this.add(c[b]);this.updateNavBar();console.groupEnd()}; +inputPhoneFiche.prototype.sync=function(){console.group("[phone.fiche] synchronisation");var a=lsi["export"]("p_contacts"),c=[],b,d=lsi.keys("p_contacts").length<2*this.top_size?lsi.keys("p_contacts").length:2*this.top_size,k;for(k in a){for(ficheUid=0;-1=d)break}var e,f,h,d={};k={};var a=lsi["export"]("p_fiches"), +c=lsi["export"]("p_mini-fiches"),l;for(l in a)if(e=lsi.get("p_contacts",a[l].contact),!(0 span.active'),b=0;bAPPELS");20>d&&b'+(d%20+1)+"  ":(20==d&&(this.nav_container.innerHTML+='
   SMS   '),this.nav_container.innerHTML+=''+(d%20+1)+"")}for(var k in a)c=$('[data-sublink="phone"] #p_nav-fiche [data-n="'+a[k].uid+'"]'),null!=c&&(!0===a[k].valid?c.addClass("done"):c.remClass("done"));this.nav($('[data-sublink="phone"] #p_nav-fiche [data-n="'+this.selected+'"]'))}; inputPhoneFiche.prototype.check=function(a){if(2>a.city.length||isNaN(parseInt(a.duration[0]))&&0a.reltypeSpecial.length|| "11"==a.context&&2>a.contextSpecial[0].length||"12"==a.context&&2>a.contextSpecial[1].length||"13"==a.context&&2>a.contextSpecial[2].length?!1:!0};inputPhoneFiche.prototype.attach=function(a){console.group("[phone.fiche] attaching events");lsi.createDataset("p_fiches");this.storageToFields();this.handler=a;this.nav_container.addEventListener("click",function(a){this.nav(a.target);this.handler(a.target)}.bind(this),!1);console.groupEnd()};