NxTIC/js/includes/input-facebook-matrice.js

182 lines
4.9 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* [0] Constructeur -> définit le conteneur et le bouton d'ajout
=========================================================*/
function inputFacebookMatrice(container){
this.container = container;
}
/* [1] Attributs
=========================================================*/
inputFacebookMatrice.prototype = {
container: this.container // Conteneur de la matrice
};
/* [2] Gestion de l'enregistrement de la matrice
=========================================================*/
inputFacebookMatrice.prototype.fieldsToStorage = function(){
console.group('[facebook.matrice] fields to storage');
// {1} On initialise notre deflater pour récupérer les valeurs //
var deflater = new FormDeflater(this.container, ['input'], ['data-name']);
// {2} On extrait les données //
var deflated = deflater.deflate();
// On crée le hash
var deflatedHash = crc32(JSON.stringify(deflated));
// console.log(deflated);
/* (3) On crée l'objet et on le remplit avec les relations */
var obj = {};
for( var i in deflated )
// {1} Si c'est un tableau de sujets //
if( deflated[i] instanceof Array ){
// Pour chacune des différentes relations, on ajoute si TRUE
for( var a in deflated[i] ){
if( obj[i] == null )
obj[i] = [];
obj[i].push( parseInt(deflated[i][a]) );
}
// {2} Si il n'y a qu'un sujet //
}else if( deflated[i] !== null ){
if( obj[i] == null )
obj[i] = [];
obj[i].push( parseInt(deflated[i]) );
}
lsi.set( 'f_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)
// ...
//
console.groupEnd();
};
/* [4] Gestion de l'affichage depuis le 'localStorage'
=========================================================*/
inputFacebookMatrice.prototype.storageToFields = function(){
console.group('[facebook.matrice] storage to fields');
/* (1) On récupère la liste des contacts à mettre dans la matrice */
// On récupère les fiches
var ficheData = lsi.export('f_fiches');
// On récupère les données de la matrice
var matriceData = lsi.get('f_matrice', 0);
// On récupère les contacts pour afficher les noms/prénoms
var contactData = lsi.export('f_contacts');
// Contiendra les UID des contacts à mettre dans la matrice
var contacts = [];
// Pour chaque fiche, on ajoute l'uid du contact s'il n'est pas déja ajouté
for( var f in ficheData )
if( contacts.indexOf( ficheData[f].contact ) == -1 )
contacts.push( ficheData[f].contact );
/* (2) On construit le HTML de la matrice */
// Contiendra le HTML
var matrice_html = ["<table class='line'>"];
// {1} Pour chaque ligne //
for( var A = 0 ; A < contacts.length ; A++ ){
var conA = contactData[A];
matrice_html.push('<tr>');
if( A > 0 ){ // Noms sur la première ligne (abscisses)
matrice_html.push('<td style="text-align: right;">');
matrice_html.push(conA.username);
matrice_html.push('</td>');
}else // Sinon,
matrice_html.push('<td></td>');
// {2} Pour chaque case //
for( var B = 0 ; B < contacts.length ; B++ ){ if( B < contacts.length-1 ){
var conB = contactData[B];
// {3} Première colonne -> Intitulé des ordonnées //
if( A == 0 ){
matrice_html.push('<td>');
matrice_html.push('<span style="writing-mode: vertical-lr; text-align: right;">');
matrice_html.push(conB.username);
matrice_html.push('</span>');
// {4} Valeurs des relations (boutons) //
}else if( B < A ){
matrice_html.push("<td>");
matrice_html.push("<input type='checkbox' name='matrice_"+conA.uid+"_"+conB.uid+"' data-name='"+conA.uid+"' value='"+conB.uid+"' id='f_matrice_"+conA.uid+"_"+conB.uid+"'");
// Si la relation existe, on active le bouton
if( matriceData[A] != null && matriceData[A].indexOf(B) > -1 )
matrice_html.push(" checked");
matrice_html.push(" >");
matrice_html.push("<label for='f_matrice_"+conA.uid+"_"+conB.uid+"'></label>");
// {5} Cases vides (moitié supérieure droite) //
}else
matrice_html.push("<td class='hidden'>");
matrice_html.push('</td>');
}}
matrice_html.push('</tr>');
}
matrice_html.push('</table>');
/* (3) On affiche la matrice */
this.container.innerHTML = matrice_html.join('');
console.groupEnd();
};
/* [9] Point d'amorçage de la gestion des contacts
=========================================================*/
inputFacebookMatrice.prototype.attach = function(){
console.group('[facebook.matrice] attaching events');
/* (1) On initialise le jeu de données */
lsi.createDataset('f_matrice');
/* (2) On charge les mini fiches depuis la mémoire ('localStorage') */
this.storageToFields();
/* (3) On enregistre la matrice à chaque modification */
var ptr = this;
this.container.addEventListener('click', function(e){
ptr.fieldsToStorage();
setTimeout(function(){ ptr.storageToFields(); }, 500);
}, false);
console.groupEnd();
};