/* [0] Constructeur -> définit le conteneur et le bouton d'ajout =========================================================*/ function inputPhoneMini(container, navContainer){ this.container = container; this.nav_container = navContainer; } /* [1] Attributs =========================================================*/ inputPhoneMini.prototype = { container: this.container, // Conteneur des mini fiches relation nav_container: this.nav_container, // Conteneur de la navigation entre les fiches selected: 0, // UID de la MINI fiche sélectionnée handler: null, // Fonction pour l'enregistrement et la synchronisation des données defaultData: { // Valeur par défaut firstname: '', lastname: '', username: '', sexe: [{status:true}, {status:false}], age: '', job: '.', loc: [{status:true}, {status:false}, {status:false}, {status:false}] } }; /* [2] Gestion de l'enregistrement des formulaires mini fiches relation =========================================================*/ inputPhoneMini.prototype.fieldsToStorage = function(){ console.log('MINI FICHE: FIELDS TO STORAGE'); // {1} Pour chaque formulaire de contact présent // var existingMiniFiches = $$('article.mini-relation-panel .mini-fiche-relation'); for( var i = 0 ; i < existingMiniFiches.length ; i++ ){ // {2} On initialise notre deflater pour récupérer les valeurs // var deflater = new FormDeflater(existingMiniFiches[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(); console.log(deflated); // {4} On récupère les données du LSI si elles existent // var existingData = lsi.get('mini-fiches', 'form'+deflated.uid.value); // Si n'existe pas, on initialise if( existingData === false ){ existingData.username = 'inconnu'; existingData.firstname = 'inconnu'; existingData.lastname = 'inconnu'; } // {5} On récupère et met en forme les valeurs du deflater // var obj = { uid: deflated.uid.value, firstname: existingData.firstname, lastname: existingData.lastname, username: existingData.username, sexe: deflated.sexe, // [0] Homme, [1] Femme age: deflated.age.value, job: deflated.job.value, loc: deflated.loc // [0] Choix 1 -> [3] Choix 4 }; /* (8) On vérifie la validité des données et on l'enregistre dans l'objet */ obj.valid = this.check(obj); /* (9) On enregistre les données dans le 'localStorage' */ lsi.set('mini-fiches', 'form'+obj.uid, obj); } }; /* [3] Gestion de l'ajout physique d'un nouveau contact =========================================================*/ /* * * @objectData Objet contenant les informations nécessaires à l'affichage * */ inputPhoneMini.prototype.add = function(objectData){ console.log('MINI FICHE: ADD'); // Si pas d'UID, on retourne une erreur if( objectData == null || objectData.uid == null ) return false; /* (0) Gestion du formattage des valeur */ objectData.firstname = (objectData.firstname != null) ? objectData.firstname : this.defaultData.firstname; objectData.lastname = (objectData.lastname != null) ? objectData.lastname : this.defaultData.lastname; objectData.username = (objectData.username != null) ? objectData.username : this.defaultData.username; objectData.age = (objectData.age != null) ? objectData.age : this.defaultData.age; objectData.sexe = (objectData.sexe != null) ? objectData.sexe : this.defaultData.sexe; objectData.job = (objectData.job != null) ? objectData.job : this.defaultData.job; objectData.loc = (objectData.loc != null) ? objectData.loc : this.defaultData.loc; // {1} Création physique // this.container.innerHTML += miniFicheBuilder.build({ firstname: objectData.firstname, lastname: objectData.lastname, username: objectData.username, uid: objectData.uid, age: objectData.age, job: objectData.job }); /* (2) 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="job"]>option[value="'+objectData.job+'"]'); if( selectedOption != null ) selectedOption.setAttribute('selected', 'selected'); /* (3) 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'); /* (4) 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' =========================================================*/ inputPhoneMini.prototype.storageToFields = function(){ console.log('MINI FICHE: STORAGE TO FIELDS'); // {1} Pour chaque contact du 'localStorage' // var miniData = lsi.export('mini-fiches'); // On réinitialise le HTML this.container.innerHTML = ''; // {2} On affiche la MINI fiche sélectionnée // this.add(miniData['form'+this.selected]); // {3} On met à jour la navigation // this.updateNavBar(); }; /* [5] Synchronisation des CONTACT vers les MINI fiches =========================================================*/ inputPhoneMini.prototype.sync = function(){ console.log('MINI FICHE: 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; miniData.firstname = contactData[key].firstname; miniData.lastname = contactData[key].lastname; miniData.username = contactData[key].username; /* (6) On enregistre les modification */ lsi.set('mini-fiches', key, miniData); } }; /* [6] Gestion de la navigation entre les fiches =========================================================*/ inputPhoneMini.prototype.nav = function(element){ /* (1) On vérifie que l'élément contient un nombre et existe */ if( typeof element == 'undefined' ) return false; if( isNaN(element.innerHTML) ) 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.innerHTML) - 1; }; /* [7] Mise à jour de la navigation =========================================================*/ inputPhoneMini.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 = this.nav_container.children.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 += ''; } /* (3) On montre les MINI fiches qui sont correctes dans la navbar */ for( var key in miniData ){ var currentElement = this.nav_container.children[ miniData[key].uid ]; // On remplit avec le numéro de la MINI fiche 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( this.nav_container.children[this.selected] ); }; /* [8] Vérification des données du formulaire =========================================================*/ inputPhoneMini.prototype.check = function(miniData){ // 1. L'age est un nombre if( isNaN(parseInt(miniData.age)) ) return false; // 2. Le sexe est défini if( !checkRadioValue(miniData.sexe) ) return false; // 3. Le métier est défini if( miniData.job == '.' ) return false; // 4. La distance de localisation est définie if( !checkRadioValue(miniData.loc) ) return false; // Si aucune erreur, tout est ok return true; }; /* [9] Point d'amorçage de la gestion des contacts =========================================================*/ inputPhoneMini.prototype.attach = function(handler){ console.log('MINI FICHE: ATTACH'); /* (1) On initialise le jeu de données */ lsi.createDataset('mini-fiches'); /* (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; var ptr = this; /* (2) On attache l'évènement sur le bouton d'ajout de contact */ var ptr = this; this.nav_container.addEventListener('click', function(e){ // 1. On gère la navigation ptr.nav(e.target); // 2. On gere le chargement dynamique ptr.handler(e.target); }, false); };