468 lines
16 KiB
JavaScript
468 lines
16 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
|
|
|
|
|
|
/* [1] Initialisation des utilitaires et variables
|
|
=========================================================*/
|
|
/* (1) Boutons primaires */
|
|
// {1} pour effacer toutes les données //
|
|
var clearAllButton = $('#clear-all');
|
|
// {2} pour envoyer toutes les données //
|
|
var submitAllButton = $('#submit-all');
|
|
|
|
|
|
/* (2) Input de type fichier pour l'import */
|
|
var importCallLog = $('input#call_log-import[type="file"]');
|
|
|
|
/* (3) Initialisation des managers */
|
|
var subjectManager;
|
|
var contactManager;
|
|
var miniManager;
|
|
var ficheManager;
|
|
|
|
/* (4) 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[3];
|
|
var lastname = currentForm.children[5];
|
|
|
|
/* (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[1];
|
|
var firstname = currentForm.children[3];
|
|
var lastname = currentForm.children[5];
|
|
|
|
/* (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 synchronise les MINI avec les CONTACTS */
|
|
miniManager.sync();
|
|
|
|
/* (5) On synchronise les FICHE avec les CONTACTS */
|
|
// La synchronisation des champs communs est aussi faite entre `mini` et `fiches`
|
|
// 1. Si les valeurs de `fiche` sont pas définis, on prend les valeurs de `mini`
|
|
// 2. Sinon, on prend les valeurs de `fiche`
|
|
ficheManager.sync();
|
|
|
|
|
|
/* (6) On affiche le tout */
|
|
miniManager.storageToFields();
|
|
ficheManager.storageToFields();
|
|
|
|
/* (7) On met à jour les contacts si on les a modifié on si on navigue dans les contacts */
|
|
if( isSaveButton || isNavContact )
|
|
contactManager.storageToFields();
|
|
}
|
|
}
|
|
|
|
// Vérifie qu'une seule valeur vaut TRUE et les autres false
|
|
function checkRadioValue(selectData){
|
|
var nbTrue = 0;
|
|
for( var i = 0 ; i < selectData.length ; i++ )
|
|
if( selectData[i].status === true )
|
|
nbTrue++;
|
|
|
|
if( nbTrue != 1 ) return false;
|
|
else return true;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* [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(){
|
|
|
|
|
|
/* (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 l'import du fichier
|
|
---------------------------------------------------------*/
|
|
importCallLog.addEventListener('change', function(e){
|
|
/* (1) On rédige la requête */
|
|
var request = {
|
|
path: 'upload/call_log',
|
|
phone_number: $('#subject_phone_number').value,
|
|
file: importCallLog.files[0]
|
|
};
|
|
|
|
/* (2) On effectue l'upload (import) */
|
|
api.send(request, function(response){
|
|
console.log(response);
|
|
|
|
// Si erreur, on quitte
|
|
if( response.ModuleError != 0 )
|
|
return;
|
|
|
|
|
|
|
|
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);
|
|
|
|
});
|
|
|
|
}, false);
|
|
|
|
|
|
|
|
/* (6) Gestion de l'effacement des données locales
|
|
---------------------------------------------------------*/
|
|
clearAllButton.addEventListener('click', function(e){
|
|
localStorage.clear();
|
|
reload();
|
|
}, false);
|
|
|
|
|
|
|
|
/* (7) Gestion de l'export des données locales
|
|
---------------------------------------------------------*/
|
|
$('#export-all').addEventListener('click', function(e){
|
|
/* (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')
|
|
};
|
|
|
|
/* (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);
|
|
|
|
|
|
|
|
|
|
/* (8) Gestion de l'import des données locales
|
|
---------------------------------------------------------*/
|
|
// Le bouton lance l'<input> file
|
|
$('#import-all').addEventListener('click', function(e){
|
|
$('#local-upload').click();
|
|
}, 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 )
|
|
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);
|
|
|
|
/* (3) On met à jour l'affichage */
|
|
subjectManager.storageToFields();
|
|
contactManager.storageToFields();
|
|
dynamicUpdate(true);
|
|
|
|
});
|
|
|
|
}, false);
|
|
|
|
|
|
|
|
|
|
/* (9) Gestion de la validation et de l'envoi des données
|
|
---------------------------------------------------------*/
|
|
submitAllButton.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) 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')
|
|
};
|
|
|
|
/* (3) On envoie la requête et traite la réponse */
|
|
api.send(request, function(response){
|
|
console.log(response);
|
|
}, false);
|
|
|
|
|
|
}, false);
|
|
|
|
|
|
|
|
}); }); }); });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// var number = $('input.number[type="text"]');
|
|
// ic.append(number, format_number, '06 06 06 06 06');
|
|
// // format_number -> format pour les numéros de téléphones
|
|
//
|
|
// number.addEventListener('keyup', function(e){
|
|
// ic.correct(number, false);
|
|
// }, false);
|