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

511 lines
20 KiB
JavaScript

/* [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
defaultData: { // Valeurs par défaut
firstname: '',
lastname: '',
username: '',
sexe: [ {status:true}, {status:false}],
age: '',
job: '.',
famsit: [ {status:true}, {status:false}, {status:false} ], // Choix 1 à 3
studies: '.',
reltype: [ {status:true}, {status:false}, {status:false}, {status:false}, {status:false},
{status:false}, {status:false}, {status:false}, {status:false}], // Choix 1 à 9
reltypeSpecial: '',
city: '',
loc: [ {status:true}, {status:false}, {status:false}, {status:false} ],
duration: ['', ''],
context: [ {status:true}, {status:false}, {status:false}, {status:false}, {status:false},
{status:false}, {status:false}, {status:false}, {status:false}, {status:false},
{status:false}, {status:false}, {status:false}, {status:false}], // Choix 1 à 14
contextSpecial: ['', '', ''],
freq: [
[ {status:true}, {status:false}, {status:false}, {status:false} ],
[ {status:true}, {status:false}, {status:false}, {status:false} ],
[ {status:true}, {status:false}, {status:false}, {status:false} ],
[ {status:true}, {status:false}, {status:false}, {status:false} ],
[ {status:true}, {status:false}, {status:false}, {status:false} ]],
connect: [
[ {status:true}, {status:false} ],
[ {status:true}, {status:false} ],
[ {status:true}, {status:false} ],
[ {status:true}, {status:false} ],
[ {status:true}, {status:false} ],
[ {status:true}, {status:false} ]],
connectSpecial: ['', '']
}
};
/* [2] Gestion de l'enregistrement des formulaires fiche fiches relation
=========================================================*/
inputPhoneFiche.prototype.fieldsToStorage = function(){
console.log('FICHE: FIELDS TO STORAGE');
// {1} Pour chaque formulaire de contact présent //
var existingFiches = $$('article.relation-panel .fiche-relation');
for( var i = 0 ; i < existingFiches.length ; i++ ){
// {2} On initialise notre deflater pour récupérer les valeurs //
var deflater = new FormDeflater(existingFiches[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('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, // Choix 1 à 2
age: deflated.age.value,
job: deflated.job.value,
famsit: deflated.famsit, // Choix 1 à 3
studies: deflated.studies.value,
reltype: deflated.reltype, // Choix 1 à 9
reltypeSpecial: deflated.reltypeSpecial.value,
city: deflated.city.value,
loc: deflated.loc, // Choix 1 à 3
duration: [
deflated.duration[0].value, // Durée de la relation en mois
deflated.duration[1].value // Durée de la relation en années
],
context: deflated.context, // Choix 1 à 14
contextSpecial: [
deflated.contextSpecial[0].value, // Valeur du contexte si context[11]
deflated.contextSpecial[1].value, // Valeur du contexte si context[12]
deflated.contextSpecial[2].value // Valeur du contexte si context[13]
],
freq: [
deflated.freq0, // Choix 1 à 4
deflated.freq1, // Choix 1 à 4
deflated.freq2, // Choix 1 à 4
deflated.freq3, // Choix 1 à 4
deflated.freq4 // Choix 1 à 4
],
connect: [
deflated.connect0, // Choix 1 à 2
deflated.connect1, // Choix 1 à 2
deflated.connect2, // Choix 1 à 2
deflated.connect3, // Choix 1 à 2
deflated.connect4, // Choix 1 à 2
deflated.connect5 // Choix 1 à 2
],
connectSpecial: [
deflated.connectSpecial[0].value,
deflated.connectSpecial[1].value
]
};
// {6} On enregistre les données dans le 'localStorage' //
lsi.set('fiches', 'form'+obj.uid, obj);
}
// {7} On met à jour le rendu //
// this.storageToFields();
};
/* [3] Gestion de l'ajout physique d'un nouveau contact
=========================================================*/
/*
*
* @objectData<Object> Objet contenant les informations nécessaires à l'affichage
*
*/
inputPhoneFiche.prototype.add = function(objectData){
console.log('FICHE: ADD');
// Si pas d'UID, on retourne une erreur
if( objectData.uid == null )
return false;
/* (0) Gestion du formattage des valeur */
// {1} Champs de texte //
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.city = (objectData.city != null) ? objectData.city : this.defaultData.city;
objectData.duration[0] = (objectData.duration[0] != null) ? objectData.duration[0] : this.defaultData.duration[0];
objectData.duration[1] = (objectData.duration[1] != null) ? objectData.duration[1] : this.defaultData.duration[1];
objectData.reltypeSpecial = (objectData.reltypeSpecial != null) ? objectData.reltypeSpecial : this.defaultData.reltypeSpecial;
objectData.contextSpecial[0] = (objectData.contextSpecial[0] != null) ? objectData.contextSpecial[0] : this.defaultData.contextSpecial[0];
objectData.contextSpecial[1] = (objectData.contextSpecial[1] != null) ? objectData.contextSpecial[1] : this.defaultData.contextSpecial[1];
objectData.contextSpecial[2] = (objectData.contextSpecial[2] != null) ? objectData.contextSpecial[2] : this.defaultData.contextSpecial[2];
objectData.connectSpecial[0] = (objectData.connectSpecial[0] != null) ? objectData.connectSpecial[0] : this.defaultData.connectSpecial[0];
objectData.connectSpecial[1] = (objectData.connectSpecial[1] != null) ? objectData.connectSpecial[1] : this.defaultData.connectSpecial[1];
// {2} Champs <select> //
objectData.job = (objectData.job != null) ? objectData.job : this.defaultData.job;
objectData.studies = (objectData.studies != null) ? objectData.studies : this.defaultData.studies;
// {3} Champs <radio> //
objectData.sexe = (objectData.sexe != null) ? objectData.sexe : this.defaultData.sexe;
objectData.famsit = (objectData.famsit != null) ? objectData.famsit : this.defaultData.famsit;
objectData.reltype = (objectData.reltype != null) ? objectData.reltype : this.defaultData.reltype;
objectData.loc = (objectData.loc != null) ? objectData.loc : this.defaultData.loc;
objectData.context = (objectData.context != null) ? objectData.context : this.defaultData.context;
objectData.freq = (objectData.freq != null) ? objectData.freq : this.defaultData.freq;
objectData.connect = (objectData.connect != null) ? objectData.connect : this.defaultData.connect;
// {1} Création physique //
this.container.innerHTML += ficheBuilder.build({
firstname: objectData.firstname,
lastname: objectData.lastname,
username: objectData.username,
uid: objectData.uid,
age: objectData.age,
city: objectData.city,
duration0: objectData.duration[0],
duration1: objectData.duration[1],
reltypespecial: objectData.reltypeSpecial,
contextspecial0: objectData.contextSpecial[0],
contextspecial1: objectData.contextSpecial[1],
contextspecial2: objectData.contextSpecial[2],
connectspecial0: objectData.connectSpecial[0],
connectspecial1: objectData.connectSpecial[1]
});
/* (2) On sélectionne la valeur dans le select (manuellement) de la PROFESSION */
var selectedOption = $('article.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électionne la valeur dans le select (manuellement) des ETUDES */
selectedOption = $('article.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électionna la valeur des boutons <radio> pour le SEXE */
var sexeCreated = $$('article.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');
/* (5) On sélectionna la valeur des boutons <radio> pour la SITUATION FAMILIALE */
var famsitCreated = $$('article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="famsit"]');
for( var i = 0 ; i < famsitCreated.length && i < objectData.famsit.length ; i++ )
if( objectData.famsit[i].status ) famsitCreated[i].setAttribute('checked', 'checked');
else famsitCreated[i].removeAttribute('checked');
/* (6) On sélectionna la valeur des boutons <radio> pour le TYPE DE RELATION */
var reltypeCreated = $$('article.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.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');
/* (8) On sélectionna la valeur des boutons <radio> pour le CONTEXTE DE RENCONTRE */
var contextCreated = $$('article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="context"]');
for( var i = 0 ; i < contextCreated.length && i < objectData.context.length ; i++ )
if( objectData.context[i].status ) contextCreated[i].setAttribute('checked', 'checked');
else contextCreated[i].removeAttribute('checked');
/* (9) On sélectionna la valeur des boutons <radio> pour les FREQUENCES */
for( var f = 0 ; f < objectData.freq.length ; f++ ){
var freqCreated = $$('article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="freq'+f+'"]');
for( var i = 0 ; i < freqCreated.length && i < objectData.freq[f].length ; i++ )
if( objectData.freq[f][i].status ) freqCreated[i].setAttribute('checked', 'checked');
else freqCreated[i].removeAttribute('checked');
}
/* (10) On sélectionna la valeur des boutons <radio> pour les CONNECTIONS */
for( var c = 0 ; c < objectData.connect.length ;c++ ){
var connectCreated = $$('article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="connect'+c+'"]');
for( var i = 0 ; i < connectCreated.length && i < objectData.connect[c].length ; i++ )
if( objectData.connect[c][i].status ) connectCreated[i].setAttribute('checked', 'checked');
else connectCreated[i].removeAttribute('checked');
}
};
/* [4] Gestion de l'affichage depuis le 'localStorage'
=========================================================*/
inputPhoneFiche.prototype.storageToFields = function(){
console.log('FICHE: STORAGE TO FIELDS');
// {1} Pour chaque contact du 'localStorage' //
var existingFiches = lsi.keys('fiches');
// On réinitialise le HTML
this.container.innerHTML = '';
// On récupère les UIDS
var UIDs = [];
for( var i = 0 ; i < existingFiches.length ; i++ ){
// {2} On récupère les informations du contact //
var ficheData = lsi.get('fiches', existingFiches[i]);
// {3} On ajoute un contact à la liste //
this.add(ficheData);
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('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 < 10-1; 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('fiches', contactUIDs[i]);
/* (5) Si la FICHE n'exise pas, on la crée avec les valeurs par défaut */
if( ficheData == null )
ficheData = this.defaultData;
/* (6) On met à jour la fiche */
ficheData.uid = contactData.uid;
ficheData.firstname = contactData.firstname;
ficheData.lastname = contactData.lastname;
ficheData.username = contactData.username;
/* (7) On enregistre les modification */
lsi.set('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.relation-panel .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 += '<span>'+realIndex+'</span>';
}
/* (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('fiches');
for( var i = 0 ; i < ficheKeys.length ; i++ ){
var ficheData = lsi.get('fiches', ficheKeys[i]);
/* (2) On vérifie le formulaire complet */
// {1} Vérification des input //
var validForm = true;
// 1. L'age est un nombre
validForm = validForm && !isNaN(parseInt(miniData.age));
// 2. Le sexe est défini
validForm = validForm && checkRadioValue(miniData.sexe[0]);
// 3. Le métier est défini
validForm = validForm && miniData.job != '.';
// 4. La distance de localisation est définie
validForm = validForm && checkRadioValue(miniData.loc);
// VALUE:
// - age
// - city
// - duration0/duration1
// - contextspecial0/1/2
// - connectspecial0/1
//
// SELECT:
// - job
// - studies
//
//
// RADIO:
// - sexe
// - famsit
// - reltype
// - loc
// - context
// - freq0/1/2/3/4
// - connect0/1/2/3/4/5
/* (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('FICHE: ATTACH');
/* (1) On initialise le jeu de données */
lsi.createDataset('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);
};