/* [0] Constructeur -> définit le conteneur et le bouton d'ajout =========================================================*/ function inputPhoneFiche(container, navContainer){ this.container = container; this.nav_container = navContainer; this.top_size = 10; } /* [1] Attributs =========================================================*/ inputPhoneFiche.prototype = { container: this.container, // Conteneur des fiche fiches relation nav_container: this.nav_container, // Conteneur de la navigation entre les fiches selected: 0, // UID de la FICHE sélectionnée handler: null, // Fonction pour l'enregistrement et la synchronisation des données defaultData: { // Valeurs par défaut sexe: '2', age: '.', job: '.', famsit: '0', // Choix 1 à 3 studies: '0', reltype: '0', // Choix 1 à 9 reltypeSpecial: '', city: '', quartier: '', cp: '', loc: '0', duration: ['', ''], context: '0', // Choix 1 à 14 contextSpecial: ['', '', ''], freq: ['4', '9', '14', '19', '24'], // 1er choix des 4 pour chaque question connect: ['1', '3', '5', '7', '9', '11'], // Le deuxième choix (Oui/Non) donc 'Non' par défaut pour chaque question connectSpecial: ['', ''], timestamp: 0, valid: false } }; /* [2] Gestion de l'enregistrement des formulaires fiche fiches relation =========================================================*/ inputPhoneFiche.prototype.fieldsToStorage = function(){ console.group('[phone.fiche] fields to storage'); // {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++ ){ // {2} On initialise notre deflater pour récupérer les valeurs // var 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)); // 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 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 = { contact: parseInt(deflated.contact), uid: parseInt(deflated.uid), sexe: deflated.sexe, age: deflated.age, job: deflated.job, famsit: deflated.famsit, studies: deflated.studies, reltype: deflated.reltype, reltypeSpecial: deflated.reltypeSpecial, city: deflated.city, quartier: deflated.quartier, cp: deflated.cp, loc: deflated.loc, duration: deflated.duration, context: deflated.context, contextSpecial: deflated.contextSpecial, freq: deflated.freq, connect: deflated.connect, connectSpecial: deflated.connectSpecial, hash: deflatedHash }; /* (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); // 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 ){ // 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); lsi.set('p_fiches', obj.uid, obj); } console.groupEnd(); }; /* [3] Gestion de l'ajout physique d'une nouvelle fiche =========================================================*/ /* * * @objectData Objet contenant les informations nécessaires à l'affichage * */ inputPhoneFiche.prototype.add = function(objectData){ // console.log('FICHE: ADD'); // Si pas d'UID ou d'UID de contact, on retourne une erreur if( objectData.uid == null || isNaN(objectData.uid) || objectData.contact == null || isNaN(objectData.contact) ) return false; /* (0) Gestion du formattage des valeur */ // {1} Champs de texte // objectData.city = (objectData.city != null) ? objectData.city : this.defaultData.city; objectData.quartier = (objectData.quartier != null) ? objectData.quartier : this.defaultData.quartier; objectData.cp = (objectData.cp != null) ? objectData.cp : this.defaultData.cp; objectData.duration[0] = (objectData.duration[0] != null) ? objectData.duration[0] : this.defaultData.duration[0]; objectData.duration[1] = (objectData.duration[1] != null) ? objectData.duration[1] : this.defaultData.duration[1]; objectData.reltypeSpecial = (objectData.reltypeSpecial != null) ? objectData.reltypeSpecial : this.defaultData.reltypeSpecial; objectData.contextSpecial[0] = (objectData.contextSpecial[0] != null) ? objectData.contextSpecial[0] : this.defaultData.contextSpecial[0]; objectData.contextSpecial[1] = (objectData.contextSpecial[1] != null) ? objectData.contextSpecial[1] : this.defaultData.contextSpecial[1]; objectData.contextSpecial[2] = (objectData.contextSpecial[2] != null) ? objectData.contextSpecial[2] : this.defaultData.contextSpecial[2]; objectData.connectSpecial[0] = (objectData.connectSpecial[0] != null) ? objectData.connectSpecial[0] : this.defaultData.connectSpecial[0]; objectData.connectSpecial[1] = (objectData.connectSpecial[1] != null) ? objectData.connectSpecial[1] : this.defaultData.connectSpecial[1]; // {2} Champs // // 1. La ville a au moins 2 caractères if( ficheData.city.length < 2 ) return false; // 3. La durée de la relation en mois est vide ou un nombre if( isNaN(parseInt(ficheData.duration[0])) && ficheData.duration[0].length > 0 ) return false; // 4. La durée de la relation en année est vide ou un nombre if( isNaN(parseInt(ficheData.duration[1])) && ficheData.duration[1].length > 0 ) return false; // 5. Pour la durée de la relation, au moins un des 2 n'est pas vide if( ficheData.duration[0].length+ficheData.duration[1].length == 0 ) return false; // {2} Vérification des pour la profession n'est pas indéfini if( ficheData.job == '.' ) return false; // 7. Le pour l'AGE n'est pas indéfini if( ficheData.age == '.' ) return false; // {3} Vérification des radio // // 9. Le SEXE a un et un seul choix if( ficheData.sexe == '' ) return false; // 10. La SITUATION FAMILIALE a un et un seul choix if( ficheData.famsit == '' ) return false; // 11. Le TYPE DE RELATION a un et un seul choix if( ficheData.reltype == '' ) return false; // 12. La DISTANCE DE DOMICILE (location) a un et un seul choix if( ficheData.loc == '' ) return false; // 13. Le CONTEXTE DE RENCONTRE a un et un seul choix if( ficheData.context == '' ) return false; // 14. Les FRÉQUENCES ont un et un seul choix (par question de fréquence) for( var i = 0 ; i < ficheData.freq.length ; i++ ) if( ficheData.freq[i] == '' ) return false; // 15. Les CONNECTION ont un et un seul choix (par question de connection) for( var i = 0 ; i < ficheData.connect.length ; i++ ) if( ficheData.connect[i] == '' ) return false; // {4} dépendant d'un choix d'un radio // // 16. TYPE DE RELATION si autre est coché (indice 8), reltypeSpecial doit avoir au moins 2 caractère if( ficheData.reltype == '10' && ficheData.reltypeSpecial.length < 2 ) return false; // 17. CONTEXTE DE RELATION si est coché indice 11, contactSpecial[0] doit avoir au moins 2 caractères if( ficheData.context == '11' && ficheData.contextSpecial[0].length < 2 ) return false; // 18. CONTEXTE DE RELATION si est coché indice 12, contextSpecial[1] doit avoir au moins 2 caractères if( ficheData.context == '12' && ficheData.contextSpecial[1].length < 2 ) return false; // 19. CONTEXTE DE RELATION si est coché indice 13, contextSpecial[2] doit avoir au moins 2 caractères if( ficheData.context == '13' && ficheData.contextSpecial[2].length < 2 ) return false; // 20. Si tout s'est bien passé, on retourne TRUE return true; }; /* [9] Point d'amorçage de la gestion des contacts =========================================================*/ inputPhoneFiche.prototype.attach = function(handler){ console.group('[phone.fiche] attaching events'); /* (1) On initialise le jeu de données */ lsi.createDataset('p_fiches'); /* (2) On charge les fiche fiches depuis la mémoire ('localStorage') */ this.storageToFields(); /* (3) On attache la barre de navigation à une fonction */ // On enregistre le handler this.handler = handler; /* (2) On attache l'évènement sur le bouton d'ajout de contact */ this.nav_container.addEventListener('click', function(e){ // 1. On gère la navigation this.nav(e.target); // 2. On gere le chargement dynamique this.handler(e.target); }.bind(this), false); console.groupEnd(); };