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
// {1} Pour chaque formulaire de contact présent //
var existingFiches = $$ ( '[data-sublink="phone"] article.relation-panel .fiche-relation' ) ;
for ( var i = 0 ; i < existingFiches . length ; i ++ ) {
// {2} On initialise notre deflater pour récupérer les valeurs //
var deflater = new FormDeflater ( existingFiches [ i ] , [ 'input' , 'select' ] , [ 'data-name' ] ) ;
// {3} On enregistre ce contact si le numéro n'est pas vide et soit pseudo/prénom/nom //
var deflated = deflater . deflate ( ) ;
// On crée le hash
var deflatedHash = crc32 ( JSON . stringify ( deflated ) ) ;
// console.log( deflated );
// {4} On récupère les données du LSI si elles existent //
2016-05-18 13:28:02 +00:00
var existingData = lsi . get ( 'p_fiches' , deflated . uid ) ;
2016-05-18 12:46:13 +00:00
// Si n'existe pas, on passe au suivant
if ( existingData === false )
continue ;
// {5} On récupère et met en forme les valeurs du deflater //
// Si le hash est le même, on ne fait rien
if ( existingData . hash != null && existingData . hash == deflatedHash )
return ;
var obj = {
contact : parseInt ( deflated . contact ) ,
uid : parseInt ( deflated . uid ) ,
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 ,
connectSpecial : deflated . connectSpecial ,
hash : deflatedHash
} ;
/* (6) On vérifie la validité des données et on l'enregistre dans l'objet avec la date de modification */
obj . valid = this . check ( obj ) ;
// On met à jour la date de modification, si on a pas qu'@uid de différent
2016-10-02 16:01:35 +00:00
if ( diff ( existingData , obj , [ 'hash' , 'valid' , 'timestamp' ] ) . length > 0 ) {
console . log ( diff ( existingData , obj , [ 'hash' , 'valid' , 'timestamp' ] ) ) ;
2016-05-18 12:46:13 +00:00
console . warn ( '> FICHE UPDATE' ) ;
2016-10-18 11:09:39 +00:00
// console.warn('fiche-ts', existingData.timestamp, obj.timestamp);
2016-05-18 12:46:13 +00:00
obj . timestamp = Date . now ( ) ;
2016-10-18 11:09:39 +00:00
} else if ( existingData [ 'timestamp' ] == undefined ) {
// console.warn('fiche-refresh');
2016-10-17 08:50:24 +00:00
obj . timestamp = this . defaultData . timestamp ;
2016-10-18 11:09:39 +00:00
}
2016-05-18 12:46:13 +00:00
/* (7) 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-05-18 12:46:13 +00:00
// {1} Pour chaque contact 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-05-18 12:46:13 +00:00
// On réinitialise le HTML
this . container . innerHTML = '' ;
2016-04-27 09:22:03 +00:00
2016-05-18 12:46:13 +00:00
for ( var key in ficheData )
if ( ficheData [ key ] . uid == this . selected )
this . add ( ficheData [ key ] ) ;
2016-04-28 09:42:08 +00:00
2016-05-18 12:46:13 +00:00
// {4} On met à jour la navigation //
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-18 11:09:39 +00:00
var ficheData , contactData , miniData , i ;
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);
var 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 */
for ( var uid in contacts ) {
2016-05-04 17:02:44 +00:00
2016-10-17 08:14:50 +00:00
/* (1) On cherche un uid de fiche non existant dans l'intervalle [0;40[ */
ficheUid = 0 ;
while ( addedFicheUids . indexOf ( ficheUid ) > - 1 && ficheUid < nbMaxFiche )
ficheUid ++ ;
2016-05-04 17:02:44 +00:00
2016-10-17 08:14:50 +00:00
// On enregistre le nouvel UID dans les uid crées
addedFicheUids . push ( ficheUid ) ;
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) */
var ficheData = lsi . get ( 'p_fiches' , ficheUid ) ;
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 */
ficheData . uid = ficheUid ;
ficheData . contact = parseInt ( uid ) ;
lsi . set ( 'p_fiches' , ficheUid , ficheData ) ;
2016-05-04 17:02:44 +00:00
2016-10-02 11:04:32 +00:00
2016-10-17 08:14:50 +00:00
/* (4) Si on a déja crée 20+20 fiches, on arrête */
if ( addedFicheUids . length >= nbMaxFiche )
break ;
}
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-17 08:14:50 +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
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - * /
var hasSameUsername , hasSameLink ;
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
for ( var key in miniData ) {
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-18 11:09:39 +00:00
var associatedContact = lsi . get ( 'p_contacts' , miniData [ key ] . contact ) ;
2016-10-17 08:14:50 +00:00
// Si erreur, on passe au suivant
if ( ! associatedContact )
2016-10-02 11:04:32 +00:00
continue ;
2016-05-03 21:45:31 +00:00
2016-10-18 11:09:39 +00:00
/* (3) On récupère les/la fiche(s) clone(s) si existe */
var clone = [ ] ;
2016-10-17 08:14:50 +00:00
2016-10-18 11:09:39 +00:00
// Pour chaque fiche
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-18 11:09:39 +00:00
contactData = lsi . get ( 'p_contacts' , ficheData [ i ] . contact ) ;
2016-10-17 08:14:50 +00:00
2016-10-18 11:09:39 +00:00
if ( i == key || ! contactData )
2016-10-17 08:14:50 +00:00
continue ;
// meme pseudo
hasSameUsername = contactData . username . length > 0 && associatedContact . username === contactData . username ;
// meme lien de contact
hasSameLink = ! isNaN ( contactData . existing ) && associatedContact . existing === contactData . existing ;
// si ont le même contact, alors on enregistre le clone (sauf si la même fiche)
2016-10-18 11:09:39 +00:00
( hasSameUsername || hasSameLink ) && clone . push ( ficheData [ i ] ) ;
2016-10-17 08:14:50 +00:00
}
2016-10-18 11:09:39 +00:00
// si aucun clone, on quitte
if ( clone . length === 0 )
2016-10-02 11:04:32 +00:00
continue ;
2016-10-18 11:09:39 +00:00
/* (4) On récupère le modèle (dernier modifié) */
var mini _ts = ( miniData [ key ] . hasOwnProperty ( 'timestamp' ) ) ? miniData [ key ] . timestamp : 0 ;
2016-10-02 11:04:32 +00:00
2016-10-18 11:09:39 +00:00
var clones _ts = [ ] ; // contiendra les temps des clones
var mini _update = true ; // true si dernier modifié
2016-10-17 08:40:27 +00:00
2016-10-18 11:09:39 +00:00
for ( i in clone ) {
clones _ts [ i ] = clone [ i ] . hasOwnProperty ( 'timestamp' ) ? clone [ i ] . timestamp : 0 ;
mini _update = mini _update && mini _ts > clones _ts [ i ] ;
2016-10-17 08:14:50 +00:00
}
2016-10-02 11:04:32 +00:00
2016-10-18 11:09:39 +00:00
var last _index = clones _ts . indexOf ( Math . max . apply ( Math , clones _ts ) ) ;
2016-05-03 21:45:31 +00:00
2016-10-14 08:52:09 +00:00
2016-05-03 21:45:31 +00:00
2016-10-17 08:14:50 +00:00
2016-10-18 11:09:39 +00:00
/* (5.1) Si mini est le modèle -> On copie les données de MINI dans les CLONES */
var copied ;
if ( mini _update ) {
2016-10-17 08:14:50 +00:00
2016-10-18 11:09:39 +00:00
for ( i in clone ) {
2016-10-17 08:14:50 +00:00
2016-10-18 11:09:39 +00:00
console . warn ( 'copying mini#' + miniData [ key ] . uid + ' to fiche#' + clone [ i ] . uid , mini _ts - global _start _timestamp , clones _ts [ i ] - global _start _timestamp ) ;
copied = clone [ i ] ;
copied . age = miniData [ key ] . age ;
copied . sexe = miniData [ key ] . sexe ;
copied . loc = miniData [ key ] . loc ;
copied . reltype = miniData [ key ] . reltype ;
copied . reltypeSpecial = miniData [ key ] . reltypeSpecial ;
// copied.timestamp = Date.now();
lsi . set ( '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-18 11:09:39 +00:00
// clone.timestamp = copied.timestamp+1;
// lsi.set('p_mini-fiches', clone.uid, clone);
2016-10-17 08:14:50 +00:00
2016-10-18 11:09:39 +00:00
/* (5.2) Si un clone est le modèle > On copie les données de la FICHE dans la fiche (autres clones) et dans MINI */
} else if ( last _index > - 1 ) {
// {1} On copie dans MINI //
console . warn ( 'copying fiche#' + clone [ last _index ] . uid + ' to mini#' + miniData [ key ] . uid , clones _ts [ last _index ] - global _start _timestamp , mini _ts - global _start _timestamp ) ;
copied = miniData [ key ] ;
copied . age = clone [ last _index ] . age ;
copied . sexe = clone [ last _index ] . sexe ;
copied . loc = clone [ last _index ] . loc ;
copied . reltype = clone [ last _index ] . reltype ;
copied . reltypeSpecial = clone [ last _index ] . reltypeSpecial ;
// copied.timestamp = Date.now();
lsi . set ( 'p_mini-fiches' , copied . uid , copied ) ;
2016-10-17 08:14:50 +00:00
2016-10-18 11:09:39 +00:00
// {2} On copie dans les autres fiches //
for ( i in clone ) {
// sauf le modele
if ( i == last _index ) continue ;
2016-10-17 08:14:50 +00:00
2016-10-18 11:09:39 +00:00
console . warn ( 'copying fiche#' + clone [ last _index ] . uid + ' to fiche#' + clone [ i ] . uid , clones _ts [ last _index ] - global _start _timestamp , clones _ts [ i ] - global _start _timestamp ) ;
copied = clone [ last _index ] ;
copied . uid = clone [ i ] . uid ;
// copied.timestamp = Date.now();
lsi . set ( '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-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-18 11:09:39 +00:00
// { /* (4) Gestion des fiches dupliquées
// ---------------------------------------------------------*/
// ficheData = lsi.export('p_fiches');
//
// for( var key in ficheData ){
//
// /* (1) On récupère le contact associé */
// var associatedContact = lsi.get('p_contacts', ficheData[key].contact);
//
// // Si erreur, on passe au suivant
// if( !associatedContact )
// continue;
//
// /* (3) On récupère la/les autre(s) fiche(s) (clone(s)) */
// var clone = null;
// var inCall = parseInt( ficheData[key].uid ) < this.top_size; // vrai si dans les APPELS, sinon dans les SMS
//
// for( var i in ficheData ){
//
// // si on est pas dans le bonne tranche, on passe au suivant
// if( inCall && i < this.top_size || !inCall && i >= this.top_size )
// continue;
//
// // on récupère le contact associé (si on est dans `call`, celui dans la tranche avec `sms` / et inversement)
// contactData = lsi.get('p_contacts', ficheData[i].contact);
//
// if( i == key || !contactData )
// continue;
//
// // meme pseudo
// hasSameUsername = contactData.username.length > 0 && associatedContact.username === contactData.username;
// // meme lien de contact
// hasSameLink = !isNaN(contactData.existing) && associatedContact.existing === contactData.existing;
//
// // si ont le même contact, alors on enregistre le clone (sauf si la même fiche)
// ( hasSameUsername || hasSameLink ) && ( clone = ficheData[i] );
//
// if( clone !== null )
// break;
//
// }
//
//
// /* (4) Si c'est le clone qui a été modifié en dernier, on ne fait rien */
// var fiche_ts = ( ficheData[key].hasOwnProperty('timestamp') ) ? ficheData[key].timestamp : 0;
// var clone_ts = ( clone instanceof Object && clone.hasOwnProperty('timestamp') ) ? clone.timestamp : 0;
// if( clone === null || clone_ts > fiche_ts )
// continue;
//
// console.warn('copying fiche#'+ficheData[key].uid+' to fiche#'+clone.uid, fiche_ts-global_start_timestamp, clone_ts-global_start_timestamp);
//
//
// /* (5) On copie les données de la FICHE dans le CLONE */
// var copied = ficheData[key];
// copied.uid = clone.uid;
// // copied.timestamp = Date.now();
// lsi.set('p_fiches', copied.uid, copied);
//
// // ficheData[key].timestamp = copied.timestamp;
// // lsi.set('p_fiches', ficheData[key].uid, ficheData[key]);
//
// }
//
// }
//
2016-10-17 08:14:50 +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
} ;