NxTIC/js/includes/input-phone-contact.js

224 lines
7.2 KiB
JavaScript
Raw Normal View History

/* [0] Constructeur -> définit le conteneur et le bouton d'ajout
=========================================================*/
2016-04-29 13:24:03 +00:00
function inputPhoneContact(container, navContainer){
this.container = container;
this.nav_container = navContainer;
}
/* [1] Attributs
=========================================================*/
inputPhoneContact.prototype = {
2016-04-29 13:24:03 +00:00
container: this.container, // Conteneur des formulaires de contact
nav_container: this.nav_container, // Conteneur de la navigation entre les formulaires
selected: 1, // UID du permier des contacts sélectionnés (10 par 10)
handler: null // Fonction pour l'enregistrement et la synchronisation des données
};
/* [2] Gestion de l'enregistrement des formulaires de contact
=========================================================*/
inputPhoneContact.prototype.fieldsToStorage = function(){
console.log('CONTACTS: FIELDS TO STORAGE');
// {1} Pour chaque formulaire de contact présent //
var existingContacts = $$('article.contact-panel .new-contact');
for( var i = 0 ; i < existingContacts.length ; i++ ){
// {2} On récupère les informations relatives à l'élément courant //
var indexInParent = existingContacts[i].parentNode.children.indexOf(existingContacts[i]);
// {3} On initialise notre deflater pour récupérer les valeurs //
var deflater = new FormDeflater(existingContacts[i], ['input'], ['data-name']);
// {4} On enregistre ce contact si le numéro n'est pas vide et soit pseudo/prénom/nom //
var deflated = deflater.deflate();
// Le numéro n'est pas vide
var validForm = deflated.number.value.length > 0;
// ET le pseudo et/ou le prénom et/ou le nom n'est pas vide
validForm = validForm && deflated.username.value.length+deflated.firstname.value.length+deflated.lastname.value.length > 0;
// Si le formulaire n'est pas valide, on ne l'enregistre pas
if( !validForm ) continue;
// {5} On récupère et met en forme les valeurs du deflater //
var obj = {
uid: indexInParent,
number: deflated.number.value,
username: deflated.username.value,
firstname: deflated.firstname.value,
lastname: deflated.lastname.value
};
/* (6) On calcule et ajoute le hash des données */
obj.hash = crc32( JSON.stringify(obj) );
// {7} On enregistre les données dans le 'localStorage' //
lsi.set('contacts', indexInParent, obj);
}
// {7} On met à jour le rendu des contacts//
// this.storageToFields();
};
/* [3] Gestion de l'ajout physique d'un nouveau contact
=========================================================*/
/*
*
* @objectData<Object> Objet contenant les informations nécessaires à l'affichage
*
*/
inputPhoneContact.prototype.add = function(objectData){
console.log('CONTACTS: ADD');
// {0} On formatte l'object //
objectData.number = (objectData.number != null) ? objectData.number : '';
objectData.username = (objectData.username != null) ? objectData.username : '';
objectData.firstname = (objectData.firstname != null) ? objectData.firstname : '';
objectData.lastname = (objectData.lastname != null) ? objectData.lastname : '';
// {1} On ajoute le HTML //
this.container.innerHTML += contactBuilder.build(objectData);
// {2} On attache les évènements sur les formulaires //
var contactForms = $$('article.contact-panel .new-contact');
// On met à jour les listener (remove, puis add)
var ptr = this;
for( var i = 0 ; i < contactForms.length ; i++ ){
2016-04-29 13:24:03 +00:00
contactForms[i].removeEventListener('click', function(e){ ptr.nav(e.target); ptr.handler(e.target); }, false);
contactForms[i].addEventListener('click', function(e){ ptr.nav(e.target); ptr.handler(e.target); }, false);
}
};
/* [4] Gestion de l'affichage depuis le 'localStorage'
=========================================================*/
inputPhoneContact.prototype.storageToFields = function(){
console.log('CONTACTS: STORAGE TO FIELDS');
// {1} Pour chaque contact du 'localStorage' //
2016-04-29 13:24:03 +00:00
var contactKeys = lsi.keys('contacts');
// On réinitialise le HTML
this.container.innerHTML = '';
2016-04-29 13:24:03 +00:00
// {2} On ajoute chaque contact (parmi les séléctionnés) à la liste //
var min = 10*(this.selected-1); // On affiche du contact sélectionné
var max = 10*(this.selected-1)+10; // On s'arrête à 10 contacs
for( var i = min ; i < max && i < contactKeys.length ; i++ )
this.add( lsi.get('contacts', contactKeys[i]) );
2016-04-29 13:24:03 +00:00
// On ajoute un champ de plus à remplir si c'est la dernière page
if( max >= contactKeys.length )
this.add({number:'', firstname:'', lastname:'', username:''});
2016-04-29 13:24:03 +00:00
/* (3) On met à jour la barre de navigation */
this.updateNavBar();
};
/* [6] Gestion de la navigation entre les formulaires (10 par 10)
=========================================================*/
inputPhoneContact.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) || element.parentNode.id != 'nav-contact' )
return false;
/* (2) On désactive tous les éléments actifs */
var activeElements = $$('#nav-contact > 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);
};
/* [7] Mise à jour de la navigation
=========================================================*/
inputPhoneContact.prototype.updateNavBar = function(){
var contactKeys = lsi.keys('contacts');
var len = contactKeys.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+=10 )
this.nav_container.innerHTML += '<span>'+ (1+i/10) +'</span>';
}
/* (4) On séléctionne par défaut la dernière MINI fiche sélectionnée */
this.nav( this.nav_container.children[this.selected-1] );
};
2016-04-29 13:24:03 +00:00
/* [5] Point d'amorçage de la gestion des contacts
=========================================================*/
inputPhoneContact.prototype.attach = function(handler){
console.log('CONTACTS: ATTACH');
/* (1) On initialise le jeu de données */
lsi.createDataset('contacts');
2016-04-29 13:24:03 +00:00
/* (2) On charge les contacts depuis la mémoire ('localStorage') */
this.storageToFields();
/* (3) On enregistre le handler */
this.handler = handler;
2016-04-29 13:24:03 +00:00
/* (4) On attache l'évènement sur le conteneur de navigation */
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);
};