2016-05-08 16:31:58 +00:00
|
|
|
/* [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');
|
|
|
|
|
|
|
|
|
2016-05-08 17:11:03 +00:00
|
|
|
// {1} On initialise notre deflater pour récupérer les valeurs //
|
|
|
|
var deflater = new FormDeflater(this.container, ['input'], ['data-name']);
|
2016-05-08 16:31:58 +00:00
|
|
|
|
2016-05-08 17:11:03 +00:00
|
|
|
// {2} On extrait les données //
|
|
|
|
var deflated = deflater.deflate();
|
|
|
|
// On crée le hash
|
|
|
|
var deflatedHash = crc32(JSON.stringify(deflated));
|
2016-05-08 16:31:58 +00:00
|
|
|
|
|
|
|
|
2016-05-08 17:11:03 +00:00
|
|
|
console.log(deflated);
|
2016-05-08 16:31:58 +00:00
|
|
|
|
2016-05-08 17:11:03 +00:00
|
|
|
/* (3) On crée l'objet et on le remplit avec les relations */
|
|
|
|
var obj = {};
|
2016-05-08 16:31:58 +00:00
|
|
|
|
2016-05-08 17:11:03 +00:00
|
|
|
for( var i in deflated )
|
2016-05-08 16:31:58 +00:00
|
|
|
|
2016-05-08 17:11:03 +00:00
|
|
|
// {1} Si c'est un tableau de sujets //
|
|
|
|
if( deflated[i] instanceof Array ){
|
2016-05-08 16:31:58 +00:00
|
|
|
|
2016-05-08 17:11:03 +00:00
|
|
|
// 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] = [];
|
2016-05-08 16:31:58 +00:00
|
|
|
|
2016-05-08 17:11:03 +00:00
|
|
|
obj[i].push( parseInt(deflated[i][a].value) );
|
|
|
|
}
|
2016-05-08 16:31:58 +00:00
|
|
|
|
2016-05-08 17:11:03 +00:00
|
|
|
// {2} Si il n'y a qu'un sujet //
|
|
|
|
}else if( deflated[i].status === true ){
|
|
|
|
if( obj[i] == null )
|
|
|
|
obj[i] = [];
|
2016-05-08 16:31:58 +00:00
|
|
|
|
2016-05-08 17:11:03 +00:00
|
|
|
obj[i].push( parseInt(deflated[i].value) );
|
2016-05-08 16:31:58 +00:00
|
|
|
}
|
|
|
|
|
2016-05-08 17:11:03 +00:00
|
|
|
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)
|
|
|
|
// ...
|
|
|
|
//
|
2016-05-08 16:31:58 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* [3] Gestion de l'ajout physique d'un nouveau contact
|
|
|
|
=========================================================*/
|
|
|
|
/*
|
|
|
|
*
|
|
|
|
* @objectData<Object> Objet contenant les informations nécessaires à l'affichage
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
inputPhoneMatrice.prototype.add = function(objectData){
|
2016-05-08 17:11:03 +00:00
|
|
|
console.log('MATRICE: ADD');
|
2016-05-08 16:31:58 +00:00
|
|
|
|
|
|
|
// 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 <radio> 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 <radio> 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 <radio> 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(){
|
2016-05-08 17:11:03 +00:00
|
|
|
console.log('MATRICE: STORAGE TO FIELDS');
|
2016-05-08 16:31:58 +00:00
|
|
|
|
|
|
|
// {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(){
|
2016-05-08 17:11:03 +00:00
|
|
|
console.log('MATRICE: SYNC');
|
2016-05-08 16:31:58 +00:00
|
|
|
|
|
|
|
/* (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 += '<span data-n="'+i+'">'+(i+1)+'</span>';
|
|
|
|
}
|
|
|
|
|
|
|
|
/* (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){
|
2016-05-08 17:11:03 +00:00
|
|
|
console.log('MATRICE: ATTACH');
|
2016-05-08 16:31:58 +00:00
|
|
|
|
|
|
|
/* (1) On initialise le jeu de données */
|
2016-05-08 17:11:03 +00:00
|
|
|
lsi.createDataset('matrice');
|
2016-05-08 16:31:58 +00:00
|
|
|
|
|
|
|
/* (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;
|
|
|
|
};
|