/*=========================================================*/ /*=========== Gestion de la recherche de sujet ============*/ /*=========================================================*/ var sField = $('#search-field'); var sSubmit = $('#search-subject'); var sList = $('section[data-sublink="survey"] ul[data-list]'); sSubmit.addEventListener('click', function(e){ /* (1) On construit la requête */ var request = { path: 'subject/search', name: sField.value }; /* (2) On effectue la requête */ api.send(request, function(response){ // Si erreur if( response.ModuleError != 0 ){ Notification.error('Erreur', 'La recherche a échoué.') return false; } console.log(response); /* (3) On remplit la liste des résultats */ var htmlContent = ''; for( var id in response.results ){ htmlContent += "
  • "; htmlContent += "
    SUJET
    "; htmlContent += "
    "+id+"
    "; htmlContent += "
    "+response.results[id].name+"
    "; htmlContent += "
    "; htmlContent += "
    "; htmlContent += "
    "; htmlContent += "
    "; htmlContent += "
    "; htmlContent += "
    "; htmlContent += "
  • "; } sList.innerHTML = htmlContent; }); }, false); /*=========================================================*/ /*========== Gestion du formulaire téléphonique ===========*/ /*=========================================================*/ /* [1] Initialisation des utilitaires et variables =========================================================* /* (1) Initialisation des managers */ var pSubjectManager; var pContactManager; var pMiniManager; var pFicheManager; var pMatriceManager; /* (2) Fonctions utiles */ function pDynamicUpdate(target){ /* (0) Vérification de la cohérence de la @target ---------------------------------------------------------*/ var isElement = target instanceof Element; var isSaveButton = isElement && target.tagName == 'INPUT' && target.type == 'submit'; var isNavButton = isElement && target.tagName == 'SPAN' && (target.parentNode.id == 'p_nav-mini' || target.parentNode.id == 'p_nav-fiche'); var isNavContact = isElement && target.tagName == 'SPAN' && target.parentNode.id == 'p_nav-contact'; // Si erreur, on retourne une erreur if( !isSaveButton && !isNavButton && !isNavContact && target !== true ) return false; console.log('> dynamic update'); /* (1) On enregistre les MINI fiches relation */ pMiniManager.fieldsToStorage(); /* (2) On enregister les FICHES relation */ pFicheManager.fieldsToStorage(); /* (3) On enregistre les CONTACTS */ pContactManager.fieldsToStorage(); /* (4) On enregistre la MATRICE */ pMatriceManager.fieldsToStorage(); /* (5) 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 pFicheManager.sync(); /* (6) On synchronise les MINI avec les CONTACTS */ // Supprime les contacts déja dans les FICHES pMiniManager.sync(); /* (7) On affiche le tout */ pMiniManager.storageToFields(); pFicheManager.storageToFields(); pMatriceManager.storageToFields(); /* (8) On met à jour les contacts si on les a modifié on si on navigue dans les contacts */ if( isSaveButton || isNavContact ) pContactManager.storageToFields(); } /* [2] Inclusion des scripts externes et lancement =========================================================*/ include('/js/includes/input-phone-subject-min.js', function(){ include('/js/includes/input-phone-contact-min.js', function(){ include('/js/includes/input-phone-mini-min.js', function(){ include('/js/includes/input-phone-fiche-min.js', function(){ include('/js/includes/input-phone-matrice-min.js', function(){ /* (1) Gestion du formulaire du sujet ---------------------------------------------------------*/ /* (1) On crée une instance du manager du sujet */ pSubjectManager = new inputPhoneSubject( $('[data-sublink="phone"] article.subject-panel [data-name="tmp_id"]'), $('[data-sublink="phone"] article.subject-panel [data-name="number"]'), $('[data-sublink="phone"] article.subject-panel [data-name="username"]'), $('[data-sublink="phone"] article.subject-panel [data-name="submit"]') ); /* (2) On le démarre */ pSubjectManager.attach(); /* (2) Gestion des formulaires de contact ---------------------------------------------------------*/ /* (1) On crée une instance du gestionnaire des CONTACTS */ pContactManager = new inputPhoneContact( $('[data-sublink="phone"] article.contact-panel'), $('[data-sublink="phone"] #p_nav-contact') ); /* (2) On le démarre */ pContactManager.attach(pDynamicUpdate); /* (3) Gestion des mini fiches relation ---------------------------------------------------------*/ /* (1) On crée une instance du gestionnaire des mini fiches relation */ pMiniManager = new inputPhoneMini( $('[data-sublink="phone"] article.mini-relation-panel'), $('[data-sublink="phone"] #p_nav-mini') ); /* (2) On le démarre */ pMiniManager.attach(pDynamicUpdate); /* (4) Gestion des fiches relation ---------------------------------------------------------*/ /* (1) On crée une instance du gestionnaire des fiches relation */ pFicheManager = new inputPhoneFiche( $('[data-sublink="phone"] article.relation-panel'), $('[data-sublink="phone"] #p_nav-fiche') ); /* (2) On le démarre */ pFicheManager.attach(pDynamicUpdate); /* (5) Gestion de la matrice de relations ---------------------------------------------------------*/ /* (1) On crée une instance du gestionnaire de la matrice */ pMatriceManager = new inputPhoneMatrice( $('[data-sublink="phone"] article.matrice-panel') ); /* (2) On le démarre */ pMatriceManager.attach(pDynamicUpdate); // Listener pour snake var smgr = new ShortcutManager(); smgr.append('s+n+a+k+e', function(){ pMatriceManager.snake(); }); smgr.listen(); /* (6) Gestion de l'import du fichier ---------------------------------------------------------*/ // On vide l'input de type 'file' quand on clique $('[data-sublink="phone"] input#p_call_log-import[type="file"]').addEventListener('click', function(e){ e.target.value = null; }, false); // Gestion de l'upload $('[data-sublink="phone"] input#p_call_log-import[type="file"]').addEventListener('change', function(e){ /* (1) On rédige la requête */ var request = { path: 'upload/call_log', phone_number: $('[data-sublink="phone"] #p_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 sujet avant d\'exporter son journal d\'appel'); else Notification.error('Erreur', response.ModuleError); return; }else loadingNotif = Notification.info('Info', 'Chargement du journal d\'appel'); /* (3) On enregistre l'identifiant temporaire du sujet */ pSubjectManager.tmp_id.value = response.tmp_id; pSubjectManager.fieldsToStorage(); pSubjectManager.storageToFields(); /* (3) On crée les 10 contacts les plus APPELÉS */ for( var i = 0 ; i < response.call.length ; i++ ){ // Données du cnotact var conData = response.directory[ response.call[i] ]; lsi.set('p_contacts', conData.id, { uid: conData.id, number: conData.number, username: conData.name, // nom countsms: conData.sms, // Nombre de sms countcall: conData.call, // Nombre d'appels call: i, // classement dans le top 10 des APPELS sms: -1 // classement dans le top 10 des SMS }); } /* (5) On crée les 10 contacts les plus SMSÉS */ for( var i = 0 ; i < response.sms.length ; i++ ){ // Données du cnotact var conData = response.directory[response.sms[i]]; // Si le contact existe déja, on lui ajoute juste 'sms' // 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 = response.call.indexOf(response.sms[i]); if( callIndex > -1 ){ var created = lsi.get('p_contacts', conData.id); created.sms = i; lsi.set('p_contacts', conData.id, created); continue; } lsi.set('p_contacts', conData.id, { uid: conData.id, number: conData.number, username: conData.name, // nom countsms: conData.sms, // Nombre de sms countcall: conData.call, // Nombre d'appels call: -1, // classement dans le top 10 des APPELS sms: i // classement dans le top 10 des SMS }); } /* (7) Pour chaque contact qui n'est pas dans un top 10, on l'ajoute */ for( var id in response.directory ){ id = parseInt(id); // Si dans top 10 des APPELS, on ne l'ajoute pas if( response.call.indexOf(id) > -1 ) continue; // Si dans top 10 des SMS, on ne l'ajoute pas if( response.sms.indexOf(id) > -1 ) continue; // On récupère les données du contact var conData = response.directory[id]; lsi.set('p_contacts', conData.id, { uid: conData.id, number: conData.number, username: conData.name, // nom countsms: conData.sms, // Nombre de sms countcall: conData.call, // Nombre d'appels call: -1, sms: -1 }); } /* (8) On met à jour l'affichage */ pContactManager.storageToFields(); pDynamicUpdate(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 ---------------------------------------------------------*/ $('[data-sublink="phone"] #p_clear-all').addEventListener('click', function(e){ /* (1) On vide tous les dataset de données */ lsi.clear('p_subject'); lsi.clear('p_contacts'); lsi.clear('p_mini-fiches'); lsi.clear('p_fiches'); lsi.clear('p_matrice'); /* (2) On met à jour l'affichage */ pSubjectManager.storageToFields(); pContactManager.storageToFields(); pMiniManager.storageToFields(); pFicheManager.storageToFields(); pMatriceManager.storageToFields(); Notification.success('OK', 'Les données ont été supprimées'); }, false); /* (8) Gestion de l'export des données locales ---------------------------------------------------------*/ $('[data-sublink="phone"] #p_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('p_subject')[0], contacts: lsi.export('p_contacts'), mini: lsi.export('p_mini-fiches'), fiches: lsi.export('p_fiches'), matrice: lsi.export('p_matrice')[0] }; /* (2) On lance le téléchargement */ var downloadTarget = $('[data-sublink="phone"] #p_download-target'); // On récupère le lien () caché qui fera le téléchargement downloadTarget.download = 'local-phone-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' file $('[data-sublink="phone"] #p_import-all').addEventListener('click', function(e){ $('[data-sublink="phone"] #p_local-upload').click(); }, false); // On vide l'input de type 'file' quand on clique $('[data-sublink="phone"] #p_local-upload').addEventListener('click', function(e){ e.target.value = null; }, false); // Gestion de l'upload d'une sauvegarde de formulaire local $('[data-sublink="phone"] #p_local-upload').addEventListener('change', function(e){ /* (1) Rédaction de la requête d'upload */ var request = { path: 'upload/local_data', file: $('[data-sublink="phone"] #p_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('p_subject', 0, response.local_data.subject); lsi.import('p_contacts', response.local_data.contacts); lsi.import('p_mini-fiches', response.local_data.mini); lsi.import('p_fiches', response.local_data.fiches); lsi.set('p_matrice', 0, response.local_data.matrice); /* (3) On met à jour l'affichage */ pSubjectManager.storageToFields(); pContactManager.storageToFields(); pMatriceManager.storageToFields(); pDynamicUpdate(true); }); }, false); /* (10) Gestion de la validation et de l'envoi des données ---------------------------------------------------------*/ $('[data-sublink="phone"] #p_submit-all').addEventListener('click', function(e){ console.log('> GATHERING ALL DATA'); /* (1) On met dans la mémoire tout les champs non enregistrés */ pSubjectManager.fieldsToStorage(); pContactManager.fieldsToStorage(); pMiniManager.fieldsToStorage(); pFicheManager.fieldsToStorage(); /* (2) Vérification de la validité de toutes les données */ // {1} Vérification du sujet // if( !pSubjectManager.check() ){ Notification.warning('Attention', 'Vous devez saisir les informations du sujet'); return false; } // {2} Vérification des mini-fiches // var mini = lsi.export('p_mini-fiches'); var i = 0; for( var id in mini ){ if( !isNaN(id) ){ i++ if( !mini[id].valid ){ Notification.warning('Attention', 'La fiche rapide '+i+' est incomplète et/ou incorrecte'); return false; } }} // {3} Vérification des fiches // var fiches = lsi.export('p_fiches'); for( var id in fiches ) if( !fiches[id].valid ){ Notification.warning('Attention', 'La fiche complète '+(parseInt(id)+1)+' 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('p_subject')[0], contacts: lsi.export('p_contacts'), mini: lsi.export('p_mini-fiches'), fiches: lsi.export('p_fiches'), matrice: lsi.export('p_matrice')[0] }; /* (4) On envoie la requête et traite la réponse */ api.send(request, function(response){ console.log(response); // Si erreur, on la notifie if( response.ModuleError != 0 ){ Notification.error('ERREUR', response.ModuleError); return false; } Notification.success('OK', "L'identifiant du sujet est "+response.subject_id+" ! Tout s'est bien déroulé.", 10000); console.log(response); }, false); }, false); }); }); }); }); }); /*=========================================================*/ /*=========== Gestion du formulaire facebook ==============*/ /*=========================================================*/ /* [1] Initialisation des utilitaires et variables =========================================================* /* (1) Initialisation des managers */ var fSubjectManager; var fContactManager; var fMiniManager; var fFicheManager; var fMatriceManager; /* (2) Fonctions utiles */ function fDynamicUpdate(target){ /* (0) Vérification de la cohérence de la @target ---------------------------------------------------------*/ var isElement = target instanceof Element; var isSaveButton = isElement && target.tagName == 'INPUT' && target.type == 'submit'; var isNavButton = isElement && target.tagName == 'SPAN' && (target.parentNode.id == 'f_nav-mini' || target.parentNode.id == 'f_nav-fiche'); var isNavContact = isElement && target.tagName == 'SPAN' && target.parentNode.id == 'f_nav-contact'; // Si erreur, on retourne une erreur if( !isSaveButton && !isNavButton && !isNavContact && target !== true ) return false; console.log('> dynamic update'); /* (1) On enregistre les MINI fiches relation */ fMiniManager.fieldsToStorage(); /* (2) On enregister les FICHES relation */ fFicheManager.fieldsToStorage(); /* (3) On enregistre les CONTACTS */ fContactManager.fieldsToStorage(); /* (4) On enregistre la MATRICE */ fMatriceManager.fieldsToStorage(); /* (5) 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 fFicheManager.sync(); /* (6) On synchronise les MINI avec les CONTACTS */ // Supprime les contacts déja dans les FICHES fMiniManager.sync(); /* (7) On affiche le tout */ fMiniManager.storageToFields(); fFicheManager.storageToFields(); fMatriceManager.storageToFields(); /* (8) On met à jour les contacts si on les a modifié on si on navigue dans les contacts */ if( isSaveButton || isNavContact ) fContactManager.storageToFields(); } /* [2] Inclusion des scripts externes et lancement =========================================================*/ include('/js/includes/input-facebook-subject-min.js', function(){ include('/js/includes/input-facebook-contact-min.js', function(){ include('/js/includes/input-facebook-mini-min.js', function(){ include('/js/includes/input-facebook-fiche-min.js', function(){ include('/js/includes/input-facebook-matrice-min.js', function(){ /* (1) Gestion du formulaire du sujet ---------------------------------------------------------*/ /* (1) On crée une instance du manager du sujet */ fSubjectManager = new inputFacebookSubject( $('[data-sublink="facebook"] article.subject-panel [data-name="username"]'), $('[data-sublink="facebook"] article.subject-panel [data-name="submit"]') ); /* (2) On le démarre */ fSubjectManager.attach(); /* (2) Gestion des formulaires de contact ---------------------------------------------------------*/ /* (1) On crée une instance du gestionnaire des CONTACTS */ fContactManager = new inputFacebookContact( $('[data-sublink="facebook"] article.contact-panel'), $('[data-sublink="facebook"] #f_nav-contact') ); /* (2) On le démarre */ fContactManager.attach(fDynamicUpdate); /* (3) Gestion des mini fiches relation ---------------------------------------------------------*/ /* (1) On crée une instance du gestionnaire des mini fiches relation */ fMiniManager = new inputFacebookMini( $('[data-sublink="facebook"] article.mini-relation-panel'), $('[data-sublink="facebook"] #f_nav-mini') ); /* (2) On le démarre */ fMiniManager.attach(fDynamicUpdate); /* (4) Gestion des fiches relation ---------------------------------------------------------*/ /* (1) On crée une instance du gestionnaire des fiches relation */ fFicheManager = new inputFacebookFiche( $('[data-sublink="facebook"] article.relation-panel'), $('[data-sublink="facebook"] #f_nav-fiche') ); /* (2) On le démarre */ fFicheManager.attach(fDynamicUpdate); /* (5) Gestion de la matrice de relations ---------------------------------------------------------*/ /* (1) On crée une instance du gestionnaire de la matrice */ fMatriceManager = new inputFacebookMatrice( $('[data-sublink="facebook"] article.matrice-panel') ); /* (2) On le démarre */ fMatriceManager.attach(fDynamicUpdate); /* (7) Gestion de l'effacement des données locales ---------------------------------------------------------*/ $('[data-sublink="facebook"] #f_clear-all').addEventListener('click', function(e){ /* (1) On vide tous les dataset de données */ lsi.clear('f_subject'); lsi.clear('f_contacts'); lsi.clear('f_mini-fiches'); lsi.clear('f_fiches'); lsi.clear('f_matrice'); /* (2) On met à jour l'affichage */ fSubjectManager.storageToFields(); fContactManager.storageToFields(); fMiniManager.storageToFields(); fFicheManager.storageToFields(); fMatriceManager.storageToFields(); Notification.success('OK', 'Les données ont été supprimées'); }, false); /* (8) Gestion de l'export des données locales ---------------------------------------------------------*/ $('[data-sublink="facebook"] #f_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('f_subject')[0], contacts: lsi.export('f_contacts'), mini: lsi.export('f_mini-fiches'), fiches: lsi.export('f_fiches'), matrice: lsi.export('f_matrice')[0] }; /* (2) On lance le téléchargement */ var downloadTarget = $('[data-sublink="facebook"] #f_download-target'); // On récupère le lien () caché qui fera le téléchargement downloadTarget.download = 'local-facebook-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' file $('[data-sublink="facebook"] #f_import-all').addEventListener('click', function(e){ $('[data-sublink="facebook"] #f_local-upload').click(); }, false); // On vide l'input de type 'file' quand on clique $('[data-sublink="facebook"] #f_local-upload').addEventListener('click', function(e){ e.target.value = null; }, false); // Gestion de l'upload d'une sauvegarde de formulaire local $('[data-sublink="facebook"] #f_local-upload').addEventListener('change', function(e){ /* (1) Rédaction de la requête d'upload */ var request = { path: 'upload/local_data', file: $('[data-sublink="facebook"] #f_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('f_subject', 0, response.local_data.subject); lsi.import('f_contacts', response.local_data.contacts); lsi.import('f_mini-fiches', response.local_data.mini); lsi.import('f_fiches', response.local_data.fiches); lsi.set('f_matrice', 0, response.local_data.matrice); /* (3) On met à jour l'affichage */ fSubjectManager.storageToFields(); fContactManager.storageToFields(); fMatriceManager.storageToFields(); fDynamicUpdate(true); }); }, false); /* (10) Gestion de la validation et de l'envoi des données ---------------------------------------------------------*/ $('[data-sublink="facebook"] #f_submit-all').addEventListener('click', function(e){ console.log('> GATHERING ALL DATA'); /* (1) On met dans la mémoire tout les champs non enregistrés */ fSubjectManager.fieldsToStorage(); fContactManager.fieldsToStorage(); fMiniManager.fieldsToStorage(); fFicheManager.fieldsToStorage(); /* (2) Vérification de la validité de toutes les données */ // {1} Vérification du sujet // if( !fSubjectManager.check() ){ Notification.warning('Attention', 'Vous devez saisir les informations du sujet'); return false; } // {2} Vérification des mini-fiches // var mini = lsi.export('f_mini-fiches'); var i = 0; for( var id in mini ){ if( !isNaN(id) ){ i++ if( !mini[id].valid ){ Notification.warning('Attention', 'La fiche rapide '+i+' est incomplète et/ou incorrecte'); return false; } }} // {3} Vérification des fiches // var fiches = lsi.export('f_fiches'); for( var id in fiches ) if( !fiches[id].valid ){ Notification.warning('Attention', 'La fiche complète '+(parseInt(id)+1)+' est incomplète et/ou incorrecte'); return false; } /* (3) On prépare la requête avec toutes les données */ var request = { path: 'input/facebook', subject: lsi.export('f_subject')[0], contacts: lsi.export('f_contacts'), mini: lsi.export('f_mini-fiches'), fiches: lsi.export('f_fiches'), matrice: lsi.export('f_matrice')[0] }; /* (4) On envoie la requête et traite la réponse */ api.send(request, function(response){ console.log(response); // Si erreur, on la notifie if( response.ModuleError != 0 ){ Notification.error('ERREUR', response.ModuleError); return false; } console.log(response); }, false); }, false); }); }); }); }); });