2016-04-27 09:22:03 +00:00
/ * [ 0 ] C o n s t r u c t e u r - > d é f i n i t l e c o n t e n e u r e t l e b o u t o n d ' a j o u t
=== === === === === === === === === === === === === === === === === === === * /
function inputPhoneFiche ( container , navContainer ) {
2016-10-12 16:43:51 +00:00
this . container = container ;
2016-05-18 12:46:13 +00:00
this . nav _container = navContainer ;
2016-10-12 16:43:51 +00:00
this . top _size = 10 ;
2016-04-27 09:22:03 +00:00
}
/ * [ 1 ] A t t r i b u t s
=== === === === === === === === === === === === === === === === === === === * /
inputPhoneFiche . prototype = {
2016-05-18 12:46:13 +00:00
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
2016-05-23 12:06:17 +00:00
sexe : '2' ,
2016-05-18 12:46:13 +00:00
age : '.' ,
job : '.' ,
famsit : '0' , // Choix 1 à 3
2016-05-23 12:06:17 +00:00
studies : '0' ,
2016-05-18 12:46:13 +00:00
reltype : '0' , // Choix 1 à 9
reltypeSpecial : '' ,
city : '' ,
quartier : '' ,
cp : '' ,
loc : '0' ,
duration : [ '' , '' ] ,
context : '0' , // Choix 1 à 14
contextSpecial : [ '' , '' , '' ] ,
freq : [ '4' , '9' , '14' , '19' , '24' ] , // 1er choix des 4 pour chaque question
connect : [ '1' , '3' , '5' , '7' , '9' , '11' ] , // Le deuxième choix (Oui/Non) donc 'Non' par défaut pour chaque question
connectSpecial : [ '' , '' ] ,
timestamp : 0 ,
valid : false
}
2016-04-27 09:22:03 +00:00
} ;
/ * [ 2 ] G e s t i o n d e l ' e n r e g i s t r e m e n t d e s f o r m u l a i r e s f i c h e f i c h e s r e l a t i o n
=== === === === === === === === === === === === === === === === === === === * /
inputPhoneFiche . prototype . fieldsToStorage = function ( ) {
2016-10-10 08:58:44 +00:00
console . group ( '[phone.fiche] fields to storage' ) ;
2016-05-18 12:46:13 +00:00
2016-10-21 12:11:47 +00:00
var i , l , deflater , deflated , existingData , obj , hash ;
2016-05-18 12:46:13 +00:00
2016-10-21 12:11:47 +00:00
/ * ( 1 ) P o u r c h a q u e f o r m u l a i r e d e c o n t a c t p r é s e n t
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - * /
var existingFiches = $$ ( '[data-sublink="phone"] article.relation-panel .fiche-relation' ) ;
for ( i = 0 , l = existingFiches . length ; i < l ; i ++ ) {
2016-05-18 12:46:13 +00:00
2016-10-21 12:11:47 +00:00
/* (1) On initialise notre deflater pour récupérer les valeurs */
deflater = new FormDeflater ( existingFiches [ i ] , [ 'input' , 'select' ] , [ 'data-name' ] ) ;
2016-05-18 12:46:13 +00:00
2016-10-21 12:11:47 +00:00
/* (2) On récupère les données */
deflated = deflater . deflate ( ) ;
2016-05-18 12:46:13 +00:00
2016-10-21 12:11:47 +00:00
/* (3) On récupère les données du LSI si elles existent */
existingData = lsi . get ( 'p_fiches' , deflated . uid ) ;
2016-10-20 12:21:46 +00:00
2016-10-21 12:11:47 +00:00
// Si erreur, on passe à la fiche suivante
2016-05-18 12:46:13 +00:00
if ( existingData === false )
continue ;
2016-10-21 12:11:47 +00:00
/* (4) On récupère et met en forme les valeurs du deflater */
obj = {
2016-05-18 12:46:13 +00:00
sexe : deflated . sexe ,
age : deflated . age ,
job : deflated . job ,
famsit : deflated . famsit ,
studies : deflated . studies ,
reltype : deflated . reltype ,
reltypeSpecial : deflated . reltypeSpecial ,
city : deflated . city ,
quartier : deflated . quartier ,
cp : deflated . cp ,
loc : deflated . loc ,
duration : deflated . duration ,
context : deflated . context ,
contextSpecial : deflated . contextSpecial ,
freq : deflated . freq ,
connect : deflated . connect ,
2016-10-21 13:19:32 +00:00
connectSpecial : deflated . connectSpecial ,
uid : parseInt ( deflated . uid ) ,
contact : parseInt ( deflated . contact )
2016-05-18 12:46:13 +00:00
} ;
2016-10-21 12:11:47 +00:00
/* (5) On calcule/compare le hash */
2016-05-18 12:46:13 +00:00
2016-10-21 12:11:47 +00:00
// {5.1} On calcule le hash //
hash = crc32 ( JSON . stringify ( obj ) ) ;
2016-10-20 12:21:46 +00:00
2016-10-21 12:11:47 +00:00
// {5.2} Si le hash est identique, on ne fait rien //
2016-10-21 13:19:32 +00:00
if ( existingData [ 'hash' ] != undefined && hash == existingData . hash )
2016-10-21 12:11:47 +00:00
continue ;
2016-10-20 12:21:46 +00:00
2016-10-21 12:11:47 +00:00
// {5.3} On enregistre le hash //
obj . hash = hash ;
2016-10-20 12:21:46 +00:00
2016-10-02 16:01:35 +00:00
2016-10-21 12:11:47 +00:00
/* (6) On calcule la validité des données */
obj . valid = this . check ( obj ) ;
2016-10-20 11:16:31 +00:00
2016-10-21 12:11:47 +00:00
/* (7) On met à jour le `timestamp` (car à ce point, on a une modification) */
obj . timestamp = Date . now ( ) ;
2016-10-21 13:19:32 +00:00
console . warn ( '> FICHE UPDATE (' + ( obj . timestamp - input _ts ) + ')' , existingData , obj ) ;
2016-05-18 12:46:13 +00:00
2016-10-21 12:11:47 +00:00
/* (8) On enregistre les données dans le 'localStorage' */
2016-05-18 13:28:02 +00:00
lsi . set ( 'p_fiches' , obj . uid , obj ) ;
2016-05-18 12:46:13 +00:00
}
2016-10-10 08:58:44 +00:00
2016-10-11 12:05:59 +00:00
console . groupEnd ( ) ;
2016-04-27 09:22:03 +00:00
} ;
2016-04-28 09:42:08 +00:00
/ * [ 3 ] G e s t i o n d e l ' a j o u t p h y s i q u e d ' u n e n o u v e l l e f i c h e
2016-04-27 09:22:03 +00:00
=== === === === === === === === === === === === === === === === === === === * /
/ *
*
* @ objectData < Object > Objet contenant les informations nécessaires à l ' affichage
*
* /
inputPhoneFiche . prototype . add = function ( objectData ) {
2016-10-10 08:58:44 +00:00
// console.log('FICHE: ADD');
2016-05-18 12:46:13 +00:00
// Si pas d'UID ou d'UID de contact, on retourne une erreur
if ( objectData . uid == null || isNaN ( objectData . uid ) || objectData . contact == null || isNaN ( objectData . contact ) )
return false ;
/* (0) Gestion du formattage des valeur */
// {1} Champs de texte //
objectData . city = ( objectData . city != null ) ? objectData . city : this . defaultData . city ;
objectData . quartier = ( objectData . quartier != null ) ? objectData . quartier : this . defaultData . quartier ;
objectData . cp = ( objectData . cp != null ) ? objectData . cp : this . defaultData . cp ;
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 ;
objectData . age = ( objectData . age != null ) ? objectData . age : this . defaultData . age ;
// {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 ;
// {4} On récupère username/firstname/lastname du contact associé //
2016-05-18 13:28:02 +00:00
var associatedContact = lsi . get ( 'p_contacts' , objectData . contact ) ;
2016-05-18 12:46:13 +00:00
// Si on ne trouve pas le contact, on ne fais rien
if ( associatedContact === false )
return false ;
2016-05-29 15:51:06 +00:00
// {2} Si lié à un contact d'une autre étude, on utilise ses informations //
2016-10-02 11:36:14 +00:00
var importedFiche = '' ;
2016-05-29 15:51:06 +00:00
if ( ! isNaN ( associatedContact . existing ) ) {
var existingData = lsi . get ( 'p_friends' , associatedContact . existing ) ;
// On récupère les données communes
associatedContact . username = existingData . name ;
objectData . age = existingData . age ;
objectData . sexe = existingData . sexe ;
objectData . loc = existingData . dist ;
// DISTANCE (LOC) : Si valeur
if ( ! isNaN ( existingData . reltype ) ) {
objectData . reltype = existingData . reltype ;
objectData . reltypeSpecial = '' ;
// DISTANCE (LOC) : Si extra
} else {
objectData . reltype = 10 ;
objectData . reltypeSpecial = existingData . reltype ;
}
// On met à jour les études uniquement si 'studies2' est défini //
if ( existingData . studies2 != null ) {
2016-05-30 10:23:32 +00:00
objectData . studies = existingData . studies2 ;
2016-05-29 15:51:06 +00:00
objectData . job = existingData . job ;
objectData . famsit = existingData . famsit ;
objectData . city = existingData . city ;
objectData . cp = existingData . cp ;
objectData . quartier = existingData . quartier ;
objectData . duration [ 0 ] = existingData . duration [ 0 ] ;
objectData . duration [ 1 ] = existingData . duration [ 1 ] ;
objectData . context = existingData . context ;
2016-05-30 10:23:32 +00:00
objectData . contextSpecial = existingData . contextExtra ;
2016-05-29 15:51:06 +00:00
objectData . connect = existingData . connect ;
2016-05-30 10:23:32 +00:00
objectData . connectSpecial = existingData . connectExtra ;
2016-05-29 15:51:06 +00:00
objectData . freq = existingData . freq ;
2016-10-02 11:36:14 +00:00
importedFiche = 'Contact importé: non modifiable!' ;
} else {
importedFiche = 'Contact importé (incomplet): modifiable partiellement!' ;
2016-05-29 15:51:06 +00:00
}
}
2016-05-18 12:46:13 +00:00
// {5} Création physique //
2016-05-18 13:08:45 +00:00
this . container . innerHTML += pFicheBuilder . build ( {
2016-10-02 11:36:14 +00:00
importedfiche : importedFiche ,
2016-05-19 13:14:10 +00:00
name : associatedContact . username ,
2016-05-18 12:46:13 +00:00
countcall : associatedContact . countcall ,
countsms : associatedContact . countsms ,
uid : objectData . uid ,
contact : objectData . contact , // uid du contact associé
city : objectData . city ,
quartier : objectData . quartier ,
cp : objectData . cp ,
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 ]
} ) ;
/* {6} On sélectionne la valeur dans le select (manuellement) de la PROFESSION */
var selectedOption = $ ( '[data-sublink="phone"] 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' ) ;
/* {7} On sélectionne la valeur dans le select (manuellement) des ETUDES */
selectedOption = $ ( '[data-sublink="phone"] 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' ) ;
/* {8} On sélectionne la valeur dans le select (manuellement) de l'AGE */
selectedOption = $ ( '[data-sublink="phone"] article.fiche-relation input[data-name="uid"][value="' + objectData . uid + '"] ~ h5>span>select[data-name="age"]>option[value="' + objectData . age + '"]' ) ;
if ( selectedOption != null )
selectedOption . setAttribute ( 'selected' , 'selected' ) ;
/* {9} On sélectionna la valeur des boutons <radio> pour le SEXE */
var sexeCreated = $$ ( '[data-sublink="phone"] 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 ++ )
if ( sexeCreated [ i ] . value == objectData . sexe ) sexeCreated [ i ] . setAttribute ( 'checked' , 'checked' ) ;
else sexeCreated [ i ] . removeAttribute ( 'checked' ) ;
/* {10} On sélectionna la valeur des boutons <radio> pour la SITUATION FAMILIALE */
var famsitCreated = $$ ( '[data-sublink="phone"] 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 ++ )
if ( famsitCreated [ i ] . value == objectData . famsit ) famsitCreated [ i ] . setAttribute ( 'checked' , 'checked' ) ;
else famsitCreated [ i ] . removeAttribute ( 'checked' ) ;
/* {11} On sélectionna la valeur des boutons <radio> pour le TYPE DE RELATION */
var reltypeCreated = $$ ( '[data-sublink="phone"] 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 ++ )
if ( reltypeCreated [ i ] . value == objectData . reltype ) reltypeCreated [ i ] . setAttribute ( 'checked' , 'checked' ) ;
else reltypeCreated [ i ] . removeAttribute ( 'checked' ) ;
/* {12} On sélectionna la valeur des boutons <radio> pour la LOCATION */
var locCreated = $$ ( '[data-sublink="phone"] 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 ++ )
if ( locCreated [ i ] . value == objectData . loc ) locCreated [ i ] . setAttribute ( 'checked' , 'checked' ) ;
else locCreated [ i ] . removeAttribute ( 'checked' ) ;
/* {13} On sélectionna la valeur des boutons <radio> pour le CONTEXTE DE RENCONTRE */
var contextCreated = $$ ( '[data-sublink="phone"] 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 ++ )
if ( contextCreated [ i ] . value == objectData . context ) contextCreated [ i ] . setAttribute ( 'checked' , 'checked' ) ;
else contextCreated [ i ] . removeAttribute ( 'checked' ) ;
2016-04-27 12:32:54 +00:00
2016-05-18 12:46:13 +00:00
/* {14} On sélectionna la valeur des boutons <radio> pour les FREQUENCES */
var freqCreated = $$ ( '[data-sublink="phone"] article.fiche-relation input[data-name="uid"][value="' + objectData . uid + '"] ~ h5>input[type="radio"][data-name="freq"]' ) ;
for ( var i = 0 ; i < freqCreated . length ; i ++ )
if ( objectData . freq . indexOf ( freqCreated [ i ] . value ) > - 1 ) freqCreated [ i ] . setAttribute ( 'checked' , 'checked' ) ;
else freqCreated [ i ] . removeAttribute ( 'checked' ) ;
2016-04-27 12:32:54 +00:00
2016-05-18 12:46:13 +00:00
/* {15} On sélectionna la valeur des boutons <radio> pour les CONNECTIONS */
var connectCreated = $$ ( '[data-sublink="phone"] article.fiche-relation input[data-name="uid"][value="' + objectData . uid + '"] ~ h5>input[type="radio"][data-name="connect"]' ) ;
for ( var i = 0 ; i < connectCreated . length ; i ++ )
if ( objectData . connect . indexOf ( connectCreated [ i ] . value ) > - 1 ) connectCreated [ i ] . setAttribute ( 'checked' , 'checked' ) ;
else connectCreated [ i ] . removeAttribute ( 'checked' ) ;
2016-04-27 09:22:03 +00:00
} ;
/ * [ 4 ] G e s t i o n d e l ' a f f i c h a g e d e p u i s l e ' l o c a l S t o r a g e '
=== === === === === === === === === === === === === === === === === === === * /
inputPhoneFiche . prototype . storageToFields = function ( ) {
2016-10-10 08:58:44 +00:00
console . group ( '[phone.fiche] storage to fields' ) ;
2016-04-27 09:22:03 +00:00
2016-10-21 12:11:47 +00:00
var clone , hash ;
/* (1) On récupère les fiches du 'localStorage' */
2016-05-18 13:28:02 +00:00
var ficheData = lsi . export ( 'p_fiches' ) ;
2016-04-27 09:22:03 +00:00
2016-10-21 12:11:47 +00:00
/* (2) On réinitialise le HTML */
2016-05-18 12:46:13 +00:00
this . container . innerHTML = '' ;
2016-04-27 09:22:03 +00:00
2016-10-21 12:11:47 +00:00
/* (3) Pour chaque fiche */
for ( var key in ficheData ) {
2016-10-21 13:19:32 +00:00
// {3.1} On calcule/enregistre le hash (sans `timestamp`, `hash`, `valid`) //
2016-10-21 12:11:47 +00:00
clone = cloneObject ( ficheData [ key ] ) ;
delete clone [ 'hash' ] ;
delete clone [ 'timestamp' ] ;
delete clone [ 'valid' ] ;
ficheData [ key ] . hash = crc32 ( JSON . stringify ( clone ) ) ;
// On enregistre dans le `localStorage`
lsi . set ( 'p_fiches' , ficheData [ key ] . uid , ficheData [ key ] ) ;
// {3.2} Pour la fiche à rendre graphiquement //
2016-10-21 13:19:32 +00:00
if ( ficheData [ key ] . uid == this . selected )
2016-05-18 12:46:13 +00:00
this . add ( ficheData [ key ] ) ;
2016-04-28 09:42:08 +00:00
2016-10-21 12:11:47 +00:00
}
2016-04-28 09:42:08 +00:00
2016-10-21 13:19:32 +00:00
/* (4) On met à jour la navigation */
2016-05-18 12:46:13 +00:00
this . updateNavBar ( ) ;
2016-04-27 09:22:03 +00:00
2016-10-10 08:58:44 +00:00
2016-10-11 12:05:59 +00:00
console . groupEnd ( ) ;
2016-04-27 09:22:03 +00:00
} ;
/ * [ 5 ] S y n c h r o n i s a t i o n d e s C O N T A C T v e r s l e s M I N I f i c h e s
=== === === === === === === === === === === === === === === === === === === * /
inputPhoneFiche . prototype . sync = function ( ) {
2016-10-12 14:20:46 +00:00
console . group ( '[phone.fiche] synchronisation' ) ;
2016-04-27 09:22:03 +00:00
2016-10-17 08:14:50 +00:00
{ / * ( 1 ) I n i t i a l i s a t i o n
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - * /
2016-04-27 09:22:03 +00:00
2016-10-17 08:14:50 +00:00
/* (1) On récupère tous les CONTACTS */
var contacts = lsi . export ( 'p_contacts' ) ;
2016-05-04 17:02:44 +00:00
2016-10-17 08:14:50 +00:00
/* (2) Contiendra les uids des fiches qui seront crées */
var addedFicheUids = [ ] ;
2016-10-21 13:44:00 +00:00
var ficheData , contactData , miniData , i , ficheUid , uid , nbMaxFiche ;
2016-05-04 17:02:44 +00:00
2016-10-17 08:14:50 +00:00
}
2016-10-02 11:04:32 +00:00
2016-05-12 19:47:52 +00:00
2016-10-17 08:14:50 +00:00
{ / * ( 2 ) M i s e à j o u r e n f o n c t i o n d e s c o n t a c t s A P R È S S A I S I E
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - * /
2016-05-04 17:02:44 +00:00
2016-10-17 08:14:50 +00:00
// Nombre maximum de fiches (40, sauf si moins de 40 contacts, dans ce cas, le nombre de contacts);
2016-10-21 13:44:00 +00:00
nbMaxFiche = lsi . keys ( 'p_contacts' ) . length < 2 * this . top _size ? lsi . keys ( 'p_contacts' ) . length : 2 * this . top _size ;
2016-05-12 19:47:52 +00:00
2016-10-17 08:14:50 +00:00
/* (1) Pour chaque CONTACT, on met à jour/crée la FICHE associée */
2016-10-21 13:44:00 +00:00
for ( uid = 0 ; uid < nbMaxFiche ; uid ++ ) {
2016-05-04 17:02:44 +00:00
2016-10-17 08:14:50 +00:00
/* (2) On récupère les informations de la FICHE (si elle existe) */
2016-10-21 13:44:00 +00:00
ficheData = lsi . get ( 'p_fiches' , uid ) ;
2016-05-04 17:02:44 +00:00
2016-10-17 08:14:50 +00:00
// Si la fiche n'existe pas, on la crée avec les valeurs par défaut
! ficheData && ( ficheData = this . defaultData ) ;
2016-05-04 17:02:44 +00:00
2016-10-17 08:14:50 +00:00
/* (3) On met à jour la fiche ET on l'enregistre */
2016-10-21 13:44:00 +00:00
ficheData . uid = uid ;
ficheData . contact = uid ;
lsi . set ( 'p_fiches' , uid , ficheData ) ;
2016-05-04 17:02:44 +00:00
2016-10-17 08:14:50 +00:00
}
2016-05-26 09:39:58 +00:00
2016-10-17 08:14:50 +00:00
}
2016-10-02 11:04:32 +00:00
2016-05-03 21:45:31 +00:00
2016-10-21 13:44:00 +00:00
{ / * ( 3 ) G e s t i o n d e s l i e n s e n t r e m i n i - f i c h e s e t f i c h e s
2016-10-17 08:14:50 +00:00
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - * /
2016-10-20 11:16:31 +00:00
var originalContact , cloneContact ,
hasSameUsername , hasSameLink ,
copied ;
2016-10-21 13:44:00 +00:00
var alreadyProcessedUsername = { } ,
alreadyProcessedExisting = { } ;
2016-05-03 21:45:31 +00:00
2016-10-17 08:14:50 +00:00
ficheData = lsi . export ( 'p_fiches' ) ;
miniData = lsi . export ( 'p_mini-fiches' ) ;
2016-10-02 11:04:32 +00:00
2016-10-18 11:09:39 +00:00
// Pour chaque mini-fiche
2016-10-20 11:16:31 +00:00
for ( var key in ficheData ) {
2016-05-03 21:45:31 +00:00
2016-10-17 08:14:50 +00:00
/* (1) On récupère le contact associé */
2016-10-20 11:16:31 +00:00
originalContact = lsi . get ( 'p_contacts' , ficheData [ key ] . contact ) ;
// {1.1} On vérifie que le contact n'a pas déja été traité //
2016-10-21 13:44:00 +00:00
if ( originalContact . username . length > 0 && alreadyProcessedUsername [ originalContact . username ] != undefined
|| originalContact . username . length == 0 && alreadyProcessedExisting [ originalContact . existing ] != undefined )
2016-10-20 11:16:31 +00:00
continue ;
// {1.2} On enregistre username || existing //
2016-10-21 13:44:00 +00:00
if ( originalContact . username . length > 0 ) alreadyProcessedUsername [ originalContact . username ] = 0 ;
else alreadyProcessedExisting [ originalContact . existing ] = 0 ;
2016-10-17 08:14:50 +00:00
// Si erreur, on passe au suivant
2016-10-20 11:16:31 +00:00
if ( ! originalContact )
2016-10-02 11:04:32 +00:00
continue ;
2016-05-03 21:45:31 +00:00
2016-10-20 11:16:31 +00:00
/* (3) On récupère la liste des fiches/mini-fiches de même contact*/
var clone = [
[ 'fiche' , ficheData [ key ] ]
] ;
2016-10-17 08:14:50 +00:00
2016-10-20 11:16:31 +00:00
// {3.1} On récupère les fiches de même contact //
2016-10-18 11:09:39 +00:00
for ( i in ficheData ) {
2016-10-17 08:14:50 +00:00
// on récupère le contact associé (si on est dans `call`, celui dans la tranche avec `sms` / et inversement)
2016-10-20 11:16:31 +00:00
cloneContact = lsi . get ( 'p_contacts' , ficheData [ i ] . contact ) ;
2016-10-17 08:14:50 +00:00
2016-10-20 11:16:31 +00:00
if ( i == key || ! cloneContact )
2016-10-17 08:14:50 +00:00
continue ;
// meme pseudo
2016-10-20 11:16:31 +00:00
hasSameUsername = cloneContact . username . length > 0 && originalContact . username === cloneContact . username ;
2016-10-17 08:14:50 +00:00
// meme lien de contact
2016-10-20 11:16:31 +00:00
hasSameLink = ! isNaN ( cloneContact . existing ) && originalContact . existing === cloneContact . existing ;
2016-10-17 08:14:50 +00:00
// si ont le même contact, alors on enregistre le clone (sauf si la même fiche)
2016-10-20 11:16:31 +00:00
( hasSameUsername || hasSameLink ) && clone . push ( [ 'fiche' , ficheData [ i ] ] ) ;
2016-10-17 08:14:50 +00:00
}
2016-10-20 11:16:31 +00:00
// {3.2} On récupère les mini-fiches de même contact //
for ( i in miniData ) {
2016-10-02 11:04:32 +00:00
2016-10-20 11:16:31 +00:00
// on récupère le contact associé (si on est dans `call`, celui dans la tranche avec `sms` / et inversement)
cloneContact = lsi . get ( 'p_contacts' , miniData [ i ] . contact ) ;
2016-10-02 11:04:32 +00:00
2016-10-20 11:16:31 +00:00
// meme pseudo
hasSameUsername = cloneContact . username . length > 0 && originalContact . username === cloneContact . username ;
// meme lien de contact
hasSameLink = ! isNaN ( cloneContact . existing ) && originalContact . existing === cloneContact . existing ;
2016-10-02 11:04:32 +00:00
2016-10-20 11:16:31 +00:00
// si ont le même contact, alors on enregistre le clone (sauf si la même fiche)
( hasSameUsername || hasSameLink ) && clone . push ( [ 'mini' , miniData [ i ] ] ) ;
2016-10-17 08:40:27 +00:00
2016-10-17 08:14:50 +00:00
}
2016-10-02 11:04:32 +00:00
2016-10-20 11:16:31 +00:00
// {3.3} si aucun clone, on quitte //
if ( clone . length === 1 )
continue ;
2016-05-03 21:45:31 +00:00
2016-10-14 08:52:09 +00:00
2016-10-20 11:16:31 +00:00
/* (4) On récupère le modèle (dernier modifié) */
var clones _ts = [ ] ; // contiendra les temps des clones
2016-05-03 21:45:31 +00:00
2016-10-20 11:16:31 +00:00
for ( i in clone )
clones _ts [ i ] = clone [ i ] [ 1 ] . hasOwnProperty ( 'timestamp' ) ? clone [ i ] [ 1 ] . timestamp : 0 ;
2016-10-17 08:14:50 +00:00
2016-10-20 11:16:31 +00:00
var last _index = clones _ts . indexOf ( Math . max . apply ( Math , clones _ts ) ) ;
2016-10-17 08:14:50 +00:00
2016-10-20 11:16:31 +00:00
/* (5) On copie le dernier modifié dans les clones */
for ( i in clone ) {
2016-10-17 08:14:50 +00:00
2016-10-20 11:16:31 +00:00
// excepté le dernier modifié
if ( i == last _index )
continue ;
2016-10-17 08:14:50 +00:00
2016-10-20 11:16:31 +00:00
/* (5.1) fiche vers fiche */
if ( clone [ i ] [ 0 ] == clone [ last _index ] [ 0 ] ) {
2016-10-17 08:14:50 +00:00
2016-10-20 11:16:31 +00:00
console . warn ( 'copying fiche#' + clone [ last _index ] [ 1 ] . uid + ' to fiche#' + clone [ i ] [ 1 ] . uid , clones _ts [ last _index ] - input _ts , clones _ts [ i ] - input _ts ) ;
2016-10-20 12:21:46 +00:00
copied = cloneObject ( clone [ last _index ] [ 1 ] ) ;
2016-10-20 11:16:31 +00:00
copied . uid = clone [ i ] [ 1 ] . uid ;
lsi . set ( 'p_fiches' , copied . uid , copied ) ;
2016-10-17 08:14:50 +00:00
2016-10-21 13:44:00 +00:00
/* (5.2) fiche vers mini OU mini vers fiche*/
2016-10-20 11:16:31 +00:00
} else if ( clone [ last _index ] [ 0 ] == 'fiche' ) {
2016-10-21 13:44:00 +00:00
console . warn ( 'copying ' + clone [ last _index ] [ 0 ] + '#' + clone [ last _index ] [ 1 ] . uid + ' to ' + clone [ i ] [ 0 ] + '#' + clone [ i ] [ 1 ] . uid , clones _ts [ last _index ] - input _ts , clones _ts [ i ] - input _ts ) ;
2016-10-20 12:21:46 +00:00
copied = cloneObject ( clone [ i ] [ 1 ] ) ;
2016-10-20 11:16:31 +00:00
copied . age = clone [ last _index ] [ 1 ] . age ;
copied . sexe = clone [ last _index ] [ 1 ] . sexe ;
copied . loc = clone [ last _index ] [ 1 ] . loc ;
copied . reltype = clone [ last _index ] [ 1 ] . reltype ;
copied . reltypeSpecial = clone [ last _index ] [ 1 ] . reltypeSpecial ;
2016-10-21 13:44:00 +00:00
lsi . set ( ( clone [ i ] [ 0 ] == 'mini' ) ? 'p_mini-fiches' : 'p_fiches' , copied . uid , copied ) ;
2016-10-17 08:14:50 +00:00
2016-10-18 11:09:39 +00:00
}
2016-10-17 08:14:50 +00:00
}
2016-10-21 13:44:00 +00:00
console . warn ( 'cloning done' ) ;
2016-10-17 08:14:50 +00:00
2016-10-20 11:16:31 +00:00
2016-10-17 08:14:50 +00:00
}
2016-05-03 20:28:47 +00:00
2016-05-18 12:46:13 +00:00
}
2016-05-03 20:28:47 +00:00
2016-10-10 08:58:44 +00:00
2016-10-11 12:05:59 +00:00
console . groupEnd ( ) ;
2016-04-27 09:22:03 +00:00
} ;
/ * [ 6 ] G e s t i o n d e l a n a v i g a t i o n e n t r e l e s f i c h e s
=== === === === === === === === === === === === === === === === === === === * /
inputPhoneFiche . prototype . nav = function ( element ) {
2016-05-18 12:46:13 +00:00
/* (1) On vérifie que l'élément contient un nombre et existe */
2016-10-02 11:04:32 +00:00
if ( ! ( element instanceof Element ) )
2016-05-18 12:46:13 +00:00
return false ;
2016-04-27 09:22:03 +00:00
2016-10-02 11:04:32 +00:00
if ( ! element . getData ( 'n' ) || isNaN ( element . getData ( 'n' ) ) || element . parentNode . id != 'p_nav-fiche' )
2016-05-18 12:46:13 +00:00
return false ;
2016-04-27 09:22:03 +00:00
2016-05-18 12:46:13 +00:00
/* (2) On désactive tous les éléments actifs */
var activeElements = $$ ( '[data-sublink="phone"] #p_nav-fiche > span.active' ) ;
for ( var i = 0 ; i < activeElements . length ; i ++ )
activeElements [ i ] . remClass ( 'active' ) ;
2016-04-27 09:22:03 +00:00
2016-05-18 12:46:13 +00:00
/* (3) On active l'élément courant */
element . addClass ( 'active' ) ;
this . selected = parseInt ( element . getData ( 'n' ) ) ;
2016-04-27 09:22:03 +00:00
} ;
/ * [ 7 ] M i s e à j o u r d e l a n a v i g a t i o n
=== === === === === === === === === === === === === === === === === === === * /
2016-04-29 10:03:05 +00:00
inputPhoneFiche . prototype . updateNavBar = function ( ) {
2016-05-18 13:28:02 +00:00
var ficheData = lsi . export ( 'p_fiches' ) ;
2016-04-29 10:03:05 +00:00
2016-05-18 12:46:13 +00:00
/* (2) On vide et remplit la barre de nav, si elle n'est pas à jour */
this . nav _container . innerHTML = '' ;
2016-04-27 09:22:03 +00:00
2016-05-18 12:46:13 +00:00
var keys = Object . keys ( ficheData ) ;
for ( var k = 0 ; k < keys . length ; k ++ ) {
var i = parseInt ( keys [ k ] ) ;
2016-04-27 09:22:03 +00:00
2016-05-12 19:47:52 +00:00
2016-09-30 08:22:21 +00:00
// Si 1ère valeur du top 20 des APPELS, on ajoute le bandeau "APPELS"
2016-05-18 12:46:13 +00:00
if ( i == 0 )
this . nav _container . innerHTML += '<span>APPELS</span>' ;
2016-05-12 19:47:52 +00:00
2016-09-30 08:22:21 +00:00
// Si fin du top 20 des APPELS, on met un espace et un border-right
if ( i < 20 && k < keys . length - 1 && keys [ k + 1 ] >= 20 )
this . nav _container . innerHTML += '<span data-n="' + i + '" class="lc">' + ( i % 20 + 1 ) + '</span> ' ;
2016-05-12 19:47:52 +00:00
2016-09-30 08:22:21 +00:00
// Si début du top 20 des SMS, on met le label 'SMS' et un border-left
else if ( i == 20 ) {
2016-09-30 09:03:18 +00:00
this . nav _container . innerHTML += '<br><span class="fc"> SMS </span>' ;
2016-09-30 08:22:21 +00:00
this . nav _container . innerHTML += '<span data-n="' + i + '">' + ( i % 20 + 1 ) + '</span>' ;
2016-05-12 19:47:52 +00:00
2016-05-18 12:46:13 +00:00
// Sinon, on ajoute juste le bouton
} else
2016-09-30 08:22:21 +00:00
this . nav _container . innerHTML += '<span data-n="' + i + '">' + ( i % 20 + 1 ) + '</span>' ;
2016-05-18 12:46:13 +00:00
}
2016-04-27 09:22:03 +00:00
2016-05-18 12:46:13 +00:00
/* (3) On montre les FICHES qui sont correctes */
for ( var key in ficheData ) {
2016-04-28 09:42:08 +00:00
2016-05-18 12:46:13 +00:00
var currentElement = $ ( '[data-sublink="phone"] #p_nav-fiche [data-n="' + ficheData [ key ] . uid + '"]' ) ;
2016-04-29 10:03:05 +00:00
2016-05-18 12:46:13 +00:00
if ( currentElement == null )
continue ;
2016-05-04 17:02:44 +00:00
2016-05-18 12:46:13 +00:00
// Si on ne trouve pas le bouton
2016-05-04 17:02:44 +00:00
2016-05-18 12:46:13 +00:00
// Si la FICHE est valide
if ( ficheData [ key ] . valid === true ) currentElement . addClass ( 'done' ) ;
// Si elle est invalide
else currentElement . remClass ( 'done' ) ;
2016-04-28 09:42:08 +00:00
2016-05-18 12:46:13 +00:00
}
2016-04-27 09:22:03 +00:00
2016-05-18 12:46:13 +00:00
/* (4) On séléctionne par défaut le dernier sélectionné */
this . nav ( $ ( '[data-sublink="phone"] #p_nav-fiche [data-n="' + this . selected + '"]' ) ) ;
2016-04-27 09:22:03 +00:00
} ;
/ * [ 8 ] V é r i f i c a t i o n d e s d o n n é e s d u f o r m u l a i r e
=== === === === === === === === === === === === === === === === === === === * /
2016-04-28 09:42:08 +00:00
inputPhoneFiche . prototype . check = function ( ficheData ) {
2016-05-18 12:46:13 +00:00
// {1} Vérification des <input> //
// 1. La ville a au moins 2 caractères
if ( ficheData . city . length < 2 )
return false ;
// 3. La durée de la relation en mois est vide ou un nombre
if ( isNaN ( parseInt ( ficheData . duration [ 0 ] ) ) && ficheData . duration [ 0 ] . length > 0 )
return false ;
// 4. La durée de la relation en année est vide ou un nombre
if ( isNaN ( parseInt ( ficheData . duration [ 1 ] ) ) && ficheData . duration [ 1 ] . length > 0 )
return false ;
// 5. Pour la durée de la relation, au moins un des 2 n'est pas vide
if ( ficheData . duration [ 0 ] . length + ficheData . duration [ 1 ] . length == 0 )
return false ;
// {2} Vérification des <select> //
// 6. Le <select> pour la profession n'est pas indéfini
if ( ficheData . job == '.' )
return false ;
// 7. Le <select> pour les études n'est pas indéfini
if ( ficheData . studies == '.' )
return false ;
// 8. Le <select> pour l'AGE n'est pas indéfini
if ( ficheData . age == '.' )
return false ;
// {3} Vérification des <input> radio //
// 9. Le SEXE a un et un seul choix
if ( ficheData . sexe == '' )
return false ;
// 10. La SITUATION FAMILIALE a un et un seul choix
if ( ficheData . famsit == '' )
return false ;
// 11. Le TYPE DE RELATION a un et un seul choix
if ( ficheData . reltype == '' )
return false ;
// 12. La DISTANCE DE DOMICILE (location) a un et un seul choix
if ( ficheData . loc == '' )
return false ;
// 13. Le CONTEXTE DE RENCONTRE a un et un seul choix
if ( ficheData . context == '' )
return false ;
// 14. Les FRÉQUENCES ont un et un seul choix (par question de fréquence)
for ( var i = 0 ; i < ficheData . freq . length ; i ++ )
if ( ficheData . freq [ i ] == '' )
return false ;
// 15. Les CONNECTION ont un et un seul choix (par question de connection)
for ( var i = 0 ; i < ficheData . connect . length ; i ++ )
if ( ficheData . connect [ i ] == '' )
return false ;
// {4} <input> dépendant d'un choix d'un <input> radio //
// 16. TYPE DE RELATION si autre est coché (indice 8), reltypeSpecial doit avoir au moins 2 caractère
if ( ficheData . reltype == '10' && ficheData . reltypeSpecial . length < 2 )
return false ;
// 17. CONTEXTE DE RELATION si est coché indice 11, contactSpecial[0] doit avoir au moins 2 caractères
if ( ficheData . context == '11' && ficheData . contextSpecial [ 0 ] . length < 2 )
return false ;
// 18. CONTEXTE DE RELATION si est coché indice 12, contextSpecial[1] doit avoir au moins 2 caractères
if ( ficheData . context == '12' && ficheData . contextSpecial [ 1 ] . length < 2 )
return false ;
// 19. CONTEXTE DE RELATION si est coché indice 13, contextSpecial[2] doit avoir au moins 2 caractères
if ( ficheData . context == '13' && ficheData . contextSpecial [ 2 ] . length < 2 )
return false ;
// 20. Si tout s'est bien passé, on retourne TRUE
return true ;
2016-04-27 09:22:03 +00:00
} ;
/ * [ 9 ] P o i n t d ' a m o r ç a g e d e l a g e s t i o n d e s c o n t a c t s
=== === === === === === === === === === === === === === === === === === === * /
inputPhoneFiche . prototype . attach = function ( handler ) {
2016-10-10 08:58:44 +00:00
console . group ( '[phone.fiche] attaching events' ) ;
2016-05-18 12:46:13 +00:00
/* (1) On initialise le jeu de données */
2016-05-18 13:28:02 +00:00
lsi . createDataset ( 'p_fiches' ) ;
2016-05-18 12:46:13 +00:00
/* (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 ;
/* (2) On attache l'évènement sur le bouton d'ajout de contact */
this . nav _container . addEventListener ( 'click' , function ( e ) {
// 1. On gère la navigation
2016-10-12 16:43:51 +00:00
this . nav ( e . target ) ;
2016-05-18 12:46:13 +00:00
// 2. On gere le chargement dynamique
2016-10-12 16:43:51 +00:00
this . handler ( e . target ) ;
} . bind ( this ) , false ) ;
2016-04-27 09:22:03 +00:00
2016-10-10 08:58:44 +00:00
2016-10-11 12:05:59 +00:00
console . groupEnd ( ) ;
2016-04-27 09:22:03 +00:00
} ;