/* [0] Constructeur -> définit le conteneur et le bouton d'ajout =========================================================*/ function inputPhoneMatrice(container){ this.container = container; } /* [1] Attributs =========================================================*/ inputPhoneMatrice.prototype = { container: this.container // Conteneur de la matrice }; /* [2] Gestion de l'enregistrement de la matrice =========================================================*/ inputPhoneMatrice.prototype.fieldsToStorage = function(){ console.log('MATRICE: FIELDS TO STORAGE'); // {1} On initialise notre deflater pour récupérer les valeurs // var deflater = new FormDeflater(this.container, ['input'], ['data-name']); // {2} On extrait les données // var deflated = deflater.deflate(); // On crée le hash var deflatedHash = crc32(JSON.stringify(deflated)); console.log(deflated); /* (3) On crée l'objet et on le remplit avec les relations */ var obj = {}; for( var i in deflated ) // {1} Si c'est un tableau de sujets // if( deflated[i] instanceof Array ){ // Pour chacune des différentes relations, on ajoute si TRUE for( var a in deflated[i] ) if( deflated[i][a].status === true ){ if( obj[i] == null ) obj[i] = []; obj[i].push( parseInt(deflated[i][a].value) ); } // {2} Si il n'y a qu'un sujet // }else if( deflated[i].status === true ){ if( obj[i] == null ) obj[i] = []; obj[i].push( parseInt(deflated[i].value) ); } lsi.set( 'matrice', 0, obj ); // Objet de la forme // // idA: [idV, idW], # A connait V et W (et réciproquement) // idB: [idX, idY], # B connait X et Y (et réciproquement) // ... // }; /* [3] Gestion de l'ajout physique d'un nouveau contact =========================================================*/ /* * * @objectData Objet contenant les informations nécessaires à l'affichage * */ inputPhoneMatrice.prototype.add = function(objectData){ console.log('MATRICE: ADD'); // Si pas d'UID, on retourne une erreur if( objectData == null || objectData.uid == null ) return false; /* (0) Gestion du formattage des valeur */ objectData.age = (objectData.age != null) ? objectData.age : this.defaultData.age; objectData.sexe = (objectData.sexe != null) ? objectData.sexe : this.defaultData.sexe; objectData.studies = (objectData.studies != null) ? objectData.studies : this.defaultData.studies; objectData.reltype = (objectData.reltype != null) ? objectData.reltype : this.defaultData.reltype; objectData.reltypeSpecial = (objectData.reltypeSpecial != null) ? objectData.reltypeSpecial : this.defaultData.reltypeSpecial; objectData.loc = (objectData.loc != null) ? objectData.loc : this.defaultData.loc; // {1} On récupère username/firstname/lastname du contact associé // var associatedContact = lsi.get('contacts', objectData.uid); // Si on ne trouve pas le contact, on ne fais rien if( associatedContact === false ) return false; // {2} Création physique // this.container.innerHTML += miniFicheBuilder.build({ firstname: associatedContact.firstname, lastname: associatedContact.lastname, username: (associatedContact.username.length==0) ? '' : '('+associatedContact.username+')', countcall: associatedContact.countcall, countsms: associatedContact.countsms, uid: objectData.uid, reltypespecial: objectData.reltypeSpecial }); /* {3} On sélectionne la valeur dans le select (manuellement) de la PROFESSION */ var selectedOption = $('article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+objectData.studies+'"]'); if( selectedOption != null ) selectedOption.setAttribute('selected', 'selected'); /* {4} On sélectionne la valeur dans le select (manuellement) de l'AGE */ selectedOption = $('article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+objectData.age+'"]'); if( selectedOption != null ) selectedOption.setAttribute('selected', 'selected'); /* {5} On sélectionna la valeur des boutons pour le SEXE */ var sexeCreated = $$('article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'); for( var i = 0 ; i < sexeCreated.length && i < objectData.sexe.length ; i++ ) if( objectData.sexe[i].status ) sexeCreated[i].setAttribute('checked', 'checked'); else sexeCreated[i].removeAttribute('checked'); /* {6} On sélectionna la valeur des boutons pour le TYPE DE RELATION */ var reltypeCreated = $$('article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]'); for( var i = 0 ; i < reltypeCreated.length && i < objectData.reltype.length ; i++ ) if( objectData.reltype[i].status ) reltypeCreated[i].setAttribute('checked', 'checked'); else reltypeCreated[i].removeAttribute('checked'); /* {7} On sélectionna la valeur des boutons pour la LOCATION */ var locCreated = $$('article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="loc"]'); for( var i = 0 ; i < locCreated.length && i < objectData.loc.length ; i++ ) if( objectData.loc[i].status ) locCreated[i].setAttribute('checked', 'checked'); else locCreated[i].removeAttribute('checked'); }; /* [4] Gestion de l'affichage depuis le 'localStorage' =========================================================*/ inputPhoneMatrice.prototype.storageToFields = function(){ console.log('MATRICE: STORAGE TO FIELDS'); // {1} Pour chaque contact du 'localStorage' // var miniData = lsi.get('mini-fiches', this.selected); // On réinitialise le HTML this.container.innerHTML = ''; // {2} On affiche la MINI fiche sélectionnée // this.add(miniData); // {3} On met à jour la navigation // this.updateNavBar(); }; /* [5] Synchronisation des CONTACT vers les MINI fiches =========================================================*/ inputPhoneMatrice.prototype.sync = function(){ console.log('MATRICE: SYNC'); /* (1) On récupère les clés de tous les CONTACTS */ var contactData = lsi.export('contacts'); /* (2) Pour chaque CONTACT, on met à jour/crée la MINI fiche associée */ for( var key in contactData ){ /* (3) On récupère les informations de la MINI (si elle existe) */ var miniData = lsi.get('mini-fiches', key); /* (4) Si la MINI fiche n'exise pas, on la crée avec les valeurs par défaut */ if( miniData == null ){ miniData = this.defaultData; miniData.valid = false; } /* (5) On met à jour la MINI fiche */ miniData.uid = contactData[key].uid; /* (6) On enregistre les modification */ lsi.set('mini-fiches', key, miniData); } }; /* [6] Gestion de la navigation entre les fiches =========================================================*/ inputPhoneMatrice.prototype.nav = function(element){ /* (1) On vérifie que l'élément contient un nombre et existe */ if( element == null ) return false; if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'nav-mini' ) return false; /* (2) On désactive tous les éléments actifs */ var activeElements = $$('#nav-mini > span.active'); for( var i = 0 ; i < activeElements.length ; i++ ) activeElements[i].remClass('active'); /* (3) On active l'élément courant */ element.addClass('active'); this.selected = parseInt(element.getData('n')); }; /* [7] Mise à jour de la navigation =========================================================*/ inputPhoneMatrice.prototype.updateNavBar = function(){ var miniData = lsi.export('mini-fiches'); var len = Object.keys(miniData).length; /* (1) On vérifie si la barre de navigation est à jour */ var navBarUpToDate = $$('#nav-mini [data-n]').length == len; /* (2) On vide et remplit la barre de nav, si elle n'est pas à jour */ if( !navBarUpToDate ){ this.nav_container.innerHTML = ''; for( var i = 0 ; i < len ; i++ ) this.nav_container.innerHTML += ''+(i+1)+''; } /* (3) On montre les MINI fiches qui sont correctes dans la navbar */ for( var key in miniData ){ var currentElement = $('#nav-mini [data-n="'+miniData[key].uid+'"]'); if( currentElement == null ) continue; // On remplit avec le numéro de la MINI fiche // currentElement.setAttribute('data-n', miniData[key].uid); // currentElement.innerHTML = miniData[key].uid + 1; // Si la MINI fiche est valide if( miniData[key].valid === true ) currentElement.addClass('done'); // Si elle est invalide else currentElement.remClass('done'); } /* (4) On séléctionne par défaut la dernière MINI fiche sélectionnée */ this.nav( $('#nav-mini [data-n="'+this.selected+'"]') ); }; /* [8] Vérification des données du formulaire =========================================================*/ inputPhoneMatrice.prototype.check = function(miniData){ // 1. Le sexe est défini if( !checkRadioValue(miniData.sexe) ) return false; // 2. Le métier est défini if( miniData.studies == '.' ) return false; // 3. L'age est définie if( miniData.age == '.' ) return false; // 4. La distance de localisation est définie if( !checkRadioValue(miniData.loc) ) return false; // 5. Le TYPE DE RELATION a un et un seul choix if( !checkRadioValue(miniData.reltype) ) return false; // 6. TYPE DE RELATION si autre est coché (indice 8), reltypeSpecial doit avoir au moins 2 caractère if( miniData.reltype[8].status && miniData.reltypeSpecial.length < 2 ) return false; // Si aucune erreur, tout est ok return true; }; /* [9] Point d'amorçage de la gestion des contacts =========================================================*/ inputPhoneMatrice.prototype.attach = function(handler){ console.log('MATRICE: ATTACH'); /* (1) On initialise le jeu de données */ lsi.createDataset('matrice'); /* (2) On charge les mini fiches depuis la mémoire ('localStorage') */ this.storageToFields(); /* (3) On attache la barre de navigation à une fonction */ // On enregistre le handler this.handler = handler; };