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

424 lines
14 KiB
JavaScript

/* [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 MINI 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
sexe: '0',
age: '.',
studies: '.',
loc: '0',
reltype: '0',
reltypeSpecial: '',
timestamp: 0,
valid: 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 MINI fiche à l'écran //
var existingMiniFiches = $$('[data-sublink="phone"] 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();
// 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_mini-fiches', deflated.uid);
// Si n'existe pas, on passe à la suivante
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 && existingData.hash == deflatedHash )
return;
console.warn('> MINI UPDATE');
var obj = {
uid: parseInt(deflated.uid),
sexe: deflated.sexe, // [0] Homme, [1] Femme
age: deflated.age,
studies: deflated.studies,
reltype: deflated.reltype, // [0] ...
reltypeSpecial: deflated.reltypeSpecial,
loc: deflated.loc, // [0] Choix 1 -> [3] Choix 4
hash: deflatedHash
};
/* (8) 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
if( diff(existingData, obj, ['hash', 'valid', 'timestamp']).length > 0 ){
console.log( diff(existingData, obj, ['hash', 'valid', 'timestamp']) );
console.warn('> FICHE UPDATE');
obj.timestamp = Date.now();
}
/* (9) On enregistre les données dans le 'localStorage' */
lsi.set('p_mini-fiches', obj.uid, obj);
}
};
/* [3] Gestion de l'ajout physique d'un nouveau contact
=========================================================*/
/*
*
* @objectData<Object> 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.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('p_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 += pMiniFicheBuilder.build({
name: readableName(associatedContact.username, associatedContact.firstname, associatedContact.lastname),
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 = $('[data-sublink="phone"] 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 = $('[data-sublink="phone"] 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 <radio> pour le SEXE */
var sexeCreated = $$('[data-sublink="phone"] 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++ )
if( sexeCreated[i].value == objectData.sexe ) sexeCreated[i].setAttribute('checked', 'checked');
else sexeCreated[i].removeAttribute('checked');
/* {6} On sélectionna la valeur des boutons <radio> pour le TYPE DE RELATION */
var reltypeCreated = $$('[data-sublink="phone"] 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++ )
if( reltypeCreated[i].value == objectData.reltype ) reltypeCreated[i].setAttribute('checked', 'checked');
else reltypeCreated[i].removeAttribute('checked');
/* {7} On sélectionna la valeur des boutons <radio> pour la LOCATION */
var locCreated = $$('[data-sublink="phone"] 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++ )
if( locCreated[i].value == objectData.loc ) 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.get('p_mini-fiches', this.selected);
// Si on a rien trouvé, on ne fait rien
if( miniData == null ){
this.updateNavBar();
return false;
}
// 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
=========================================================*/
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('p_contacts');
/* (2) On enregistre les contacts qui sont déja dans les FICHES */
var fiches = lsi.export('p_fiches');
var ignoredContacts = [];
for( var id in fiches )
if( ignoredContacts.indexOf( fiches[id].contact ) == -1 )
ignoredContacts.push( fiches[id].contact );
/* (3) Pour chaque CONTACT, on met à jour/crée la MINI fiche associée */
for( var key in contactData ){
/* (4) Si le contact est déja dans une fiche, on le retire */
if( ignoredContacts.indexOf(parseInt(key)) > -1 ){
// On supprime au cas ou
lsi.del('p_mini-fiches', key);
continue;
}
/* (5) Si le contact n'a aucun nominatif, on met inconnu par défaut, mais on ne l'affiche pas */
var noName = contactData[key].username.length+contactData[key].firstname.length+contactData[key].lastname.length == 0;
// On rajoute un '.' après pour dire qu'on affichera pas
var uid = noName ? key.toString()+'-' : key;
/* (5) On récupère les informations de la MINI (si elle existe) */
var miniData = lsi.get('p_mini-fiches', uid);
/* (6) 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;
// Si aucun nom, on met 'inconnu' par défaut pour la fiche de relation
if( isNaN(uid) )
miniData.reltype = '9';
}
/* (7) On met à jour la MINI fiche */
miniData.uid = parseInt(key);
/* (8) On enregistre les modification */
lsi.set('p_mini-fiches', uid, miniData);
}
/* (9) On met à jour la mini-fiche en cours */
var miniData = lsi.export('p_mini-fiches');
// Si la clé n'existe plus
if( miniData[this.selected] == null ){
// On cherche la première clé numérique
for( var key in miniData )
if( !isNaN(key) ){ // La première qu'on trouve, on la définit
this.selected = parseInt(key);
break;
}
}
};
/* [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( element == null )
return false;
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'p_nav-mini' )
return false;
/* (2) On désactive tous les éléments actifs */
var activeElements = $$('[data-sublink="phone"] #p_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
=========================================================*/
inputPhoneMini.prototype.updateNavBar = function(){
var miniData = lsi.export('p_mini-fiches');
/* (1) On vide et remplit la barre de nav, si elle n'est pas à jour */
this.nav_container.innerHTML = '';
var i = 0;
for( var key in miniData )
if( !isNaN(key) ) // On affiche que les clés numériques
this.nav_container.innerHTML += '<span data-n="'+key+'">'+(++i)+'</span>';
/* (2) On montre les MINI fiches qui sont correctes dans la navbar */
for( var key in miniData ){
// Si la clé n'est pas numérique, on ne gère pas
if( isNaN(key) )
continue;
var currentElement = $('[data-sublink="phone"] #p_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');
}
/* (3) On séléctionne par défaut la dernière MINI fiche sélectionnée */
this.nav( $('[data-sublink="phone"] #p_nav-mini [data-n="'+this.selected+'"]') );
};
/* [8] Vérification des données du formulaire
=========================================================*/
inputPhoneMini.prototype.check = function(miniData){
// 1. Le sexe est défini
if( 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( miniData.loc == '' )
return false;
// 5. Le TYPE DE RELATION a un et un seul choix
if( miniData.reltype == '' )
return false;
// 6. TYPE DE RELATION si autre est coché (indice 10), reltypeSpecial doit avoir au moins 2 caractère
if( miniData.reltype == '10' && miniData.reltypeSpecial.length < 2 )
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('p_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;
/* (2) 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);
};