NxTIC/view/js/input.js

524 lines
19 KiB
JavaScript

// STRUCTURE DU localStorage
// subject -> contient les données du sujet
// contacts -> contient les données de tous les contacts
// mini-fiches -> contient les données de toutes les mini fiches
// fiches -> contient les données de toutes les fiches
// matrice -> contient les relations de la matrice
/* [1] Initialisation des utilitaires et variables
=========================================================*
/* (1) Initialisation des managers */
var subjectManager;
var contactManager;
var miniManager;
var ficheManager;
var matriceManager;
/* (2) Fonctions utiles */
function dynamicUpdate(target){
/* (0) Vérification de la cohérence de la @target
---------------------------------------------------------*/
var isElement = target instanceof Element;
var isSwitchLeft = isElement && target.tagName == 'SPAN' && target.className == 'switch-left';
var isSwitchBoth = isElement && target.tagName == 'SPAN' && target.className == 'switch-both';
var isSaveButton = isElement && target.tagName == 'INPUT' && target.type == 'submit';
var isNavButton = isElement && target.tagName == 'SPAN' && (target.parentNode.id == 'nav-mini' || target.parentNode.id == 'nav-fiche');
var isNavContact = isElement && target.tagName == 'SPAN' && target.parentNode.id == 'nav-contact';
// Si erreur, on retourne une erreur
if( !isSwitchBoth && !isSwitchLeft && !isSaveButton && !isNavButton && !isNavContact && target !== true )
return false;
/* (1) Gestion de l'échange de nom/prénom
---------------------------------------------------------*/
if( isSwitchBoth ){
console.log('> switch firstname <-> lastname');
/* (1) On récupère le formulaire parent */
var currentForm = target.parentNode;
/* (2) On récupère Nom et Prénom */
var firstname = currentForm.children[8];
var lastname = currentForm.children[10];
/* (3) On échange leurs valeurs */
var tmp = firstname.value;
firstname.value = lastname.value;
lastname.value = tmp;
}else if( isSwitchLeft ){
/* (2) Gestion de l'échange Prénom+Nom = Pseudo
---------------------------------------------------------*/
console.log('> switch firstname+lastname -> username');
/* (1) On récupère le formulaire parent */
var currentForm = target.parentNode;
/* (2) On récupère Pseudo, Nom et Prénom */
var username = currentForm.children[6];
var firstname = currentForm.children[8];
var lastname = currentForm.children[10];
/* (3) Vérification de la validité */
// Si pseudo pas vide, ou nom et prenom vide -> on ne fais rien
if( username.value.length > 0 || firstname.value.length == 0 && lastname.value.length == 0 )
return false;
/* (4) On attribue à Pseudo, la valeur de Prénom+Nom */
username.value = firstname.value +' '+ lastname.value;
firstname.value = '';
lastname.value = '';
/* (3) Gestion de la mise à jour dynamique
---------------------------------------------------------*/
}else{
console.log('> dynamic update');
/* (1) On enregistre les MINI fiches relation */
miniManager.fieldsToStorage();
/* (2) On enregister les FICHES relation */
ficheManager.fieldsToStorage();
/* (3) On enregistre les CONTACTS */
contactManager.fieldsToStorage();
/* (4) On enregistre la MATRICE */
matriceManager.fieldsToStorage();
/* (5) On synchronise les MINI avec les CONTACTS */
miniManager.sync();
/* (6) On synchronise les FICHE avec les CONTACTS */
// 1. On synchronise les `mini` et `fiches` associées en fonction de la dernière date de modification
// 2. On synchronise les `fiches` dupliquées en fonction de la dernière date de modification
ficheManager.sync();
/* (7) On affiche le tout */
miniManager.storageToFields();
ficheManager.storageToFields();
matriceManager.storageToFields();
/* (8) On met à jour les contacts si on les a modifié on si on navigue dans les contacts */
if( isSaveButton || isNavContact )
contactManager.storageToFields();
}
}
/* [2] Inclusion des scripts externes et lancement
=========================================================*/
include('/js/includes/input-phone-subject.js', function(){
include('/js/includes/input-phone-contact.js', function(){
include('/js/includes/input-phone-mini.js', function(){
include('/js/includes/input-phone-fiche.js', function(){
include('/js/includes/input-phone-matrice.js', function(){
/* (1) Gestion du formulaire du sujet
---------------------------------------------------------*/
/* (1) On crée une instance du manager du sujet */
subjectManager = new inputPhoneSubject(
$('article.subject-panel [data-name="number"]'),
$('article.subject-panel [data-name="username"]'),
$('article.subject-panel [data-name="firstname"]'),
$('article.subject-panel [data-name="lastname"]'),
$('article.subject-panel [data-name="submit"]')
);
/* (2) On le démarre */
subjectManager.attach();
/* (2) Gestion des formulaires de contact
---------------------------------------------------------*/
/* (1) On crée une instance du gestionnaire des CONTACTS */
contactManager = new inputPhoneContact(
$('article.contact-panel'),
$('#nav-contact')
);
/* (2) On le démarre */
contactManager.attach(dynamicUpdate);
/* (3) Gestion des mini fiches relation
---------------------------------------------------------*/
/* (1) On crée une instance du gestionnaire des mini fiches relation */
miniManager = new inputPhoneMini(
$('article.mini-relation-panel'),
$('#nav-mini')
);
/* (2) On le démarre */
miniManager.attach(dynamicUpdate);
/* (4) Gestion des fiches relation
---------------------------------------------------------*/
/* (1) On crée une instance du gestionnaire des fiches relation */
ficheManager = new inputPhoneFiche(
$('article.relation-panel'),
$('#nav-fiche')
);
/* (2) On le démarre */
ficheManager.attach(dynamicUpdate);
/* (5) Gestion de la matrice de relations
---------------------------------------------------------*/
/* (1) On crée une instance du gestionnaire de la matrice */
matriceManager = new inputPhoneMatrice(
$('article.matrice-panel')
);
/* (2) On le démarre */
matriceManager.attach(dynamicUpdate);
/* (6) Gestion de l'import du fichier
---------------------------------------------------------*/
// On vide l'input de type 'file' quand on clique
$('input#call_log-import[type="file"]').addEventListener('click', function(e){
e.target.value = null;
}, false);
// Gestion de l'upload
$('input#call_log-import[type="file"]').addEventListener('change', function(e){
/* (1) On rédige la requête */
var request = {
path: 'upload/call_log',
phone_number: $('#subject_phone_number').value,
file: e.target.files[0]
};
/* (2) On effectue l'upload (import) */
api.send(request, function(response){
console.log(response);
var loadingNotif = null;
// Si erreur, on quitte
if( response.ModuleError != 0 ){
if( response.ModuleError == 9 )
Notification.error('Erreur', 'Il est nécessaire de saisir les informations du <b>sujet</b> avant d\'exporter son journal d\'appel');
else
Notification.error('Erreur', response.ModuleError);
return;
}else
loadingNotif = Notification.info('Info', 'Chargement du journal d\'appel');
var uid = 0; // Contiendra l'uid des contacts
/* (3) On récupère les contacts les plus APPELLÉS */
var most_called = [];
for( var i = 0 ; i < response.calls.length && i < 10 ; i++ )
most_called.push( response.calls[i].number );
/* (4) On crée les 10 contacts les plus APPELÉS */
for( var i = 0 ; i < most_called.length ; i++ ){
var splittedName = response.directory[most_called[i]].name.split(' ');
lsi.set('contacts', uid, {
uid: uid,
number: most_called[i],
username: splittedName.length == 1 ? splittedName[0] : '', // Si un seul mot -> pseudo
firstname: splittedName.length > 1 ? splittedName[0] : '', // Si plusieurs mots -> le 1er est le prénom
lastname: splittedName.length > 1 ? splittedName.splice(1).join(' ') : '', // et les autres sont le nom
countsms: response.directory[most_called[i]].sms, // Nombre de sms
countcall: response.directory[most_called[i]].calls, // Nombre d'appels
call: i, // classement dans le top 10 des APPELS
sms: -1 // classement dans le top 10 des SMS
});
uid++;
}
/* (5) On récupère les contacts les plus SMSÉS */
var most_sms = [];
for( var i = 0 ; i < response.sms.length && i < 10 ; i++ )
most_sms.push( response.sms[i].number );
/* (6) On crée les 10 contacts les plus SMSÉS */
for( var i = 0 ; i < most_sms.length ; i++ ){
// Si le contact est déja dans le top 10 des appels, on lui ajoute juste le classement dans le top 10 des SMS
var callIndex = most_called.indexOf(most_sms[i]);
if( callIndex > -1 ){
var created = lsi.get('contacts', callIndex);
created.sms = i;
lsi.set('contacts', callIndex, created);
continue;
}
var splittedName = response.directory[most_sms[i]].name.split(' ');
lsi.set('contacts', uid, {
uid: uid,
number: most_sms[i],
username: splittedName.length == 1 ? splittedName[0] : '', // Si un seul mot -> pseudo
firstname: splittedName.length > 1 ? splittedName[0] : '', // Si plusieurs mots -> le 1er est le prénom
lastname: splittedName.length > 1 ? splittedName.splice(1).join(' ') : '', // et les autres sont le nom
countsms: response.directory[most_sms[i]].sms, // Nombre de sms
countcall: response.directory[most_sms[i]].calls, // Nombre d'appels
call: -1, // classement dans le top 10 des APPELS
sms: i // classement dans le top 10 des SMS
});
uid++;
}
/* (7) Pour chaque contact qui n'est pas dans le top 10, on l'ajoute */
for( var number in response.directory ){
// Si dans top 10 des APPELS, on ne l'ajoute pas
if( most_called.indexOf(number) > -1 )
continue;
// Si dans top 10 des SMS, on ne l'ajoute pas
if( most_sms.indexOf(number) > -1 )
continue;
// On découpe le nom par espaces
var name = response.directory[number].name===null ? '' : response.directory[number].name;
var splittedName = name.split(' ');
lsi.set('contacts', uid, {
uid: uid,
number: number,
username: splittedName.length == 1 ? splittedName[0] : '', // Si un seul mot -> pseudo
firstname: splittedName.length > 1 ? splittedName[0] : '', // Si plusieurs mots -> le 1er est le prénom
lastname: splittedName.length > 1 ? splittedName.splice(1).join(' ') : '', // et les autres sont le nom
countsms: response.directory[number].sms, // Nombre de sms
countcall: response.directory[number].calls, // Nombre d'appels
call: -1,
sms: -1
});
uid++;
}
/* (8) On met à jour l'affichage */
contactManager.storageToFields();
dynamicUpdate(true);
/* (9) On notifie la fin du chargement */
// On retire la notification de chargement
if( loadingNotif != null )
loadingNotif.click();
// On notifie que tout s'est bien passé
Notification.success('OK', 'Chargement terminé');
});
}, false);
/* (7) Gestion de l'effacement des données locales
---------------------------------------------------------*/
$('#clear-all').addEventListener('click', function(e){
/* (1) On vide tous les dataset de données */
lsi.clear('subject');
lsi.clear('contacts');
lsi.clear('mini-fiches');
lsi.clear('fiches');
lsi.clear('matrice');
/* (2) On met à jour l'affichage */
subjectManager.storageToFields();
contactManager.storageToFields();
miniManager.storageToFields();
ficheManager.storageToFields();
matriceManager.storageToFields();
Notification.success('OK', 'Les données ont été supprimées');
}, false);
/* (8) Gestion de l'export des données locales
---------------------------------------------------------*/
$('#export-all').addEventListener('click', function(e){
Notification.info('INFORMATION', 'Lancement du téléchargement de la sauvegarde');
/* (1) On construit les données */
var data = {
subject: lsi.export('subject')[0],
contacts: lsi.export('contacts'),
mini: lsi.export('mini-fiches'),
fiches: lsi.export('fiches'),
matrice: lsi.export('matrice')[0]
};
/* (2) On lance le téléchargement */
var downloadTarget = $('#download-target'); // On récupère le lien (<a>) caché qui fera le téléchargement
downloadTarget.download = 'local-data.json'; // Nom du fichier qui sera téléchargé
downloadTarget.href = 'data:application/octet-stream,' + encodeURIComponent(JSON.stringify(data)); // Contenu
downloadTarget.click(); // On lance le téléchargement
}, false);
/* (9) Gestion de l'import des données locales
---------------------------------------------------------*/
// Le bouton lance l'<input> file
$('#import-all').addEventListener('click', function(e){
$('#local-upload').click();
}, false);
// On vide l'input de type 'file' quand on clique
$('#local-upload').addEventListener('click', function(e){
e.target.value = null;
}, false);
// Gestion de l'upload d'une sauvegarde de formulaire local
$('#local-upload').addEventListener('change', function(e){
/* (1) Rédaction de la requête d'upload */
var request = {
path: 'upload/local_data',
file: $('#local-upload').files[0]
};
/* (2) Upload et réponse */
api.send(request, function(response){
console.log(response);
// Si erreur, on quitte
if( response.ModuleError != 0 ){
Notification.error('Erreur', response.ModuleError);
return false;
}
/* (3) On enregistre les données dans le 'localStorage' */
lsi.set('subject', 0, response.local_data.subject);
lsi.import('contacts', response.local_data.contacts);
lsi.import('mini-fiches', response.local_data.mini);
lsi.import('fiches', response.local_data.fiches);
lsi.set('matrice', 0, response.local_data.matrice);
/* (3) On met à jour l'affichage */
subjectManager.storageToFields();
contactManager.storageToFields();
matriceManager.storageToFields();
dynamicUpdate(true);
});
}, false);
/* (10) Gestion de la validation et de l'envoi des données
---------------------------------------------------------*/
$('#submit-all').addEventListener('click', function(e){
console.log('> GATHERING ALL DATA');
/* (1) On met dans la mémoire tout les champs non enregistrés */
subjectManager.fieldsToStorage();
contactManager.fieldsToStorage();
miniManager.fieldsToStorage();
ficheManager.fieldsToStorage();
/* (2) Vérification de la validité de toutes les données */
// {1} Vérification du sujet //
if( !subjectManager.check() ){
Notification.warning('Attention', 'Vous devez saisir les informations du <i>sujet</i>');
return false;
}
// {2} Vérification des mini-fiches //
var mini = lsi.export('mini-fiches');
for( var id in mini )
if( !mini[id].valid ){
Notification.warning('Attention', 'La <i>fiche rapide</i> <b>'+(parseInt(id)+1)+'</b> est incomplète et/ou incorrecte');
return false;
}
// {3} Vérification des fiches //
var fiches = lsi.export('fiches');
for( var id in fiches )
if( !fiches[id].valid ){
Notification.warning('Attention', 'La <i>fiche complète</i> <b>'+(parseInt(id)+1)+'</b> est incomplète et/ou incorrecte');
return false;
}
/* (3) On prépare la requête avec toutes les données */
var request = {
path: 'input/phone',
subject: lsi.export('subject')[0],
contacts: lsi.export('contacts'),
mini: lsi.export('mini-fiches'),
fiches: lsi.export('fiches'),
matrice: lsi.export('matrice')[0]
};
/* (4) On envoie la requête et traite la réponse */
api.send(request, function(response){
// Si erreur, on la notifie
if( response.ModuleError != 0 ){
Notification.error('ERREUR', response.ModuleError);
return false;
}
console.log(response);
}, false);
}, false);
}); }); }); }); });