/* [0] Constructeur -> définit le conteneur et le bouton d'ajout =========================================================*/ function inputPhoneFiche(container, navContainer){ this.container = container; this.nav_container = navContainer; } /* [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 }; /* [2] Gestion de l'enregistrement des formulaires fiche fiches relation =========================================================*/ inputPhoneFiche.prototype.fieldsToStorage = function(){ console.log('MINI FICHE: FIELDS TO STORAGE'); // {1} Pour chaque formulaire de contact présent // var existingMiniFiches = $$('article.fiche-relation-panel .fiche-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(); // {4} On récupère les données du LSI si elles existent // var existingData = lsi.get('fiche-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].status, // VRAI SI HOMME deflated.sexe[1].status // VRAI SI FEMME ], age: deflated.age.value, job: deflated.job.value, loc: [ deflated.loc[0].status, // VRAI si choix 1 deflated.loc[1].status, // VRAI si choix 2 deflated.loc[2].status, // VRAI si choix 3 deflated.loc[3].status // VRAI si choix 4 ] }; // {6} On enregistre les données dans le 'localStorage' // lsi.set('fiche-fiches', 'form'+obj.uid, obj); } // {7} On met à jour le rendu // // this.storageToFields(); }; /* [3] Gestion de l'ajout physique d'un nouveau contact =========================================================*/ /* * * @objectData Objet contenant les informations nécessaires à l'affichage * */ inputPhoneFiche.prototype.add = function(objectData){ console.log('MINI FICHE: ADD'); // Si pas d'UID, on retourne une erreur if( objectData.uid == null ) return false; /* (0) Gestion du formattage des valeur */ objectData.firstname = (objectData.firstname != null) ? objectData.firstname : ''; objectData.lastname = (objectData.lastname != null) ? objectData.lastname : ''; objectData.username = (objectData.username != null) ? objectData.username : ''; objectData.age = (objectData.age != null) ? objectData.age : ''; objectData.sexe = (objectData.sexe != null) ? objectData.sexe : [true, false]; objectData.job = (objectData.job != null) ? objectData.job : '.'; objectData.loc = (objectData.loc != null) ? objectData.loc : [true, false, false, false]; // {1} Création physique // this.container.innerHTML += ficheFicheBuilder.build({ firstname: objectData.firstname, lastname: objectData.lastname, username: objectData.username, uid: objectData.uid, age: objectData.age // sexe: objectData.sexe[0] ? 'true' : 'false', // job: objectData.job, // loca: objectData.loc[0] ? 'true' : 'false', // locb: objectData.loc[1] ? 'true' : 'false', // locc: objectData.loc[2] ? 'true' : 'false', // locd: objectData.loc[3] ? 'true' : 'false' }); /* (2) On sélectionne la valeur dans le select (manuellement) */ var createdSelect = $('[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select'); createdSelect.value = objectData.job; /* (3) On sélectionna la valeur des boutons pour le SEXE */ var sexeCreated = $$('[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'); for( var i = 0 ; i < sexeCreated.length ; i++ ) if( objectData.sexe[i] ) sexeCreated[i].setAttribute('checked', 'checked'); else sexeCreated[i].removeAttribute('checked'); /* (4) On sélectionna la valeur des boutons pour la LOCATION */ var locCreated = $$('[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="loc"]'); for( var i = 0 ; i < locCreated.length ; i++ ) if( objectData.loc[i] ) locCreated[i].setAttribute('checked', 'checked'); else locCreated[i].removeAttribute('checked'); }; /* [4] Gestion de l'affichage depuis le 'localStorage' =========================================================*/ inputPhoneFiche.prototype.storageToFields = function(){ console.log('MINI FICHE: STORAGE TO FIELDS'); // {1} Pour chaque contact du 'localStorage' // var existingMiniFiches = lsi.keys('fiche-fiches'); // On réinitialise le HTML this.container.innerHTML = ''; // On récupère les UIDS var UIDs = []; for( var i = 0 ; i < existingMiniFiches.length ; i++ ){ // {2} On récupère les informations du contact // var ficheData = lsi.get('fiche-fiches', existingMiniFiches[i]); // {3} On ajoute un contact à la liste // this.add({ uid: ficheData.uid, firstname: ficheData.firstname, lastname: ficheData.lastname, username: ficheData.username, age: ficheData.age, sexe: ficheData.sexe, job: ficheData.job, loc: ficheData.loc }); UIDs.push(ficheData.uid); } // {4} On met à jour la navigation // this.updateNavBar(UIDs); }; /* [5] Synchronisation des CONTACT vers les MINI fiches =========================================================*/ inputPhoneFiche.prototype.sync = function(){ console.log('MINI FICHE: SYNC'); /* (1) On récupère les clés de tous les CONTACTS */ var contactUIDs = lsi.keys('contacts'); /* (2) Pour chaque CONTACT, on met à jour/crée la MINI fiche associée */ for( var i = 0 ; i < contactUIDs.length ; i++ ){ /* (3) On récupère les informations du CONTACT */ var contactData = lsi.get('contacts', contactUIDs[i]); /* (4) On récupère les informations de la MINI (si elle existe) */ var ficheData = lsi.get('fiche-fiches', contactUIDs[i]); /* (5) Cas 1 : la MINI fiche n'exise pas */ if( ficheData == null ){ // On crée la MINI fiche lsi.set('fiche-fiches', contactUIDs[i], { uid: contactData.uid, firstname: contactData.firstname, lastname: contactData.lastname, username: contactData.username, sexe: [true, false], // valeur par défaut age: '', // valeur par défaut job: '.', // valeur par défaut loc: [true, false, false, false] // valeur par défaut }); /* (6) Cas 2 : la MINI fiche existe déja */ }else{ // On modifie la MINI fiche ficheData.firstname = contactData.firstname; ficheData.lastname = contactData.lastname; ficheData.username = contactData.username; // On met à jour la MINI fiche lsi.set('fiche-fiches', contactUIDs[i], ficheData); } } }; /* [6] Gestion de la navigation entre les fiches =========================================================*/ inputPhoneFiche.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-fiche > 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; /* (4) On récupère toutes les MINI fiches visibles */ var visible = $$('article.fiche-relation-panel .fiche-fiche-relation.active'); for( var i = 0 ; i < visible.length ; i++ ) visible[i].remClass('active'); /* (5) On affiche la MINI fiche associée */ this.container.children[this.selected].addClass('active'); }; /* [7] Mise à jour de la navigation =========================================================*/ inputPhoneFiche.prototype.updateNavBar = function(uid_list){ /* (1) On vide la nav bar */ this.nav_container.innerHTML = ''; /* (2) On la re-remplit avec toutes les données */ for( var i = 0 ; i < uid_list.length ; i++ ){ // On rajoute 1 pour la lisibilité var realIndex = parseInt(uid_list[i]) + 1; this.nav_container.innerHTML += ''+realIndex+''; } /* (3) On montre les MINI fiches qui sont correctes */ this.check(); /* (4) On séléctionne par défaut le dernier sélectionné */ this.nav( this.nav_container.children[this.selected] ); }; /* [8] Vérification des données du formulaire =========================================================*/ inputPhoneFiche.prototype.check = function(){ /* (1) On parcours toutes les fiches */ var ficheKeys = lsi.keys('fiche-fiches'); for( var i = 0 ; i < ficheKeys.length ; i++ ){ var ficheData = lsi.get('fiche-fiches', ficheKeys[i]); /* (2) On vérifie le formulaire complet */ var validForm = true; // 1. L'age est un nombre // 2. Le métier est défini validForm = validForm && !isNaN(parseInt(ficheData.age)); validForm = validForm && ficheData.job != '.'; /* (3) Si le formulaire est valide, on le met en valeur dans la barre de navigation (pages) */ if( validForm ) this.nav_container.children[ficheData.uid].addClass('done'); else // sinon, on lui enlève la classe s'il l'a this.nav_container.children[ficheData.uid].remClass('done'); } }; /* [9] Point d'amorçage de la gestion des contacts =========================================================*/ inputPhoneFiche.prototype.attach = function(handler){ console.log('MINI FICHE: ATTACH'); /* (1) On initialise le jeu de données */ lsi.createDataset('fiche-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; 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(); }, false); };