Merged feature/input_phone into dev

This commit is contained in:
xdrm-brackets 2016-05-11 23:35:58 +02:00
commit 0ab0ec7d02
72 changed files with 5954 additions and 1835 deletions

View File

@ -1,4 +1,8 @@
RewriteEngine on
# Gestion des pages d'erreur personnalisées
ErrorDocument 403 view/error.php
# Redirection vers index.php (Router)
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

View File

@ -61,24 +61,25 @@
/* [2] Gestion du getter dynamique des Repos
=========================================================*/
// var_dump( \manager\repo\user::getById(1) );
// // var_dump( \manager\repo\user::getByLogin('xdrm') );
// // var_dump( \manager\repo\subject::getById(1) );
// var_dump( \manager\repo\user::getByLogin('xdrm') );
// var_dump( \manager\repo\subject::getById(69) );
// var_dump( \manager\repo\relation::getById(638, 640, 30) );
/* [3] Test de la vérification du format de fichier pour l'upload
=========================================================*/
// ?>
?>
<!-- <form action='' method='POST' enctype='multipart/form-data'>
<input type='file' name='file'>
<input type='submit' value='Upload'>
</form> -->
<?php //
<?php
// var_dump($_FILES);
//
// if( isset($_FILES) ){
//
// $request = new ModuleRequest('upload/local_data', array() );
// $request = new ModuleRequest('upload/call_log', array('phone_number'=>'01 02 03 04 05') );
// $response = $request->dispatch();
// var_dump( ManagerError::explicit($response->error) );
//

2
config/.htaccess Normal file
View File

@ -0,0 +1,2 @@
Order deny,allow
Deny from all

View File

@ -16,24 +16,12 @@
"attributes": { "data-link": "input" },
"children": [
{ "permissions": ["admin"], "text": "Questionnaire",
{ "permissions": ["admin"], "text": "Chercher le sujet",
"attributes": { "data-sublink": "survey" } },
{ "permissions": ["admin"], "text": "Facebook",
"attributes": { "data-sublink": "facebook" } },
{ "permissions": ["admin"], "text": "Téléphone",
{ "permissions": ["admin"], "text": "Données cellulaire",
"attributes": { "data-sublink": "phone" } },
{ "permissions": ["admin"], "text": "Messenger",
"attributes": { "data-sublink": "messenger" } }
]
},
{ "icon": "f/svg/analytics/st/menu-side", "text": "Statistiques",
"attributes": { "data-link": "analytics" },
"children": [
{ "permissions": [], "text": "Extraction de données",
"attributes": { "data-sublink": "export" } }
{ "permissions": ["admin"], "text": "Données facebook",
"attributes": { "data-sublink": "facebook" } }
]
},
@ -42,10 +30,24 @@
"attributes": { "data-link": "charts", "class": "sep" },
"children": [
{ "permissions": [], "text": "Téléphone",
{ "permissions": [], "text": "Données cellulaires",
"attributes": { "data-sublink": "phone" } },
{ "permissions": [], "text": "Toutes les données",
"attributes": { "data-sublink": "all" } }
{ "permissions": [], "text": "Réseau",
"attributes": { "data-sublink": "network" } }
]
},
{ "icon": "f/svg/analytics/st/menu-side", "text": "Données",
"attributes": { "data-link": "data" },
"children": [
{ "permissions": [], "text": "Export des données",
"attributes": { "data-sublink": "export" } },
{ "permissions": [], "text": "Export des graphiques",
"attributes": { "data-sublink": "charts" } },
{ "permissions": [], "text": "Statistiques",
"attributes": { "data-sublink": "analytics" } }
]
},

View File

@ -181,6 +181,15 @@
"id_source": { "description": "UID de l'utilisateur doublon", "type": "id" },
"id_target": { "description": "UID de l'utilisateur déjà existant", "type": "id" }
}
},
"remove": {
"description": "Suppression d'un sujet d'id donné.",
"permissions": ["admin"],
"parameters": {
"id_subject": { "description": "UID du sujet à supprimer.", "type": "id" }
}
}
},
@ -194,7 +203,8 @@
"subject": { "description": "Données sur le sujet de l'enquête.", "type": "array" },
"contacts": { "description": "Données des contacts de l'enquête.", "type": "array<array>" },
"mini": { "description": "Mini fiches relations sur les contacts de l'enquête.", "type": "array<array>" },
"fiches": { "description": "Fiches relation sur les plus proches contacts de l'enquête.", "type": "array<array>" }
"fiches": { "description": "Fiches relation sur les plus proches contacts de l'enquête.", "type": "array<array>" },
"matrice": { "description": "Matrice contenant les relations entre les plus proches contacts", "type": "array<array>" }
}
}

View File

@ -13,7 +13,23 @@
"getById",
"getAll",
"create",
"merge"
"merge",
"remove",
"link"
],
"relation": [
"getAll",
"getById",
"create",
"remove"
],
"category": [
"getAll",
"getById",
"getByIntitule",
"getOrCreate"
],
"Personnes": [

13
config/server.json Normal file
View File

@ -0,0 +1,13 @@
{
"local" : {
"host" : "http://socioview",
"root" : "/"
},
"remote" : {
"host" : "https://socioview.xdrm.io",
"root" : "/"
}
}

File diff suppressed because one or more lines are too long

View File

@ -7,8 +7,8 @@
],
"sourcesContent": [
"@import 'constants';\n\n\n#WRAPPER > #HEADER{\n\n\t/* [1] Barre de recherche\n\t=========================================================*/\n\t& > #searchbar{\n\t\tdisplay: inline-block;\n\t\tposition: absolute;\n\t\t\ttop: .8em;\n\t\t\tleft: 1em;\n\t\t\twidth: 20em;\n\t\t\theight: 2em;\n\n\t\tpadding: .2em 1em;\n\n\t\tborder: 0;\n\t\tborder-radius: 3px;\n\n\t\tbackground-color: $theme-bg;\n\n\t}\n\n\t/* [2] Informations utilisateur\n\t=========================================================*/\n\t/* (0) Conteneur */\n\t& > #user-data{\n\t\tdisplay: inline-block;\n\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tright: 0;\n\t\t\theight: calc( 100% - 2*1em );\n\n\n\t\t/* (1) Username de l'utilisateur */\n\t\t& > #user-name{\n\t \tdisplay: block;\n\t \tposition: absolute;\n\t \t\ttop: 0;\n\t \t\tright: calc( #{$header-height}*2 - 1em );\n\t \t\theight: $header-height;\n\n\t \tpadding: 0 1em;\n\n\t\t\tcolor: #fff;\n\t\t\tline-height: $header-height;\n\t\t\twhite-space: nowrap;\n\t\t\tfont-weight: bold;\n\n\t\t\tcursor: pointer;\n\n\t\t}\n\n\n\t\t/* (2) Image du profil */\n\t\t& > #user-picture{\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\t\ttop: 1em;\n\t\t\t\tright: $header-height;\n\t\t\t\twidth: calc( #{$header-height} - 2*1em );\n\t\t\t\theight: calc( #{$header-height} - 2*1em );\n\n\n\t\t\tborder-radius: 50% / 50%;\n\n\t\t\tbackground: $theme-bg url('/f/svg/nopic/st/header') center center no-repeat;\n\t\t\tbackground-size: auto 80%;\n\n\t\t\t// Si on est connecte\n\t\t\t&.active{ background-image: url('/f/svg/sample/dy/profile'); background-size: auto 100%; }\n\n\t\t\tcursor: default;\n\n\t\t\talign-self: center;\n\t\t}\n\n\n\n\t\t/* (3) Icone d'activation */\n\t\t&:before{\n\t\t\tcontent: '';\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tright: 0;\n\t\t\t\twidth: $header-height;\n\t\t\t\theight: $header-height;\n\n\t\t\tbackground: url('/f/svg/expand/st/header/ffffff') center center no-repeat;\n\t\t\tbackground-size: 1em 1em;\n\n\t\t\tcursor: pointer;\n\n\t\t}\n\n\n\t}\n\n\n\n\t/* [3] Menu deroulant pour l'administration du profil\n\t=========================================================*/\n\t& > .user-panel{\n \tdisplay: block;\n \tposition: absolute;\n \ttop: calc( #{$header-height} - 1em );\n \tright: 0;\n\n margin: .5em;\n\n\t\tborder-radius: 5px;\n\t\tborder: 1px solid darken($theme-bg, 10);\n\n background-color: #fff;\n\n @include transition( left .3s ease-in-out );\n\n\n /* (1) Pour chaque element du menu */\n & > span{\n \tdisplay: block;\n \tposition: relative;\n\n\t\t\t// On ajoute une ligne en dessous sauf pour le dernier\n\t\t\t&:not(:last-child){\n\t\t\t\tborder-bottom: 1px solid #ddd;\n\t\t\t}\n\n\t\t\tcolor: #000;\n\t\t\tpadding: .5em 1em;\n\t\t\tpadding-left: 2em;\n\n\t\t\tcursor: pointer;\n\n\t\t\t// @hover\n\t\t\t&:hover{\n\t\t\t\tbackground-color: #eee;\n\t\t\t}\n }\n\n\n\n\n }\n\n /* (3) Gestion de l'activation ou non de l'user panel */\n\t& > #toggle-user-panel{ display: none; }\n\t& > #toggle-user-panel + .user-panel{ left: 100%; }\n\t& > #toggle-user-panel:checked + .user-panel{ left: auto; }\n\t& > #toggle-user-panel:checked + .user-panel:before{ left: 7em; }\n\n\n\n\n\n\n}\n",
"/* [1] COULEURS\n=========================================================*/\n/* (1) COULEURS DU THEME $DEFAULT */\n$theme-bg: #e8e8e8;\n$theme-bg-primary: #ffffff;\n$theme-fg: #515151;\n$theme-fg-primary: #399ced;\n\n/* (2) COULEURS DE THEME $DARK */\n$dark-bg: #313541;\n$dark-bg-primary: #29282e;\n$dark-fg: #939393;\n$dark-fg-primary: #ffffff;\n\n$header-dark: #333333;\n\n/* (3) Couleurs du theme pour la timeline */\n$timeline-color: #399ced;\n\n/* [2] DIMENSIONS\n=========================================================*/\n/* (1) Layout de base */\n$menu-side-width: 15em;\n$header-height: 4em;\n\n\n\n/* [3] Mixins\n=========================================================*/\n@mixin transform($value...) {\n transform: $value;\n\t-moz-transform: $value;\n\t-o-transform: $value;\n\t-ms-transform: $value;\n\t-webkit-transform: $value;\n}\n\n\n@mixin transition($value...) {\n -webkit-transition: $value;\n transition: $value;\n}\n\n/* [4] Functions\n=========================================================*/\n// Transforme une couleur hex en string sans le #\n@function color-str($color){\n @return str-slice(#{$color}, 2, str-length(#{$color}));\n}\n"
"/* [1] COULEURS\n=========================================================*/\n/* (1) COULEURS DU THEME $DEFAULT */\n$theme-bg: #e8e8e8;\n$theme-bg-primary: #ffffff;\n$theme-fg: #515151;\n$theme-fg-primary: #399ced;\n\n/* (2) COULEURS DE THEME $DARK */\n$dark-bg: #313541;\n$dark-bg-primary: #29282e;\n$dark-fg: #939393;\n$dark-fg-primary: #ffffff;\n\n$header-dark: #333333;\n\n/* (3) Couleurs du theme pour la timeline */\n$timeline-color: #738394;\n$timeline-0: #399ced;\n$timeline-1: #e64e3e;\n$timeline-2: #10baa3;\n$timeline-3: #b14be7;\n$timeline-4: #053b5d;\n\n\n/* [2] DIMENSIONS\n=========================================================*/\n/* (1) Layout de base */\n$menu-side-width: 15em;\n$header-height: 4em;\n\n\n\n/* [3] Mixins\n=========================================================*/\n@mixin transform($value...) {\n transform: $value;\n\t-moz-transform: $value;\n\t-o-transform: $value;\n\t-ms-transform: $value;\n\t-webkit-transform: $value;\n}\n\n\n@mixin transition($value...) {\n -webkit-transition: $value;\n transition: $value;\n}\n\n/* [4] Functions\n=========================================================*/\n// Transforme une couleur hex en string sans le #\n@function color-str($color){\n @return str-slice(#{$color}, 2, str-length(#{$color}));\n}\n"
],
"mappings": "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",
"mappings": "ACAA;2DAC2D;AAC3D,oCAAoC;AAMpC,iCAAiC;AAQjC,4CAA4C;AAS5C;2DAC2D;AAC3D,wBAAwB;AAMxB;2DAC2D;AAe3D;2DAC2D;AD/C3D,QAAQ,GAAG,OAAO,CAAA;EAEjB;4DAC2D;EAkB3D;4DAC2D;EAC3D,mBAAmB;EA4EnB;4DAC2D;EA4CxD,wDAAwD;CAW3D;;AA3JD,QAAQ,GAAG,OAAO,GAIb,UAAU,CAAA;EACb,OAAO,EAAE,YAAa;EACtB,QAAQ,EAAE,QAAS;EAClB,GAAG,EAAE,IAAK;EACV,IAAI,EAAE,GAAI;EACV,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,GAAI;EAEb,OAAO,EAAE,QAAS;EAElB,MAAM,EAAE,CAAE;EACV,aAAa,EAAE,GAAI;EAEnB,gBAAgB,ECjBC,OAAO;CDmBxB;;AAnBF,QAAQ,GAAG,OAAO,GAwBb,UAAU,CAAA;EACb,OAAO,EAAE,YAAa;EACtB,QAAQ,EAAE,QAAS;EAClB,GAAG,EAAE,CAAE;EACP,KAAK,EAAE,CAAE;EACT,MAAM,EAAE,mBAAI;EAGb,mCAAmC;EAoBnC,yBAAyB;EAyBzB,4BAA4B;CAkB5B;;AA/FF,QAAQ,GAAG,OAAO,GAwBb,UAAU,GAST,UAAU,CAAA;EACV,OAAO,EAAE,KAAM;EACf,QAAQ,EAAE,QAAS;EAClB,GAAG,EAAE,CAAE;EACP,KAAK,EAAE,kBAAI;EACX,MAAM,ECZK,GAAG;EDcf,OAAO,EAAE,KAAM;EAElB,KAAK,EAAE,IAAK;EACZ,WAAW,ECjBI,GAAG;EDkBlB,WAAW,EAAE,MAAO;EACpB,WAAW,EAAE,IAAK;EAElB,MAAM,EAAE,OAAQ;CAEhB;;AAjDH,QAAQ,GAAG,OAAO,GAwBb,UAAU,GA6BT,aAAa,CAAA;EAChB,OAAO,EAAE,KAAM;EACf,QAAQ,EAAE,QAAS;EAClB,GAAG,EAAE,GAAI;EACT,KAAK,EC/BS,GAAG;EDgCjB,KAAK,EAAE,kBAAI;EACX,MAAM,EAAE,kBAAI;EAGb,aAAa,EAAE,SAAU;EAEzB,UAAU,EChEM,OAAO,CDgED,6BAAG,CAA2B,MAAM,CAAC,MAAM,CAAC,SAAS;EAC3E,eAAe,EAAE,QAAS;EAK1B,MAAM,EAAE,OAAQ;EAEhB,UAAU,EAAE,MAAO;CACnB;;AAzEH,QAAQ,GAAG,OAAO,GAwBb,UAAU,GA6BT,aAAa,AAef,OAAO,CAAA;EAAE,gBAAgB,EAAE,+BAAG;EAA8B,eAAe,EAAE,SAAU;CAAI;;AApE/F,QAAQ,GAAG,OAAO,GAwBb,UAAU,AAsDZ,OAAO,CAAA;EACP,OAAO,EAAE,EAAG;EACZ,OAAO,EAAE,KAAM;EACf,QAAQ,EAAE,QAAS;EAClB,GAAG,EAAE,CAAE;EACP,KAAK,EAAE,CAAE;EACT,KAAK,EC1DS,GAAG;ED2DjB,MAAM,EC3DQ,GAAG;ED6DlB,UAAU,EAAE,qCAAG,CAAmC,MAAM,CAAC,MAAM,CAAC,SAAS;EACzE,eAAe,EAAE,OAAQ;EAEzB,MAAM,EAAE,OAAQ;CAEhB;;AA5FH,QAAQ,GAAG,OAAO,GAqGb,WAAW,CAAA;EACX,OAAO,EAAE,KAAM;EACf,QAAQ,EAAE,QAAS;EACf,GAAG,EAAE,gBAAI;EACT,KAAK,EAAE,CAAE;EAEV,MAAM,EAAE,IAAK;EAEnB,aAAa,EAAE,GAAI;EACnB,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,OAAM;EAElB,gBAAgB,EAAE,IAAK;ECtE3B,kBAAkB,EDwEO,IAAI,CAAC,IAAG,CAAC,WAAW;ECvE7C,UAAU,EDuEe,IAAI,CAAC,IAAG,CAAC,WAAW;EAGzC,qCAAqC;CAyBxC;;AA9IL,QAAQ,GAAG,OAAO,GAqGb,WAAW,GAiBJ,IAAI,CAAA;EACP,OAAO,EAAE,KAAM;EACf,QAAQ,EAAE,QAAS;EAOzB,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,QAAS;EAClB,YAAY,EAAE,GAAI;EAElB,MAAM,EAAE,OAAQ;CAMV;;AAzIT,QAAQ,GAAG,OAAO,GAqGb,WAAW,GAiBJ,IAAI,AAKZ,IAAK,CAAA,WAAW,EAAC;EACjB,aAAa,EAAE,cAAe;CAC9B;;AA7HJ,QAAQ,GAAG,OAAO,GAqGb,WAAW,GAiBJ,IAAI,AAgBZ,MAAM,CAAA;EACN,gBAAgB,EAAE,IAAK;CACvB;;AAxIJ,QAAQ,GAAG,OAAO,GAiJb,kBAAkB,CAAA;EAAE,OAAO,EAAE,IAAK;CAAI;;AAjJ3C,QAAQ,GAAG,OAAO,GAkJb,kBAAkB,GAAG,WAAW,CAAA;EAAE,IAAI,EAAE,IAAK;CAAI;;AAlJtD,QAAQ,GAAG,OAAO,GAmJb,kBAAkB,AAAA,QAAQ,GAAG,WAAW,CAAA;EAAE,IAAI,EAAE,IAAK;CAAI;;AAnJ9D,QAAQ,GAAG,OAAO,GAoJb,kBAAkB,AAAA,QAAQ,GAAG,WAAW,AAAA,OAAO,CAAA;EAAE,IAAI,EAAE,GAAI;CAAI",
"names": []
}

File diff suppressed because one or more lines are too long

View File

@ -7,8 +7,8 @@
],
"sourcesContent": [
"@import 'constants';\n\n\n#WRAPPER > #HEADER{\n\n\t/* [1] Barre de recherche\n\t=========================================================*/\n\t& > #searchbar{\n\t\tdisplay: inline-block;\n\t\tposition: absolute;\n\t\t\ttop: .8em;\n\t\t\tleft: 1em;\n\t\t\twidth: 20em;\n\t\t\theight: 2em;\n\n\t\tpadding: .2em 1em;\n\n\t\tborder: 0;\n\t\tborder-radius: 3px;\n\n\t\tbackground-color: $theme-bg;\n\n\t}\n\n\t/* [2] Informations utilisateur\n\t=========================================================*/\n\t/* (0) Conteneur */\n\t& > #user-data{\n\t\tdisplay: inline-block;\n\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tright: 0;\n\t\t\theight: calc( 100% - 2*1em );\n\n\n\t\t/* (1) Username de l'utilisateur */\n\t\t& > #user-name{\n\t \tdisplay: block;\n\t \tposition: absolute;\n\t \t\ttop: 0;\n\t \t\tright: calc( #{$header-height}*2 - 1em );\n\t \t\theight: $header-height;\n\n\t \tpadding: 0 1em;\n\n\t\t\tcolor: #fff;\n\t\t\tline-height: $header-height;\n\t\t\twhite-space: nowrap;\n\t\t\tfont-weight: bold;\n\n\t\t\tcursor: pointer;\n\n\t\t}\n\n\n\t\t/* (2) Image du profil */\n\t\t& > #user-picture{\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\t\ttop: 1em;\n\t\t\t\tright: $header-height;\n\t\t\t\twidth: calc( #{$header-height} - 2*1em );\n\t\t\t\theight: calc( #{$header-height} - 2*1em );\n\n\n\t\t\tborder-radius: 50% / 50%;\n\n\t\t\tbackground: $theme-bg url('/f/svg/nopic/st/header') center center no-repeat;\n\t\t\tbackground-size: auto 80%;\n\n\t\t\t// Si on est connecte\n\t\t\t&.active{ background-image: url('/f/svg/sample/dy/profile'); background-size: auto 100%; }\n\n\t\t\tcursor: default;\n\n\t\t\talign-self: center;\n\t\t}\n\n\n\n\t\t/* (3) Icone d'activation */\n\t\t&:before{\n\t\t\tcontent: '';\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tright: 0;\n\t\t\t\twidth: $header-height;\n\t\t\t\theight: $header-height;\n\n\t\t\tbackground: url('/f/svg/expand/st/header/ffffff') center center no-repeat;\n\t\t\tbackground-size: 1em 1em;\n\n\t\t\tcursor: pointer;\n\n\t\t}\n\n\n\t}\n\n\n\n\t/* [3] Menu deroulant pour l'administration du profil\n\t=========================================================*/\n\t& > .user-panel{\n \tdisplay: block;\n \tposition: absolute;\n \ttop: calc( #{$header-height} - 1em );\n \tright: 0;\n\n margin: .5em;\n\n\t\tborder-radius: 5px;\n\t\tborder: 1px solid darken($theme-bg, 10);\n\n background-color: #fff;\n\n @include transition( left .3s ease-in-out );\n\n\n /* (1) Pour chaque element du menu */\n & > span{\n \tdisplay: block;\n \tposition: relative;\n\n\t\t\t// On ajoute une ligne en dessous sauf pour le dernier\n\t\t\t&:not(:last-child){\n\t\t\t\tborder-bottom: 1px solid #ddd;\n\t\t\t}\n\n\t\t\tcolor: #000;\n\t\t\tpadding: .5em 1em;\n\t\t\tpadding-left: 2em;\n\n\t\t\tcursor: pointer;\n\n\t\t\t// @hover\n\t\t\t&:hover{\n\t\t\t\tbackground-color: #eee;\n\t\t\t}\n }\n\n\n\n\n }\n\n /* (3) Gestion de l'activation ou non de l'user panel */\n\t& > #toggle-user-panel{ display: none; }\n\t& > #toggle-user-panel + .user-panel{ left: 100%; }\n\t& > #toggle-user-panel:checked + .user-panel{ left: auto; }\n\t& > #toggle-user-panel:checked + .user-panel:before{ left: 7em; }\n\n\n\n\n\n\n}\n",
"/* [1] COULEURS\n=========================================================*/\n/* (1) COULEURS DU THEME $DEFAULT */\n$theme-bg: #e8e8e8;\n$theme-bg-primary: #ffffff;\n$theme-fg: #515151;\n$theme-fg-primary: #399ced;\n\n/* (2) COULEURS DE THEME $DARK */\n$dark-bg: #313541;\n$dark-bg-primary: #29282e;\n$dark-fg: #939393;\n$dark-fg-primary: #ffffff;\n\n$header-dark: #333333;\n\n/* (3) Couleurs du theme pour la timeline */\n$timeline-color: #399ced;\n\n/* [2] DIMENSIONS\n=========================================================*/\n/* (1) Layout de base */\n$menu-side-width: 15em;\n$header-height: 4em;\n\n\n\n/* [3] Mixins\n=========================================================*/\n@mixin transform($value...) {\n transform: $value;\n\t-moz-transform: $value;\n\t-o-transform: $value;\n\t-ms-transform: $value;\n\t-webkit-transform: $value;\n}\n\n\n@mixin transition($value...) {\n -webkit-transition: $value;\n transition: $value;\n}\n\n/* [4] Functions\n=========================================================*/\n// Transforme une couleur hex en string sans le #\n@function color-str($color){\n @return str-slice(#{$color}, 2, str-length(#{$color}));\n}\n"
"/* [1] COULEURS\n=========================================================*/\n/* (1) COULEURS DU THEME $DEFAULT */\n$theme-bg: #e8e8e8;\n$theme-bg-primary: #ffffff;\n$theme-fg: #515151;\n$theme-fg-primary: #399ced;\n\n/* (2) COULEURS DE THEME $DARK */\n$dark-bg: #313541;\n$dark-bg-primary: #29282e;\n$dark-fg: #939393;\n$dark-fg-primary: #ffffff;\n\n$header-dark: #333333;\n\n/* (3) Couleurs du theme pour la timeline */\n$timeline-color: #738394;\n$timeline-0: #399ced;\n$timeline-1: #e64e3e;\n$timeline-2: #10baa3;\n$timeline-3: #b14be7;\n$timeline-4: #053b5d;\n\n\n/* [2] DIMENSIONS\n=========================================================*/\n/* (1) Layout de base */\n$menu-side-width: 15em;\n$header-height: 4em;\n\n\n\n/* [3] Mixins\n=========================================================*/\n@mixin transform($value...) {\n transform: $value;\n\t-moz-transform: $value;\n\t-o-transform: $value;\n\t-ms-transform: $value;\n\t-webkit-transform: $value;\n}\n\n\n@mixin transition($value...) {\n -webkit-transition: $value;\n transition: $value;\n}\n\n/* [4] Functions\n=========================================================*/\n// Transforme une couleur hex en string sans le #\n@function color-str($color){\n @return str-slice(#{$color}, 2, str-length(#{$color}));\n}\n"
],
"mappings": "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",
"mappings": "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",
"names": []
}

View File

@ -157,7 +157,7 @@ body{
background-color: $dark-bg;
color: $dark-fg-primary;
font-weight: bold;
// font-weight: bold;
letter-spacing: .07em;
@include transition( border .2s ease-in-out );

File diff suppressed because one or more lines are too long

View File

@ -6,9 +6,9 @@
"../constants.scss"
],
"sourcesContent": [
"@import 'constants';\n\nbody{\n\n\tfont-family: 'Open Sans';\n\tfont-size: 15px;\n}\n\n\n\n#WRAPPER{\n\tdisplay: block;\n\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\tbackground-color: $theme-bg;\n\n\toverflow-x: hidden;\n\toverflow-y: auto;\n\n\tz-index: 1;\n\n\n\t/* [1] Header de la page\n\t==========================================*/\n\t& > #HEADER{\n\t\tdisplay: block;\n\t\tposition: fixed;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: calc( #{$header-height} - 1px );\n\n\t\tborder-bottom: 1px solid darken($header-dark, 10);\n\n\t\tbackground-color: $header-dark;\n\n\t\tz-index: 100;\n\n\t}\n\n\n\t/* [2] Side-Menu de la page\n\t==========================================*/\n\t// Gestion du menu\n\t& > #MENU-SIDE{\n\t\tdisplay: block;\n\t\tposition: fixed;\n\t\t\ttop: $header-height;\n\t\t\tleft: 0;\n\t\t\twidth: $menu-side-width;\n\t\t\theight: calc( 100% - #{$header-height} );\n\n\t\tbox-shadow: 2px 1px 3px #ddd;\n\n\t\tbackground-color: #fff;\n\n\t\t@include transition( all .3s );\n\n\t\tz-index: 10;\n\t}\n\n\n\t/* [3] Container de la page\n\t==========================================*/\n\t& > #CONTAINER{\n\t\tdisplay: flex;\n\t\tposition: absolute;\n\t\t\ttop: $header-height;\n\t\t\tleft: $menu-side-width;\n\t\t\twidth: calc( 100% - #{$menu-side-width} );\n\t\t\tmin-height: calc( 100% - #{$header-height} );\n\t\t// margin: 1em;\n\n\t\t// Flex properties\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t\tflex-wrap: wrap;\n\n\t\toverflow-x: none;\n\t\toverflow-y: auto;\n\t}\n}\n\n\n\n\n/* [4] Page de login\n=========================================================*/\n#LOGIN{\n\tdisplay: flex;\n\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: -100%;\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t// Quand la page de login est visible\n\t&.active{\n\t\tleft: 0;\n\t}\n\n\t// flex properties\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\tjustify-content: space-around;\n\talign-items: center;\n\n\n\tbackground-color: $dark-bg;\n\n\t@include transition( left .3s ease-in-out );\n\n\tz-index: 101;\n\n\n\n\n\t/* (1) Logo et nom du site */\n\t& > #login-icon{\n\t\twidth: 35em;\n\t\theight: 10em;\n\n\t\tbackground: url('/f/svg/iconv2/st') center center no-repeat;\n\t\tbackground-size: auto 100%;\n\t}\n\n\n\t/* (2) Formulaire de connexion */\n\t& > #login-form{\n\t\tdisplay: block;\n\n\n\t\t/* (2.1) Champs de texte (login/password) */\n\t\t& > input[type='text'],\n\t\t& > input[type='password'],\n\t\t& > input[type='submit']{\n\t\t\tdisplay: flex;\n\t\t\t\twidth: 20em;\n\n\t\t\tmargin: 2em 0;\n\t\t\tpadding: 1em 2em;\n\n\t\t\t// flex properties\n\t\t\tflex-direction: column;\n\t\t\tjustify-content: space-around;\n\t\t\tflex-wrap: nowrap;\n\t\t\talign-items: middle;\n\n\n\t\t\tborder-radius: 5px;\n\t\t\tborder: 1px solid lighten($theme-fg, 10);\n\n\t\t\tbackground-color: $dark-bg;\n\n\t\t\tcolor: $dark-fg-primary;\n\t\t\tfont-weight: bold;\n\t\t\tletter-spacing: .07em;\n\n\t\t\t@include transition( border .2s ease-in-out );\n\n\t\t\tcursor: default;\n\n\t\t\t// Animation de @hover/@focus\n\t\t\t&:hover,\n\t\t\t&:focus{\n\t\t\t\tborder-color: $theme-fg-primary;\n\t\t\t}\n\n\t\t}\n\n\n\t\t/* (2.2) Bouton de connexion */\n\t\t& > input[type='submit']{\n\t\t\twidth: 100%;\n\t\t\tmargin: 2em 0;\n\n\t\t\tborder: 0;\n\n\t\t\tbackground-color: $theme-fg-primary;\n\n\t\t\tcolor: $dark-fg-primary;\n\t\t\tfont-weight: bold;\n\t\t\ttext-align: left;\n\n\t\t\tcursor: pointer;\n\n\t\t\t// Animation de @hover\n\t\t\t&:hover{\n\t\t\t\tbackground-color: darken($theme-fg-primary, 10);\n\t\t\t\tbox-shadow: 0 0 1em darken($dark-bg, 10);\n\t\t\t}\n\n\t\t}\n\n\n\n\n\n\t\t/* (3) Mot de passe oublie */\n\t\t& > #lost-password{\n\t\t\tcolor: $dark-fg;\n\n\t\t\tcursor: pointer;\n\n\t\t\t// Animation de @hover\n\t\t\t&:hover{\n\t\t\t\tcolor: $theme-fg-primary;\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/* (4) Gestion de la fermeture */\n\t& > #login-close{\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\t\ttop: 2em;\n\t\t\tright: 2em;\n\t\t\tmin-width: 2em;\n\t\t\theight: 2em;\n\n\t\tbackground: url('/f/svg/back/st/container/ffffff') right center no-repeat;\n\t\tbackground-size: 1em;\n\n\t\tcolor: #fff;\n\t\tpadding-right: 2em;\n\t\tline-height: 2em;\n\t\tfont-weight: bold;\n\n\t\tcursor: pointer;\n\t}\n}\n",
"@import 'constants';\n\nbody{\n\n\tfont-family: 'Open Sans';\n\tfont-size: 15px;\n}\n\n\n\n#WRAPPER{\n\tdisplay: block;\n\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\tbackground-color: $theme-bg;\n\n\toverflow-x: hidden;\n\toverflow-y: auto;\n\n\tz-index: 1;\n\n\n\t/* [1] Header de la page\n\t==========================================*/\n\t& > #HEADER{\n\t\tdisplay: block;\n\t\tposition: fixed;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: calc( #{$header-height} - 1px );\n\n\t\tborder-bottom: 1px solid darken($header-dark, 10);\n\n\t\tbackground-color: $header-dark;\n\n\t\tz-index: 100;\n\n\t}\n\n\n\t/* [2] Side-Menu de la page\n\t==========================================*/\n\t// Gestion du menu\n\t& > #MENU-SIDE{\n\t\tdisplay: block;\n\t\tposition: fixed;\n\t\t\ttop: $header-height;\n\t\t\tleft: 0;\n\t\t\twidth: $menu-side-width;\n\t\t\theight: calc( 100% - #{$header-height} );\n\n\t\tbox-shadow: 2px 1px 3px #ddd;\n\n\t\tbackground-color: #fff;\n\n\t\t@include transition( all .3s );\n\n\t\tz-index: 10;\n\t}\n\n\n\t/* [3] Container de la page\n\t==========================================*/\n\t& > #CONTAINER{\n\t\tdisplay: flex;\n\t\tposition: absolute;\n\t\t\ttop: $header-height;\n\t\t\tleft: $menu-side-width;\n\t\t\twidth: calc( 100% - #{$menu-side-width} );\n\t\t\tmin-height: calc( 100% - #{$header-height} );\n\t\t// margin: 1em;\n\n\t\t// Flex properties\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t\tflex-wrap: wrap;\n\n\t\toverflow-x: none;\n\t\toverflow-y: auto;\n\t}\n}\n\n\n\n\n/* [4] Page de login\n=========================================================*/\n#LOGIN{\n\tdisplay: flex;\n\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: -100%;\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t// Quand la page de login est visible\n\t&.active{\n\t\tleft: 0;\n\t}\n\n\t// flex properties\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\tjustify-content: space-around;\n\talign-items: center;\n\n\n\tbackground-color: $dark-bg;\n\n\t@include transition( left .3s ease-in-out );\n\n\tz-index: 101;\n\n\n\n\n\t/* (1) Logo et nom du site */\n\t& > #login-icon{\n\t\twidth: 35em;\n\t\theight: 10em;\n\n\t\tbackground: url('/f/svg/iconv2/st') center center no-repeat;\n\t\tbackground-size: auto 100%;\n\t}\n\n\n\t/* (2) Formulaire de connexion */\n\t& > #login-form{\n\t\tdisplay: block;\n\n\n\t\t/* (2.1) Champs de texte (login/password) */\n\t\t& > input[type='text'],\n\t\t& > input[type='password'],\n\t\t& > input[type='submit']{\n\t\t\tdisplay: flex;\n\t\t\t\twidth: 20em;\n\n\t\t\tmargin: 2em 0;\n\t\t\tpadding: 1em 2em;\n\n\t\t\t// flex properties\n\t\t\tflex-direction: column;\n\t\t\tjustify-content: space-around;\n\t\t\tflex-wrap: nowrap;\n\t\t\talign-items: middle;\n\n\n\t\t\tborder-radius: 5px;\n\t\t\tborder: 1px solid lighten($theme-fg, 10);\n\n\t\t\tbackground-color: $dark-bg;\n\n\t\t\tcolor: $dark-fg-primary;\n\t\t\t// font-weight: bold;\n\t\t\tletter-spacing: .07em;\n\n\t\t\t@include transition( border .2s ease-in-out );\n\n\t\t\tcursor: default;\n\n\t\t\t// Animation de @hover/@focus\n\t\t\t&:hover,\n\t\t\t&:focus{\n\t\t\t\tborder-color: $theme-fg-primary;\n\t\t\t}\n\n\t\t}\n\n\n\t\t/* (2.2) Bouton de connexion */\n\t\t& > input[type='submit']{\n\t\t\twidth: 100%;\n\t\t\tmargin: 2em 0;\n\n\t\t\tborder: 0;\n\n\t\t\tbackground-color: $theme-fg-primary;\n\n\t\t\tcolor: $dark-fg-primary;\n\t\t\tfont-weight: bold;\n\t\t\ttext-align: left;\n\n\t\t\tcursor: pointer;\n\n\t\t\t// Animation de @hover\n\t\t\t&:hover{\n\t\t\t\tbackground-color: darken($theme-fg-primary, 10);\n\t\t\t\tbox-shadow: 0 0 1em darken($dark-bg, 10);\n\t\t\t}\n\n\t\t}\n\n\n\n\n\n\t\t/* (3) Mot de passe oublie */\n\t\t& > #lost-password{\n\t\t\tcolor: $dark-fg;\n\n\t\t\tcursor: pointer;\n\n\t\t\t// Animation de @hover\n\t\t\t&:hover{\n\t\t\t\tcolor: $theme-fg-primary;\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/* (4) Gestion de la fermeture */\n\t& > #login-close{\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\t\ttop: 2em;\n\t\t\tright: 2em;\n\t\t\tmin-width: 2em;\n\t\t\theight: 2em;\n\n\t\tbackground: url('/f/svg/back/st/container/ffffff') right center no-repeat;\n\t\tbackground-size: 1em;\n\n\t\tcolor: #fff;\n\t\tpadding-right: 2em;\n\t\tline-height: 2em;\n\t\tfont-weight: bold;\n\n\t\tcursor: pointer;\n\t}\n}\n",
"/* [1] COULEURS\n=========================================================*/\n/* (1) COULEURS DU THEME $DEFAULT */\n$theme-bg: #e8e8e8;\n$theme-bg-primary: #ffffff;\n$theme-fg: #515151;\n$theme-fg-primary: #399ced;\n\n/* (2) COULEURS DE THEME $DARK */\n$dark-bg: #313541;\n$dark-bg-primary: #29282e;\n$dark-fg: #939393;\n$dark-fg-primary: #ffffff;\n\n$header-dark: #333333;\n\n/* (3) Couleurs du theme pour la timeline */\n$timeline-color: #738394;\n$timeline-0: #399ced;\n$timeline-1: #e64e3e;\n$timeline-2: #10baa3;\n$timeline-3: #b14be7;\n$timeline-4: #053b5d;\n\n\n/* [2] DIMENSIONS\n=========================================================*/\n/* (1) Layout de base */\n$menu-side-width: 15em;\n$header-height: 4em;\n\n\n\n/* [3] Mixins\n=========================================================*/\n@mixin transform($value...) {\n transform: $value;\n\t-moz-transform: $value;\n\t-o-transform: $value;\n\t-ms-transform: $value;\n\t-webkit-transform: $value;\n}\n\n\n@mixin transition($value...) {\n -webkit-transition: $value;\n transition: $value;\n}\n\n/* [4] Functions\n=========================================================*/\n// Transforme une couleur hex en string sans le #\n@function color-str($color){\n @return str-slice(#{$color}, 2, str-length(#{$color}));\n}\n"
],
"mappings": "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",
"mappings": "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",
"names": []
}

File diff suppressed because one or more lines are too long

View File

@ -6,9 +6,9 @@
"../constants.scss"
],
"sourcesContent": [
"@import 'constants';\n\nbody{\n\n\tfont-family: 'Open Sans';\n\tfont-size: 15px;\n}\n\n\n\n#WRAPPER{\n\tdisplay: block;\n\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\tbackground-color: $theme-bg;\n\n\toverflow-x: hidden;\n\toverflow-y: auto;\n\n\tz-index: 1;\n\n\n\t/* [1] Header de la page\n\t==========================================*/\n\t& > #HEADER{\n\t\tdisplay: block;\n\t\tposition: fixed;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: calc( #{$header-height} - 1px );\n\n\t\tborder-bottom: 1px solid darken($header-dark, 10);\n\n\t\tbackground-color: $header-dark;\n\n\t\tz-index: 100;\n\n\t}\n\n\n\t/* [2] Side-Menu de la page\n\t==========================================*/\n\t// Gestion du menu\n\t& > #MENU-SIDE{\n\t\tdisplay: block;\n\t\tposition: fixed;\n\t\t\ttop: $header-height;\n\t\t\tleft: 0;\n\t\t\twidth: $menu-side-width;\n\t\t\theight: calc( 100% - #{$header-height} );\n\n\t\tbox-shadow: 2px 1px 3px #ddd;\n\n\t\tbackground-color: #fff;\n\n\t\t@include transition( all .3s );\n\n\t\tz-index: 10;\n\t}\n\n\n\t/* [3] Container de la page\n\t==========================================*/\n\t& > #CONTAINER{\n\t\tdisplay: flex;\n\t\tposition: absolute;\n\t\t\ttop: $header-height;\n\t\t\tleft: $menu-side-width;\n\t\t\twidth: calc( 100% - #{$menu-side-width} );\n\t\t\tmin-height: calc( 100% - #{$header-height} );\n\t\t// margin: 1em;\n\n\t\t// Flex properties\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t\tflex-wrap: wrap;\n\n\t\toverflow-x: none;\n\t\toverflow-y: auto;\n\t}\n}\n\n\n\n\n/* [4] Page de login\n=========================================================*/\n#LOGIN{\n\tdisplay: flex;\n\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: -100%;\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t// Quand la page de login est visible\n\t&.active{\n\t\tleft: 0;\n\t}\n\n\t// flex properties\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\tjustify-content: space-around;\n\talign-items: center;\n\n\n\tbackground-color: $dark-bg;\n\n\t@include transition( left .3s ease-in-out );\n\n\tz-index: 101;\n\n\n\n\n\t/* (1) Logo et nom du site */\n\t& > #login-icon{\n\t\twidth: 35em;\n\t\theight: 10em;\n\n\t\tbackground: url('/f/svg/iconv2/st') center center no-repeat;\n\t\tbackground-size: auto 100%;\n\t}\n\n\n\t/* (2) Formulaire de connexion */\n\t& > #login-form{\n\t\tdisplay: block;\n\n\n\t\t/* (2.1) Champs de texte (login/password) */\n\t\t& > input[type='text'],\n\t\t& > input[type='password'],\n\t\t& > input[type='submit']{\n\t\t\tdisplay: flex;\n\t\t\t\twidth: 20em;\n\n\t\t\tmargin: 2em 0;\n\t\t\tpadding: 1em 2em;\n\n\t\t\t// flex properties\n\t\t\tflex-direction: column;\n\t\t\tjustify-content: space-around;\n\t\t\tflex-wrap: nowrap;\n\t\t\talign-items: middle;\n\n\n\t\t\tborder-radius: 5px;\n\t\t\tborder: 1px solid lighten($theme-fg, 10);\n\n\t\t\tbackground-color: $dark-bg;\n\n\t\t\tcolor: $dark-fg-primary;\n\t\t\tfont-weight: bold;\n\t\t\tletter-spacing: .07em;\n\n\t\t\t@include transition( border .2s ease-in-out );\n\n\t\t\tcursor: default;\n\n\t\t\t// Animation de @hover/@focus\n\t\t\t&:hover,\n\t\t\t&:focus{\n\t\t\t\tborder-color: $theme-fg-primary;\n\t\t\t}\n\n\t\t}\n\n\n\t\t/* (2.2) Bouton de connexion */\n\t\t& > input[type='submit']{\n\t\t\twidth: 100%;\n\t\t\tmargin: 2em 0;\n\n\t\t\tborder: 0;\n\n\t\t\tbackground-color: $theme-fg-primary;\n\n\t\t\tcolor: $dark-fg-primary;\n\t\t\tfont-weight: bold;\n\t\t\ttext-align: left;\n\n\t\t\tcursor: pointer;\n\n\t\t\t// Animation de @hover\n\t\t\t&:hover{\n\t\t\t\tbackground-color: darken($theme-fg-primary, 10);\n\t\t\t\tbox-shadow: 0 0 1em darken($dark-bg, 10);\n\t\t\t}\n\n\t\t}\n\n\n\n\n\n\t\t/* (3) Mot de passe oublie */\n\t\t& > #lost-password{\n\t\t\tcolor: $dark-fg;\n\n\t\t\tcursor: pointer;\n\n\t\t\t// Animation de @hover\n\t\t\t&:hover{\n\t\t\t\tcolor: $theme-fg-primary;\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/* (4) Gestion de la fermeture */\n\t& > #login-close{\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\t\ttop: 2em;\n\t\t\tright: 2em;\n\t\t\tmin-width: 2em;\n\t\t\theight: 2em;\n\n\t\tbackground: url('/f/svg/back/st/container/ffffff') right center no-repeat;\n\t\tbackground-size: 1em;\n\n\t\tcolor: #fff;\n\t\tpadding-right: 2em;\n\t\tline-height: 2em;\n\t\tfont-weight: bold;\n\n\t\tcursor: pointer;\n\t}\n}\n",
"@import 'constants';\n\nbody{\n\n\tfont-family: 'Open Sans';\n\tfont-size: 15px;\n}\n\n\n\n#WRAPPER{\n\tdisplay: block;\n\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\tbackground-color: $theme-bg;\n\n\toverflow-x: hidden;\n\toverflow-y: auto;\n\n\tz-index: 1;\n\n\n\t/* [1] Header de la page\n\t==========================================*/\n\t& > #HEADER{\n\t\tdisplay: block;\n\t\tposition: fixed;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: calc( #{$header-height} - 1px );\n\n\t\tborder-bottom: 1px solid darken($header-dark, 10);\n\n\t\tbackground-color: $header-dark;\n\n\t\tz-index: 100;\n\n\t}\n\n\n\t/* [2] Side-Menu de la page\n\t==========================================*/\n\t// Gestion du menu\n\t& > #MENU-SIDE{\n\t\tdisplay: block;\n\t\tposition: fixed;\n\t\t\ttop: $header-height;\n\t\t\tleft: 0;\n\t\t\twidth: $menu-side-width;\n\t\t\theight: calc( 100% - #{$header-height} );\n\n\t\tbox-shadow: 2px 1px 3px #ddd;\n\n\t\tbackground-color: #fff;\n\n\t\t@include transition( all .3s );\n\n\t\tz-index: 10;\n\t}\n\n\n\t/* [3] Container de la page\n\t==========================================*/\n\t& > #CONTAINER{\n\t\tdisplay: flex;\n\t\tposition: absolute;\n\t\t\ttop: $header-height;\n\t\t\tleft: $menu-side-width;\n\t\t\twidth: calc( 100% - #{$menu-side-width} );\n\t\t\tmin-height: calc( 100% - #{$header-height} );\n\t\t// margin: 1em;\n\n\t\t// Flex properties\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t\tflex-wrap: wrap;\n\n\t\toverflow-x: none;\n\t\toverflow-y: auto;\n\t}\n}\n\n\n\n\n/* [4] Page de login\n=========================================================*/\n#LOGIN{\n\tdisplay: flex;\n\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: -100%;\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t// Quand la page de login est visible\n\t&.active{\n\t\tleft: 0;\n\t}\n\n\t// flex properties\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\tjustify-content: space-around;\n\talign-items: center;\n\n\n\tbackground-color: $dark-bg;\n\n\t@include transition( left .3s ease-in-out );\n\n\tz-index: 101;\n\n\n\n\n\t/* (1) Logo et nom du site */\n\t& > #login-icon{\n\t\twidth: 35em;\n\t\theight: 10em;\n\n\t\tbackground: url('/f/svg/iconv2/st') center center no-repeat;\n\t\tbackground-size: auto 100%;\n\t}\n\n\n\t/* (2) Formulaire de connexion */\n\t& > #login-form{\n\t\tdisplay: block;\n\n\n\t\t/* (2.1) Champs de texte (login/password) */\n\t\t& > input[type='text'],\n\t\t& > input[type='password'],\n\t\t& > input[type='submit']{\n\t\t\tdisplay: flex;\n\t\t\t\twidth: 20em;\n\n\t\t\tmargin: 2em 0;\n\t\t\tpadding: 1em 2em;\n\n\t\t\t// flex properties\n\t\t\tflex-direction: column;\n\t\t\tjustify-content: space-around;\n\t\t\tflex-wrap: nowrap;\n\t\t\talign-items: middle;\n\n\n\t\t\tborder-radius: 5px;\n\t\t\tborder: 1px solid lighten($theme-fg, 10);\n\n\t\t\tbackground-color: $dark-bg;\n\n\t\t\tcolor: $dark-fg-primary;\n\t\t\t// font-weight: bold;\n\t\t\tletter-spacing: .07em;\n\n\t\t\t@include transition( border .2s ease-in-out );\n\n\t\t\tcursor: default;\n\n\t\t\t// Animation de @hover/@focus\n\t\t\t&:hover,\n\t\t\t&:focus{\n\t\t\t\tborder-color: $theme-fg-primary;\n\t\t\t}\n\n\t\t}\n\n\n\t\t/* (2.2) Bouton de connexion */\n\t\t& > input[type='submit']{\n\t\t\twidth: 100%;\n\t\t\tmargin: 2em 0;\n\n\t\t\tborder: 0;\n\n\t\t\tbackground-color: $theme-fg-primary;\n\n\t\t\tcolor: $dark-fg-primary;\n\t\t\tfont-weight: bold;\n\t\t\ttext-align: left;\n\n\t\t\tcursor: pointer;\n\n\t\t\t// Animation de @hover\n\t\t\t&:hover{\n\t\t\t\tbackground-color: darken($theme-fg-primary, 10);\n\t\t\t\tbox-shadow: 0 0 1em darken($dark-bg, 10);\n\t\t\t}\n\n\t\t}\n\n\n\n\n\n\t\t/* (3) Mot de passe oublie */\n\t\t& > #lost-password{\n\t\t\tcolor: $dark-fg;\n\n\t\t\tcursor: pointer;\n\n\t\t\t// Animation de @hover\n\t\t\t&:hover{\n\t\t\t\tcolor: $theme-fg-primary;\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/* (4) Gestion de la fermeture */\n\t& > #login-close{\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\t\ttop: 2em;\n\t\t\tright: 2em;\n\t\t\tmin-width: 2em;\n\t\t\theight: 2em;\n\n\t\tbackground: url('/f/svg/back/st/container/ffffff') right center no-repeat;\n\t\tbackground-size: 1em;\n\n\t\tcolor: #fff;\n\t\tpadding-right: 2em;\n\t\tline-height: 2em;\n\t\tfont-weight: bold;\n\n\t\tcursor: pointer;\n\t}\n}\n",
"/* [1] COULEURS\n=========================================================*/\n/* (1) COULEURS DU THEME $DEFAULT */\n$theme-bg: #e8e8e8;\n$theme-bg-primary: #ffffff;\n$theme-fg: #515151;\n$theme-fg-primary: #399ced;\n\n/* (2) COULEURS DE THEME $DARK */\n$dark-bg: #313541;\n$dark-bg-primary: #29282e;\n$dark-fg: #939393;\n$dark-fg-primary: #ffffff;\n\n$header-dark: #333333;\n\n/* (3) Couleurs du theme pour la timeline */\n$timeline-color: #738394;\n$timeline-0: #399ced;\n$timeline-1: #e64e3e;\n$timeline-2: #10baa3;\n$timeline-3: #b14be7;\n$timeline-4: #053b5d;\n\n\n/* [2] DIMENSIONS\n=========================================================*/\n/* (1) Layout de base */\n$menu-side-width: 15em;\n$header-height: 4em;\n\n\n\n/* [3] Mixins\n=========================================================*/\n@mixin transform($value...) {\n transform: $value;\n\t-moz-transform: $value;\n\t-o-transform: $value;\n\t-ms-transform: $value;\n\t-webkit-transform: $value;\n}\n\n\n@mixin transition($value...) {\n -webkit-transition: $value;\n transition: $value;\n}\n\n/* [4] Functions\n=========================================================*/\n// Transforme une couleur hex en string sans le #\n@function color-str($color){\n @return str-slice(#{$color}, 2, str-length(#{$color}));\n}\n"
],
"mappings": "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",
"mappings": "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",
"names": []
}

104
css/notif.scss Normal file
View File

@ -0,0 +1,104 @@
body > #notification-container{
display: flex;
position: absolute;
bottom: 0;
left: 0;
width: 100%;
flex-direction: column;
flex-wrap: nowrap;
z-index: 200;
pointer-events: none;
.notification-element{
display: block;
position: relative;
margin: .2em auto;
padding: 0 1em;
border-radius: 3px;
border: 1px solid #ddd;
border-bottom: 1px solid darken(#ddd, 10);
box-shadow: inset 0 0 1em #eee;
background-color: #fff;
pointer-events: all;
cursor: default;
// ECARTEMENT DU BOTTOM POUR LE DERNIER
&:last-child{
margin-bottom: 1em;
}
// ANIMATION DE fadeIn + fadeOut
transition: opacity .5s ease-in-out;
opacity: 0;
&.notification-visible{
opacity: 1;
}
// ANIMATION DE @HOVER
&:hover{
box-shadow: inset 0 0 1em #eee, 0 0 1em #555;
}
// TITRE ET BOULE DE COULEUR
strong:first-child{
text-transform: uppercase;
padding-left: 1.5em;
&:before{
content: '';
display: inline-block;
position: absolute;
top: 1.2em;
left: 1em;
width: .9em;
height: .9em;
border-radius: 50% / 50%;
box-shadow: inset -1px 1px 2px rgba(50, 50, 50, .5);
}
}
// DIFFERENTS THEMES
// WARNING
&[data-warning]{
border-color: #dd6a45;
border-bottom-color: darken(#dd6a45, 10);
strong:first-child{ &:before{ background-color: #dd6a45; } }
}
// INFO
&[data-info]{
border-color: #2195da;
border-bottom-color: darken(#2195da, 10);
strong:first-child{ &:before{ background-color: #2195da; } }
}
// SUCCESS
&[data-success]{
border-color: #5fca4a;
border-bottom-color: darken(#5fca4a, 10);
strong:first-child{ &:before{ background-color: #5fca4a; } }
}
// ERROR
&[data-error]{
border-color: #d94747;
border-bottom-color: darken(#d94747, 10);
strong:first-child{ &:before{ background-color: #d94747; } }
}
}
}

94
css/notif/expanded.css Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,12 @@
{
"version": 3,
"file": "expanded.css",
"sources": [
"../notif.scss"
],
"sourcesContent": [
"body > #notification-container{\n\n display: flex;\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n\n flex-direction: column;\n flex-wrap: nowrap;\n\n z-index: 200;\n pointer-events: none;\n\n\n .notification-element{\n display: block;\n position: relative;\n margin: .2em auto;\n padding: 0 1em;\n\n border-radius: 3px;\n border: 1px solid #ddd;\n border-bottom: 1px solid darken(#ddd, 10);\n box-shadow: inset 0 0 1em #eee;\n\n background-color: #fff;\n\n pointer-events: all;\n cursor: default;\n\n // ECARTEMENT DU BOTTOM POUR LE DERNIER\n &:last-child{\n margin-bottom: 1em;\n }\n\n\n // ANIMATION DE fadeIn + fadeOut\n transition: opacity .5s ease-in-out;\n opacity: 0;\n\n &.notification-visible{\n opacity: 1;\n }\n\n\n // ANIMATION DE @HOVER\n &:hover{\n box-shadow: inset 0 0 1em #eee, 0 0 1em #555;\n }\n\n\n\n // TITRE ET BOULE DE COULEUR\n strong:first-child{\n\n text-transform: uppercase;\n padding-left: 1.5em;\n\n &:before{\n content: '';\n display: inline-block;\n position: absolute;\n top: 1.2em;\n left: 1em;\n width: .9em;\n height: .9em;\n\n border-radius: 50% / 50%;\n box-shadow: inset -1px 1px 2px rgba(50, 50, 50, .5);\n }\n\n }\n\n // DIFFERENTS THEMES\n // WARNING\n &[data-warning]{\n border-color: #dd6a45;\n border-bottom-color: darken(#dd6a45, 10);\n strong:first-child{ &:before{ background-color: #dd6a45; } }\n }\n // INFO\n &[data-info]{\n border-color: #2195da;\n border-bottom-color: darken(#2195da, 10);\n strong:first-child{ &:before{ background-color: #2195da; } }\n }\n // SUCCESS\n &[data-success]{\n border-color: #5fca4a;\n border-bottom-color: darken(#5fca4a, 10);\n strong:first-child{ &:before{ background-color: #5fca4a; } }\n }\n // ERROR\n &[data-error]{\n border-color: #d94747;\n border-bottom-color: darken(#d94747, 10);\n strong:first-child{ &:before{ background-color: #d94747; } }\n }\n\n\n }\n\n}\n"
],
"mappings": "AAAA,IAAI,GAAG,uBAAuB,CAAA;EAE1B,OAAO,EAAE,IAAK;EACd,QAAQ,EAAE,QAAS;EACf,MAAM,EAAE,CAAE;EACV,IAAI,EAAE,CAAE;EACR,KAAK,EAAE,IAAK;EAEhB,cAAc,EAAE,MAAO;EACvB,SAAS,EAAE,MAAO;EAElB,OAAO,EAAE,GAAI;EACb,cAAc,EAAE,IAAK;CA2FxB;;AAvGD,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,CAAA;EACjB,OAAO,EAAE,KAAM;EACf,QAAQ,EAAE,QAAS;EACf,MAAM,EAAE,SAAU;EAClB,OAAO,EAAE,KAAM;EAEnB,aAAa,EAAE,GAAI;EACnB,MAAM,EAAE,cAAe;EACvB,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,OAAM;EAC/B,UAAU,EAAE,kBAAmB;EAE/B,gBAAgB,EAAE,IAAK;EAEvB,cAAc,EAAE,GAAI;EACpB,MAAM,EAAE,OAAQ;EAShB,UAAU,EAAE,uBAAwB;EACpC,OAAO,EAAE,CAAE;CA8Dd;;AArGL,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,AAiBhB,WAAW,CAAA;EACR,aAAa,EAAE,GAAI;CACtB;;AAlCT,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,AA0BhB,qBAAqB,CAAA;EAClB,OAAO,EAAE,CAAE;CACd;;AA3CT,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,AAgChB,MAAM,CAAA;EACH,UAAU,EAAE,gCAAiC;CAChD;;AAjDT,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,CAuCjB,MAAM,AAAA,YAAY,CAAA;EAEd,cAAc,EAAE,SAAU;EAC1B,YAAY,EAAE,KAAM;CAevB;;AAxET,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,CAuCjB,MAAM,AAAA,YAAY,AAKb,OAAO,CAAA;EACJ,OAAO,EAAE,EAAG;EACZ,OAAO,EAAE,YAAa;EACtB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,KAAM;EACX,IAAI,EAAE,GAAI;EACV,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EAEb,aAAa,EAAE,SAAU;EACzB,UAAU,EAAE,KAAK,CAAE,IAAG,CAAC,GAAG,CAAC,GAAG,CAAC,qBAAI;CACtC;;AAtEb,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,CA6DhB,AAAA,YAAC,AAAA,EAAa;EACX,YAAY,EAAE,OAAQ;EACtB,mBAAmB,EAAE,OAAM;CAE9B;;AAhFT,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,CA6DhB,AAAA,YAAC,AAAA,EAGE,MAAM,AAAA,YAAY,AAAG,OAAO,CAAA;EAAE,gBAAgB,EAAE,OAAQ;CAAI;;AA/ExE,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,CAmEhB,AAAA,SAAC,AAAA,EAAU;EACR,YAAY,EAAE,OAAQ;EACtB,mBAAmB,EAAE,OAAM;CAE9B;;AAtFT,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,CAmEhB,AAAA,SAAC,AAAA,EAGE,MAAM,AAAA,YAAY,AAAG,OAAO,CAAA;EAAE,gBAAgB,EAAE,OAAQ;CAAI;;AArFxE,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,CAyEhB,AAAA,YAAC,AAAA,EAAa;EACX,YAAY,EAAE,OAAQ;EACtB,mBAAmB,EAAE,OAAM;CAE1B;;AA5Fb,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,CAyEhB,AAAA,YAAC,AAAA,EAGE,MAAM,AAAA,YAAY,AAAG,OAAO,CAAA;EAAE,gBAAgB,EAAE,OAAQ;CAAI;;AA3FxE,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,CA+EhB,AAAA,UAAC,AAAA,EAAW;EACT,YAAY,EAAE,OAAQ;EACtB,mBAAmB,EAAE,OAAM;CAE9B;;AAlGT,IAAI,GAAG,uBAAuB,CAe1B,qBAAqB,CA+EhB,AAAA,UAAC,AAAA,EAGE,MAAM,AAAA,YAAY,AAAG,OAAO,CAAA;EAAE,gBAAgB,EAAE,OAAQ;CAAI",
"names": []
}

3
css/notif/min.css Normal file

File diff suppressed because one or more lines are too long

12
css/notif/min.css.map Normal file
View File

@ -0,0 +1,12 @@
{
"version": 3,
"file": "min.css",
"sources": [
"../notif.scss"
],
"sourcesContent": [
"body > #notification-container{\n\n display: flex;\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n\n flex-direction: column;\n flex-wrap: nowrap;\n\n z-index: 200;\n pointer-events: none;\n\n\n .notification-element{\n display: block;\n position: relative;\n margin: .2em auto;\n padding: 0 1em;\n\n border-radius: 3px;\n border: 1px solid #ddd;\n border-bottom: 1px solid darken(#ddd, 10);\n box-shadow: inset 0 0 1em #eee;\n\n background-color: #fff;\n\n pointer-events: all;\n cursor: default;\n\n // ECARTEMENT DU BOTTOM POUR LE DERNIER\n &:last-child{\n margin-bottom: 1em;\n }\n\n\n // ANIMATION DE fadeIn + fadeOut\n transition: opacity .5s ease-in-out;\n opacity: 0;\n\n &.notification-visible{\n opacity: 1;\n }\n\n\n // ANIMATION DE @HOVER\n &:hover{\n box-shadow: inset 0 0 1em #eee, 0 0 1em #555;\n }\n\n\n\n // TITRE ET BOULE DE COULEUR\n strong:first-child{\n\n text-transform: uppercase;\n padding-left: 1.5em;\n\n &:before{\n content: '';\n display: inline-block;\n position: absolute;\n top: 1.2em;\n left: 1em;\n width: .9em;\n height: .9em;\n\n border-radius: 50% / 50%;\n box-shadow: inset -1px 1px 2px rgba(50, 50, 50, .5);\n }\n\n }\n\n // DIFFERENTS THEMES\n // WARNING\n &[data-warning]{\n border-color: #dd6a45;\n border-bottom-color: darken(#dd6a45, 10);\n strong:first-child{ &:before{ background-color: #dd6a45; } }\n }\n // INFO\n &[data-info]{\n border-color: #2195da;\n border-bottom-color: darken(#2195da, 10);\n strong:first-child{ &:before{ background-color: #2195da; } }\n }\n // SUCCESS\n &[data-success]{\n border-color: #5fca4a;\n border-bottom-color: darken(#5fca4a, 10);\n strong:first-child{ &:before{ background-color: #5fca4a; } }\n }\n // ERROR\n &[data-error]{\n border-color: #d94747;\n border-bottom-color: darken(#d94747, 10);\n strong:first-child{ &:before{ background-color: #d94747; } }\n }\n\n\n }\n\n}\n"
],
"mappings": "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",
"names": []
}

76
doc/migrate.py Executable file
View File

@ -0,0 +1,76 @@
# -*- Encoding: utf-8 -*- #
# [0.0] Import
#=======================================================#
import os; # ls, etc
import re; # regex
# [0.1] Dépendances
#=======================================================#
def filter(files, filter):
filtered = [];
for file in files:
if( re.search('\.'+filter+'$', file) != None ):
filtered.append(file);
return filtered;
# [1] On récupère la racine souhaitée
#=======================================================#
new_root = raw_input('New root: ');
print "Validate '%s'" % new_root,
root_validate = raw_input('[y/n] ? ');
# (1) Non validation de la route -> on quitte #
if( root_validate != 'y' ):
print 'Exiting.\n';
exit();
# [2] On récupère tous les fichiers
#=======================================================#
all_files = [];
for (dir, _, files) in os.walk('.'):
for f in files:
path = os.path.join(dir, f)
if os.path.exists(path):
all_files.append(path);
# [3] On remplace dans tous les fichiers
#=======================================================#
# (1) Pour chaque fichier #
for filename in filter(all_files,'php')+filter(all_files,'js')+filter(all_files,'scss')+filter(all_files, 'css'):
print '%s ... ' % filename,;
content = [];
# (2) On lit le fichier et récupère toutes les lignes #
with open(filename, 'r') as f:
content = f.readlines();
# (3) Pour chaque ligne, on remplace #
for (i, line) in enumerate(content):
newline = re.sub(
'(?P<bef>["\'])([^\']+/?)(?P<aft>f/[^\'.]+["\'])',
'\g<bef>/'+ new_root +'/\g<aft>',
line
);
content[i] = newline;
# (4) On écrit ce qu'on a modifié #
with open(filename, 'w') as f:
for line in content:
f.write(line);
print ' done';

54
doc/phone_log.json Normal file
View File

@ -0,0 +1,54 @@
{
"call_log": [
{ "contact":"1", "date":"2014-05-28T14:43:25", "duration":"0", "direction":"INCOMING", "type":"SMS" },
{ "contact":"2", "date":"2014-05-28T14:43:25", "duration":"0", "direction":"INCOMING", "type":"SMS" },
{ "contact":"3", "date":"2014-05-28T14:43:25", "duration":"0", "direction":"INCOMING", "type":"SMS" },
{ "contact":"4", "date":"2014-05-28T14:43:25", "duration":"0", "direction":"INCOMING", "type":"SMS" },
{ "contact":"5", "date":"2014-05-28T14:43:25", "duration":"0", "direction":"INCOMING", "type":"SMS" },
{ "contact":"6", "date":"2014-05-28T14:43:25", "duration":"0", "direction":"INCOMING", "type":"SMS" },
{ "contact":"7", "date":"2014-05-28T14:43:25", "duration":"0", "direction":"INCOMING", "type":"SMS" },
{ "contact":"8", "date":"2014-05-28T14:43:25", "duration":"0", "direction":"INCOMING", "type":"SMS" },
{ "contact":"9", "date":"2014-05-28T14:43:25", "duration":"0", "direction":"INCOMING", "type":"SMS" },
{ "contact":"10", "date":"2014-05-28T14:43:25", "duration":"0", "direction":"INCOMING", "type":"SMS" },
{ "contact":"11", "date":"2014-05-28T14:43:25", "duration":"0", "direction":"INCOMING", "type":"SMS" },
{ "contact":"12", "date":"2014-02-28T15:00:10", "duration":"125", "direction":"OUTGOING", "type":"PHONE" },
{ "contact":"13", "date":"2014-02-15T23:06:46", "duration":"0", "direction":"INGOING", "type":"PHONE" },
{ "contact":"14", "date":"2014-02-15T23:06:18", "duration":"0", "direction":"INGOING", "type":"PHONE" },
{ "contact":"15", "date":"2014-02-15T21:08:34", "duration":"349", "direction":"OUTGOING", "type":"PHONE" },
{ "contact":"16", "date":"2014-02-15T20:51:38", "duration":"0", "direction":"OUTGOING", "type":"PHONE" },
{ "contact":"17", "date":"2014-02-15T19:06:33", "duration":"657", "direction":"OUTGOING", "type":"PHONE" },
{ "contact":"18", "date":"2014-02-15T19:06:33", "duration":"657", "direction":"OUTGOING", "type":"PHONE" },
{ "contact":"19", "date":"2014-02-15T19:06:33", "duration":"657", "direction":"OUTGOING", "type":"PHONE" },
{ "contact":"20", "date":"2014-02-15T19:06:33", "duration":"657", "direction":"OUTGOING", "type":"PHONE" },
{ "contact":"21", "date":"2014-02-15T17:24:18", "duration":"276", "direction":"OUTGOING", "type":"PHONE" },
{ "contact":"22", "date":"2014-02-15T16:34:29", "duration":"36", "direction":"OUTGOING", "type":"PHONE" }
],
"contacts": [
{ "contact":"1", "number":"0502030405", "name":"", "sexe":"0", "age":"5", "studies":"1", "reltype":"inconnu", "dist":"5" },
{ "contact":"2", "number":"0502030561", "name":"", "sexe":"0", "age":"10", "studies":"2", "reltype":"inconnu", "dist":"5+" },
{ "contact":"3", "number":"0502030717", "name":"", "sexe":"0", "age":"15", "studies":"3", "reltype":"inconnu", "dist":"5+" },
{ "contact":"4", "number":"0502030873", "name":"", "sexe":"0", "age":"20", "studies":"4", "reltype":"inconnu", "dist":"5+" },
{ "contact":"5", "number":"0502031029", "name":"", "sexe":"0", "age":"25", "studies":"5", "reltype":"inconnu", "dist":"5" },
{ "contact":"6", "number":"0502031185", "name":"", "sexe":"0", "age":"30", "studies":"6", "reltype":"inconnu", "dist":"15" },
{ "contact":"7", "number":"0502031341", "name":"", "sexe":"0", "age":"35", "studies":"7", "reltype":"inconnu", "dist":"15" },
{ "contact":"8", "number":"0502031497", "name":"", "sexe":"0", "age":"40", "studies":"8", "reltype":"inconnu", "dist":"15" },
{ "contact":"9", "number":"0502031653", "name":"", "sexe":"0", "age":"45", "studies":"9", "reltype":"inconnu", "dist":"5" },
{ "contact":"10", "number":"0502031809", "name":"", "sexe":"0", "age":"50", "studies":"10", "reltype":"inconnu", "dist":"5" },
{ "contact":"11", "number":"0502031965", "name":"", "sexe":"0", "age":"55", "studies":"11", "reltype":"inconnu", "dist":"15+" },
{ "contact":"12", "number":"0502032121", "name":"", "sexe":"0", "age":"60", "studies":"12", "reltype":"inconnu", "dist":"15+" },
{ "contact":"13", "number":"0502032277", "name":"", "sexe":"0", "age":"65", "studies":"13", "reltype":"inconnu", "dist":"15+" },
{ "contact":"14", "number":"0502032433", "name":"", "sexe":"0", "age":"70", "studies":"14", "reltype":"inconnu", "dist":"60+" },
{ "contact":"15", "number":"0502032589", "name":"", "sexe":"0", "age":"75", "studies":"15", "reltype":"inconnu", "dist":"60+" },
{ "contact":"16", "number":"0502032745", "name":"", "sexe":"0", "age":"80", "studies":"16", "reltype":"inconnu", "dist":"60+" },
{ "contact":"17", "number":"0502032901", "name":"", "sexe":"0", "age":"85", "studies":"17", "reltype":"inconnu", "dist":"60+" },
{ "contact":"18", "number":"0502033057", "name":"", "sexe":"0", "age":"90", "studies":"18", "reltype":"inconnu", "dist":"60+" },
{ "contact":"19", "number":"0502033213", "name":"", "sexe":"0", "age":"95", "studies":"19", "reltype":"inconnu", "dist":"5" },
{ "contact":"20", "number":"0502033369", "name":"", "sexe":"0", "age":"100", "studies":"20", "reltype":"inconnu", "dist":"5" },
{ "contact":"21", "number":"0502033525", "name":"", "sexe":"0", "age":"105", "studies":"21", "reltype":"inconnu", "dist":"5" },
{ "contact":"22", "number":"0502033681", "name":"", "sexe":"0", "age":"110", "studies":"22", "reltype":"inconnu", "dist":"5" }
]
}

1001
doc/sample-long.xml Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,6 @@
var DOM={WRAPPER:$("body > #WRAPPER"),HEADER:$("body > #WRAPPER > #HEADER"),MENUSIDE:$("body > #WRAPPER > #MENU-SIDE"),CONTAINER:$("body > #WRAPPER > #CONTAINER")},pageManager;api=new APIClass("/api/");
var DOM={WRAPPER:$("body > #WRAPPER"),HEADER:$("body > #WRAPPER > #HEADER"),MENUSIDE:$("body > #WRAPPER > #MENU-SIDE"),CONTAINER:$("body > #WRAPPER > #CONTAINER")},pageManager;api=new APIClass("/api/");Notification=new NotificationClass($("#notification-container"));Notification.defaultTimeout=4E3;
Notification.errorCodes={"-1":"Erreur de r\u00e9seau, veuillez recharger la page et r\u00e9essayer",0:"Erreur interne",1:"Erreur interne",2:"Erreur interne",3:"Le fichier est introuvable",4:"Erreur interne",5:"Erreur interne",6:"Erreur interne",7:"Erreur interne",8:"Erreur interne",9:"Certaines donn\u00e9es sont manquantes",10:"Erreur interne",11:"Erreur interne",12:"Erreur interne",13:"Erreur interne",14:"Erreur interne",15:"Erreur interne",16:"Vous n'avez pas la permission d'effectuer cette action",
17:"Le t\u00e9l\u00e9chargement a \u00e9chou\u00e9",18:"Le fichier est invalide (format incorrect)"};lsi.setStorage(sessionStorage);
function navSubMenu(a){var c=$("#MENU-SIDE > span[data-link="+pageManager.page+'] + div.sub > span[data-sublink="'+pageManager.vars[0]+'"]'),b=null,b=a instanceof Element?a:null,b="string"==typeof a?$("#MENU-SIDE > span[data-link="+pageManager.page+'] + div.sub > span[data-sublink="'+a+'"]'):b,b=null==b?$("#MENU-SIDE > span[data-link="+pageManager.page+"] + div.sub > span[data-sublink]"):b;if(null==b)return!1;null!=c&&c.remClass("active");c=$$("#CONTAINER > section[data-sublink].active");for(a=0;a<
c.length;a++)c[a].remClass("active");if(null!=b)for(b.addClass("active"),c=$$('#CONTAINER > section[data-sublink="'+b.getData("sublink")+'"]'),a=0;a<c.length;a++)c[a].addClass("active");if(!b.getData("sublink"))return!1;a=pageManager.vars[0]!=b.getData("sublink");pageManager.vars[0]=b.getData("sublink");a&&pageManager.updateURL()}
function navMenu(a){var c=$('#WRAPPER > #MENU-SIDE > span[data-link="'+pageManager.page+'"]'),b=null,b=a instanceof Element?a:null,b="string"==typeof a?$('#WRAPPER > #MENU-SIDE > span[data-link="'+a+'"]'):b,b=null==b?$('#WRAPPER > #MENU-SIDE > span[data-link="'+pageManager.pagelist[0]+'"]'):b;if(null==b)return!1;null!=c&&c.remClass("active");null!=b&&b.addClass("active");b.getData("link")&&(DOM.HEADER.addClass("loading"),pageManager.setPage(b.getData("link")),pageManager.activeXHR.addEventListener("loadend",

View File

@ -12,6 +12,38 @@ var pageManager;
// On cree une instance de l'api
api = new APIClass('/api/');
// On crée une instance du gestionnaire des notifications
Notification = new NotificationClass( $('#notification-container') );
// Temps d'une notification : ~4s
Notification.defaultTimeout = 4000;
// Définition des codes d'erreurs
Notification.errorCodes = {
'-1': 'Erreur de réseau, veuillez recharger la page et réessayer',
0: 'Erreur interne',
1: 'Erreur interne',
2: 'Erreur interne',
3: 'Le fichier est introuvable',
4: 'Erreur interne',
5: 'Erreur interne',
6: 'Erreur interne',
7: 'Erreur interne',
8: 'Erreur interne',
9: 'Certaines données sont manquantes',
10: 'Erreur interne',
11: 'Erreur interne',
12: 'Erreur interne',
13: 'Erreur interne',
14: 'Erreur interne',
15: 'Erreur interne',
16: 'Vous n\'avez pas la permission d\'effectuer cette action',
17: 'Le téléchargement a échoué',
18: 'Le fichier est invalide (format incorrect)'
};
// On définit qu'on veut utiliser le 'sessionStorage'
lsi.setStorage(sessionStorage);

File diff suppressed because one or more lines are too long

View File

@ -46,12 +46,9 @@ miniFicheBuilder.setLayout(
"<article class='mini-fiche-relation'>\n"+
"\t<input type='hidden' data-name='uid' value='@uid'>\n"+
"\t<input type='hidden' data-name='firstname' value='@firstname'>\n"+
"\t<input type='hidden' data-name='lastname' value='@lastname'>\n"+
"\t<input type='hidden' data-name='username' value='@username'>\n"+
"\t<span data-space></span>\n"+
"\t<h4 data-icon='a' class='color2'>@firstname @lastname @username</h4>\n"+
"\t<h4 data-icon='a' class='color2'>@name</h4>\n"+
"\t<h5 class='nobold color0'>"+
"\t\t@countcall appels"+
@ -61,8 +58,8 @@ miniFicheBuilder.setLayout(
"\t</h5>"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<input type='radio' name='sexe_min_@uid' data-name='sexe' id='sexeH_min_@uid'><label for='sexeH_min_@uid'>Homme</label>\n"+
"\t\t&nbsp&nbsp&nbsp<input type='radio' name='sexe_min_@uid' data-name='sexe' id='sexeF_min_@uid'><label for='sexeF_min_@uid'>Femme</label>\n"+
"\t\t<input type='radio' name='sexe_min_@uid' data-name='sexe' id='sexeH_min_@uid' value='H'><label for='sexeH_min_@uid'>Homme</label>\n"+
"\t\t&nbsp&nbsp&nbsp<input type='radio' name='sexe_min_@uid' data-name='sexe' id='sexeF_min_@uid' value='F'><label for='sexeF_min_@uid'>Femme</label>\n"+
"\t</h5>\n"+
@ -126,24 +123,26 @@ miniFicheBuilder.setLayout(
"\t<h4 data-icon='a'>Type de relation</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype0_mini_@uid'><label for='reltype0_mini_@uid'>Père, mère ou équivalent</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype1_mini_@uid'><label for='reltype1_mini_@uid'>Frère ou soeur</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype2_mini_@uid'><label for='reltype2_mini_@uid'>Autre membre de la famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype3_mini_@uid'><label for='reltype3_mini_@uid'>Relation amoureuse</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype4_mini_@uid'><label for='reltype4_mini_@uid'>Collègue</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype5_mini_@uid'><label for='reltype5_mini_@uid'>Voisin</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype6_mini_@uid'><label for='reltype6_mini_@uid'>Ami</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype7_mini_@uid'><label for='reltype7_mini_@uid'>Copain</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype8_mini_@uid'><label for='reltype8_mini_@uid'>Autre : <input type='text' data-name='reltypeSpecial' placeholder='coéquipier de tennis, ..' value='@reltypespecial'></label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype0_mini_@uid' value='0'><label for='reltype0_mini_@uid'>Père, mère ou équivalent</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype1_mini_@uid' value='1'><label for='reltype1_mini_@uid'>Frère ou soeur</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype2_mini_@uid' value='2'><label for='reltype2_mini_@uid'>Autre membre de la famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype3_mini_@uid' value='3'><label for='reltype3_mini_@uid'>Relation amoureuse</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype4_mini_@uid' value='4'><label for='reltype4_mini_@uid'>Collègue</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype5_mini_@uid' value='5'><label for='reltype5_mini_@uid'>Voisin</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype6_mini_@uid' value='6'><label for='reltype6_mini_@uid'>Ami</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype7_mini_@uid' value='7'><label for='reltype7_mini_@uid'>Ami proche</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype8_mini_@uid' value='8'><label for='reltype8_mini_@uid'>Relation de service (médecin, ...)</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype9_mini_@uid' value='9'><label for='reltype9_mini_@uid'>Inconnu</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype10_mini_@uid' value='10'><label for='reltype10_mini_@uid'>Autre : <input type='text' data-name='reltypeSpecial' placeholder='coéquipier de tennis, ..' value='@reltypespecial'></label><br>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tOù habite t-elle/il ?<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locA_min_@uid'><label for='locA_min_@uid'>de 5 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locB_min_@uid'><label for='locB_min_@uid'>de 5 à 15 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locC_min_@uid'><label for='locC_min_@uid'>de 15 à 60 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locD_min_@uid'><label for='locD_min_@uid'>+ d'une heure</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locA_min_@uid' value='0'><label for='locA_min_@uid'>de 5 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locB_min_@uid' value='1'><label for='locB_min_@uid'>de 5 à 15 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locC_min_@uid' value='2'><label for='locC_min_@uid'>de 15 à 60 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locD_min_@uid' value='3'><label for='locD_min_@uid'>+ d'une heure</label><br>\n"+
"\t</h5>\n"+
"</article>");
@ -198,11 +197,8 @@ ficheBuilder.setLayout(
"\t<input type='hidden' data-name='contact' value='@contact'>\n"+
"\t<input type='hidden' data-name='uid' value='@uid'>\n"+
"\t<input type='hidden' data-name='firstname' value='@firstname'>\n"+
"\t<input type='hidden' data-name='lastname' value='@lastname'>\n"+
"\t<input type='hidden' data-name='username' value='@username'>\n"+
"\t<h4 data-icon='a' class='color2'>@firstname @lastname @username</h4>\n"+
"\t<h4 data-icon='a' class='color2'>@name</h4>\n"+
"\t<h5 class='nobold color0'>"+
"\t\t@countcall appels"+
@ -212,8 +208,8 @@ ficheBuilder.setLayout(
"\t</h5>"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<input type='radio' name='sexe_@uid' data-name='sexe' id='sexeH_@uid'><label for='sexeH_@uid'>Homme</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='sexe_@uid' data-name='sexe' id='sexeF_@uid'><label for='sexeF_@uid'>Femme</label>\n"+
"\t\t<input type='radio' name='sexe_@uid' data-name='sexe' id='sexeH_@uid' value='H'><label for='sexeH_@uid'>Homme</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='sexe_@uid' data-name='sexe' id='sexeF_@uid' value='F'><label for='sexeF_@uid'>Femme</label>\n"+
"\t</h5>\n"+
@ -288,9 +284,9 @@ ficheBuilder.setLayout(
"\t<h5 class='nobold color0'>\n"+
"\t\tSituation familiale:<br>\n"+
"\t\t<h5 class='nobold color0'>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='famsit_@uid' data-name='famsit' id='famsitA_@uid'><label for='famsitA_@uid'>Seul</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='famsit_@uid' data-name='famsit' id='famsitB_@uid'><label for='famsitB_@uid'>En couple sans enfants</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='famsit_@uid' data-name='famsit' id='famsitC_@uid'><label for='famsitC_@uid'>En couple avec enfants</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='famsit_@uid' data-name='famsit' id='famsitA_@uid' value='0'><label for='famsitA_@uid'>Seul</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='famsit_@uid' data-name='famsit' id='famsitB_@uid' value='1'><label for='famsitB_@uid'>En couple sans enfants</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='famsit_@uid' data-name='famsit' id='famsitC_@uid' value='2'><label for='famsitC_@uid'>En couple avec enfants</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
@ -326,30 +322,31 @@ ficheBuilder.setLayout(
"\t<h4 data-icon='a'>Type de relation</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype0_@uid'><label for='reltype0_@uid'>Père, mère ou équivalent</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype1_@uid'><label for='reltype1_@uid'>Frère ou soeur</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype2_@uid'><label for='reltype2_@uid'>Autre membre de la famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype3_@uid'><label for='reltype3_@uid'>Relation amoureuse</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype4_@uid'><label for='reltype4_@uid'>Collègue</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype5_@uid'><label for='reltype5_@uid'>Voisin</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype6_@uid'><label for='reltype6_@uid'>Ami</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype7_@uid'><label for='reltype7_@uid'>Copain</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype8_@uid'><label for='reltype8_@uid'>Autre : <input type='text' data-name='reltypeSpecial' placeholder='coéquipier de tennis, ..' value='@reltypespecial'></label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype0_@uid' value='0'><label for='reltype0_@uid'>Père, mère ou équivalent</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype1_@uid' value='1'><label for='reltype1_@uid'>Frère ou soeur</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype2_@uid' value='2'><label for='reltype2_@uid'>Autre membre de la famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype3_@uid' value='3'><label for='reltype3_@uid'>Relation amoureuse</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype4_@uid' value='4'><label for='reltype4_@uid'>Collègue</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype5_@uid' value='5'><label for='reltype5_@uid'>Voisin</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype6_@uid' value='6'><label for='reltype6_@uid'>Ami</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype7_@uid' value='7'><label for='reltype7_@uid'>Copain</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype8_@uid' value='8'><label for='reltype8_@uid'>Autre : <input type='text' data-name='reltypeSpecial' placeholder='coéquipier de tennis, ..' value='@reltypespecial'></label><br>\n"+
"\t</h5>\n"+
"\t<h4 data-icon='m'>Où habite t-elle/il ?</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<input type='text' data-name='city' placeholder='Ville' value='@city'>\n"+
"\t\t<input type='text' data-name='cp' placeholder='Code postal' value='@cp'>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tOù habite t-elle/il ?<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locA_@uid'><label for='locA_@uid'>de 5 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locB_@uid'><label for='locB_@uid'>de 5 à 15 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locC_@uid'><label for='locC_@uid'>de 15 à 60 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locD_@uid'><label for='locD_@uid'>+ d'une heure</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locA_@uid' value='0'><label for='locA_@uid'>de 5 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locB_@uid' value='1'><label for='locB_@uid'>de 5 à 15 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locC_@uid' value='2'><label for='locC_@uid'>de 15 à 60 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locD_@uid' value='3'><label for='locD_@uid'>+ d'une heure</label><br>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
@ -361,102 +358,102 @@ ficheBuilder.setLayout(
"\t<h4 data-icon='d'>Contexte de rencontre</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte0_@uid'> <label for='contexte0_@uid'>De la même famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte1_@uid'> <label for='contexte1_@uid'>Grandi ensemble</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte2_@uid'> <label for='contexte2_@uid'>Par mon mari/ma femme/relation amoureuse</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte3_@uid'> <label for='contexte3_@uid'>Par mes parents</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte4_@uid'> <label for='contexte4_@uid'>Par mes enfants</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte5_@uid'> <label for='contexte5_@uid'>Par un ami</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte6_@uid'> <label for='contexte6_@uid'>Comme voisin</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte7_@uid'> <label for='contexte7_@uid'>Par dautres membres de la famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte8_@uid'> <label for='contexte8_@uid'>Etudes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte9_@uid'> <label for='contexte9_@uid'>Etudes supérieures</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte0_@uid' value='0'><label for='contexte0_@uid'>De la même famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte1_@uid' value='1'><label for='contexte1_@uid'>Grandi ensemble</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte2_@uid' value='2'><label for='contexte2_@uid'>Par mon mari/ma femme/relation amoureuse</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte3_@uid' value='3'><label for='contexte3_@uid'>Par mes parents</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte4_@uid' value='4'><label for='contexte4_@uid'>Par mes enfants</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte5_@uid' value='5'><label for='contexte5_@uid'>Par un ami</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte6_@uid' value='6'><label for='contexte6_@uid'>Comme voisin</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte7_@uid' value='7'><label for='contexte7_@uid'>Par dautres membres de la famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte8_@uid' value='8'><label for='contexte8_@uid'>Etudes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte9_@uid' value='9'><label for='contexte9_@uid'>Etudes supérieures</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte10_@uid' value='10'><label for='contexte10_@uid'>Au travail</label><br>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte10_@uid'><label for='contexte10_@uid'>Au travail</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte11_@uid'><label for='contexte11_@uid'>Internet (quel contexte ? préciser <input type='text' data-name='contextSpecial' placeholder='facebook, youtube, twitter, ..' value='@contextspecial0'>)</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte12_@uid'><label for='contexte12_@uid'>Par une association (quel type : <input type='text' data-name='contextSpecial' placeholder='aide à la personne, sport, ..' value='@contextspecial1'>)</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte13_@uid'><label for='contexte13_@uid'>Autre : <input type='text' data-name='contextSpecial' placeholder='vacances, ..' value='@contextspecial2'></label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte11_@uid' value='11'><label for='contexte11_@uid'>Internet (quel contexte ? préciser <input type='text' data-name='contextSpecial' placeholder='facebook, youtube, twitter, ..' value='@contextspecial0'>)</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte12_@uid' value='12'><label for='contexte12_@uid'>Par une association (quel type : <input type='text' data-name='contextSpecial' placeholder='aide à la personne, sport, ..' value='@contextspecial1'>)</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte13_@uid' value='13'><label for='contexte13_@uid'>Autre : <input type='text' data-name='contextSpecial' placeholder='vacances, ..' value='@contextspecial2'></label><br>\n"+
"\t</h5>\n"+
"\t<h4 data-icon='b'>Avec quelle fréquence discutez-vous avec cette personne ?</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tFace à face<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq0' id='freq01_@uid'><label for='freq01_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq0' id='freq02_@uid'><label for='freq02_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq0' id='freq03_@uid'><label for='freq03_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq0' id='freq04_@uid'><label for='freq04_@uid'>1 fois par an ou moins</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq' id='freq01_@uid' value='0'><label for='freq01_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq' id='freq02_@uid' value='1'><label for='freq02_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq' id='freq03_@uid' value='2'><label for='freq03_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq' id='freq04_@uid' value='3'><label for='freq04_@uid'>1 fois par an ou moins</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tTéléphone ou skype et équivalent<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq1' id='freq11_@uid'><label for='freq11_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq1' id='freq12_@uid'><label for='freq12_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq1' id='freq13_@uid'><label for='freq13_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq1' id='freq14_@uid'><label for='freq14_@uid'>1 fois par an ou moins</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq' id='freq11_@uid' value='4'><label for='freq11_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq' id='freq12_@uid' value='5'><label for='freq12_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq' id='freq13_@uid' value='6'><label for='freq13_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq' id='freq14_@uid' value='7'><label for='freq14_@uid'>1 fois par an ou moins</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tSMS, et équivalents<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq2' id='freq21_@uid'><label for='freq21_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq2' id='freq22_@uid'><label for='freq22_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq2' id='freq23_@uid'><label for='freq23_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq2' id='freq24_@uid'><label for='freq24_@uid'>1 fois par an ou moins</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq' id='freq21_@uid' value='8'><label for='freq21_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq' id='freq22_@uid' value='9'><label for='freq22_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq' id='freq23_@uid' value='10'><label for='freq23_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq' id='freq24_@uid' value='11'><label for='freq24_@uid'>1 fois par an ou moins</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tCourrier électronique<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq3' id='freq31_@uid'><label for='freq31_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq3' id='freq32_@uid'><label for='freq32_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq3' id='freq33_@uid'><label for='freq33_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq3' id='freq34_@uid'><label for='freq34_@uid'>1 fois par an ou moins</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq' id='freq31_@uid' value='12'><label for='freq31_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq' id='freq32_@uid' value='13'><label for='freq32_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq' id='freq33_@uid' value='14'><label for='freq33_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq' id='freq34_@uid' value='15'><label for='freq34_@uid'>1 fois par an ou moins</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tFacebook ou autre réseau social<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq4' id='freq41_@uid'><label for='freq41_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq4' id='freq42_@uid'><label for='freq42_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq4' id='freq43_@uid'><label for='freq43_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq4' id='freq44_@uid'><label for='freq44_@uid'>1 fois par an ou moins</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq' id='freq41_@uid' value='16'><label for='freq41_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq' id='freq42_@uid' value='17'><label for='freq42_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq' id='freq43_@uid' value='18'><label for='freq43_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq' id='freq44_@uid' value='19'><label for='freq44_@uid'>1 fois par an ou moins</label>\n"+
"\t</h5>\n"+
"\t<h4 data-icon='r'>Comment êtes-vous « connecté » à cette personne ?</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tSes coordonnées sont dans votre carnet dadresse<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect1_@uid' data-name='connect0' id='connect11_@uid'><label for='connect11_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect1_@uid' data-name='connect0' id='connect12_@uid'><label for='connect12_@uid'>Non</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect1_@uid' data-name='connect' id='connect11_@uid' value='0'><label for='connect11_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect1_@uid' data-name='connect' id='connect12_@uid' value='1'><label for='connect12_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tSon numéro de mobile est enregistré sur votre mobile (ou vous-mêmes êtes sur le sien)<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect2_@uid' data-name='connect1' id='connect21_@uid'><label for='connect21_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect2_@uid' data-name='connect1' id='connect22_@uid'><label for='connect22_@uid'>Non</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect2_@uid' data-name='connect' id='connect21_@uid' value='2'><label for='connect21_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect2_@uid' data-name='connect' id='connect22_@uid' value='3'><label for='connect22_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tElle figure parmi vos amis facebook<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect3_@uid' data-name='connect2' id='connect31_@uid'><label for='connect31_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect3_@uid' data-name='connect2' id='connect32_@uid'><label for='connect32_@uid'>Non</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect3_@uid' data-name='connect' id='connect31_@uid' value='4'><label for='connect31_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect3_@uid' data-name='connect' id='connect32_@uid' value='5'><label for='connect32_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tElle figure parmi vos amis facebook et vous interagissez avec elle sur ce dispositif régulièrement<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect4_@uid' data-name='connect3' id='connect41_@uid'><label for='connect41_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect4_@uid' data-name='connect3' id='connect42_@uid'><label for='connect42_@uid'>Non</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect4_@uid' data-name='connect' id='connect41_@uid' value='6'><label for='connect41_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect4_@uid' data-name='connect' id='connect42_@uid' value='7'><label for='connect42_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tVous le suivez sur Twitter<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect5_@uid' data-name='connect4' id='connect51_@uid'><label for='connect51_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect5_@uid' data-name='connect4' id='connect52_@uid'><label for='connect52_@uid'>Non</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect5_@uid' data-name='connect' id='connect51_@uid' value='8'><label for='connect51_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect5_@uid' data-name='connect' id='connect52_@uid' value='9'><label for='connect52_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tVous communiquez avec cette personne sur Twitter<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect6_@uid' data-name='connect5' id='connect61_@uid'><label for='connect61_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect6_@uid' data-name='connect5' id='connect62_@uid'><label for='connect62_@uid'>Non</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect6_@uid' data-name='connect' id='connect61_@uid' value='10'><label for='connect61_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect6_@uid' data-name='connect' id='connect62_@uid' value='11'><label for='connect62_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+

View File

@ -1,8 +1,8 @@
function inputPhoneContact(a,c){this.container=a;this.nav_container=c}inputPhoneContact.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null};
inputPhoneContact.prototype.fieldsToStorage=function(){console.log("CONTACTS: FIELDS TO STORAGE");for(var a=$$("article.contact-panel .new-contact"),c=0;c<a.length;c++){var b=(new FormDeflater(a[c],["input"],["data-name"])).deflate(),d=0<b.number.value.length;if(d=d&&0<b.username.value.length+b.firstname.value.length+b.lastname.value.length)d={uid:parseInt(b.uid.value),number:b.number.value,username:b.username.value,firstname:b.firstname.value,lastname:b.lastname.value,call:parseInt(b.call.value),
sms:parseInt(b.sms.value),countcall:parseInt(b.countcall.value),countsms:parseInt(b.countsms.value)},d.hash=crc32(JSON.stringify(d)),lsi.set("contacts",parseInt(b.uid.value),d)}};
function inputPhoneContact(a,b){this.container=a;this.nav_container=b}inputPhoneContact.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null};inputPhoneContact.prototype.check=function(a){var b=0<a.number.length;return b=b&&0<a.username.length+a.firstname.length+a.lastname.length};
inputPhoneContact.prototype.fieldsToStorage=function(){console.log("CONTACTS: FIELDS TO STORAGE");for(var a=$$("article.contact-panel .new-contact"),b=0;b<a.length;b++){var c=(new FormDeflater(a[b],["input"],["data-name"])).deflate();if(this.check(c)){var d={uid:parseInt(c.uid),number:c.number,username:c.username,firstname:c.firstname,lastname:c.lastname,call:parseInt(c.call),sms:parseInt(c.sms),countcall:parseInt(c.countcall),countsms:parseInt(c.countsms)};d.hash=crc32(JSON.stringify(d));lsi.set("contacts",
parseInt(c.uid),d)}}};
inputPhoneContact.prototype.add=function(a){console.log("CONTACTS: ADD");if(null==a||null==a.uid||isNaN(a.uid))return!1;a.number=null!=a.number?a.number:"";a.username=null!=a.username?a.username:"";a.firstname=null!=a.firstname?a.firstname:"";a.lastname=null!=a.lastname?a.lastname:"";a.call=null!=a.call?a.call:-1;a.sms=null!=a.sms?a.sms:-1;a.countcall=null!=a.countcall?a.countcall:0;a.countsms=null!=a.countsms?a.countsms:0;this.container.innerHTML+=contactBuilder.build(a);a=$$("article.contact-panel .new-contact");
for(var c=this,b=0;b<a.length;b++)a[b].removeEventListener("click",function(a){c.nav(a.target);c.handler(a.target)},!1),a[b].addEventListener("click",function(a){c.nav(a.target);c.handler(a.target)},!1)};inputPhoneContact.prototype.storageToFields=function(){console.log("CONTACTS: STORAGE TO FIELDS");var a=lsi.keys("contacts");this.container.innerHTML="";for(var c=this.selected+10,b=this.selected;b<c&&b<a.length;b++)this.add(lsi.get("contacts",a[b]));c>=a.length&&this.add({uid:a.length});this.updateNavBar()};
inputPhoneContact.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"nav-contact"!=a.parentNode.id)return!1;for(var c=$$("#nav-contact > span.active"),b=0;b<c.length;b++)c[b].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputPhoneContact.prototype.updateNavBar=function(){var a=lsi.keys("contacts").length;if(this.nav_container.children.length!=a){this.nav_container.innerHTML="";for(var c=0;c<a;c+=10)this.nav_container.innerHTML+='<span data-n="'+c+'">'+(1+c/10)+"</span>"}this.nav($('#nav-contact [data-n="'+this.selected+'"]'))};
inputPhoneContact.prototype.attach=function(a){console.log("CONTACTS: ATTACH");lsi.createDataset("contacts");this.storageToFields();this.handler=a;var c=this;this.nav_container.addEventListener("click",function(a){c.nav(a.target);c.handler(a.target)},!1)};
for(var b=this,c=0;c<a.length;c++)a[c].removeEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1),a[c].addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};inputPhoneContact.prototype.storageToFields=function(){console.log("CONTACTS: STORAGE TO FIELDS");var a=lsi.keys("contacts");this.container.innerHTML="";for(var b=this.selected+10,c=this.selected;c<b&&c<a.length;c++)this.add(lsi.get("contacts",a[c]));b>=a.length&&this.add({uid:a.length});this.updateNavBar()};
inputPhoneContact.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"nav-contact"!=a.parentNode.id)return!1;for(var b=$$("#nav-contact > span.active"),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputPhoneContact.prototype.updateNavBar=function(){var a=lsi.keys("contacts").length;if(this.nav_container.children.length!=a){this.nav_container.innerHTML="";for(var b=0;b<a;b+=10)this.nav_container.innerHTML+='<span data-n="'+b+'">'+(1+b/10)+"</span>"}this.nav($('#nav-contact [data-n="'+this.selected+'"]'))};
inputPhoneContact.prototype.attach=function(a){console.log("CONTACTS: ATTACH");lsi.createDataset("contacts");this.storageToFields();this.handler=a;var b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};

View File

@ -15,7 +15,21 @@ inputPhoneContact.prototype = {
};
/* [2] Gestion de l'enregistrement des formulaires de contact
/* [2] Vérification des données d'un contact
=========================================================*/
inputPhoneContact.prototype.check = function(deflated){
/* (1) Le numéro n'est pas vide */
var validForm = deflated.number.length > 0;
/* (2) ET le pseudo et/ou le prénom et/ou le nom n'est pas vide */
validForm = validForm && deflated.username.length+deflated.firstname.length+deflated.lastname.length > 0;
/* (3) On retourne la validité du formulaire */
return validForm
}
/* [3] Gestion de l'enregistrement des formulaires de contact
=========================================================*/
inputPhoneContact.prototype.fieldsToStorage = function(){
console.log('CONTACTS: FIELDS TO STORAGE');
@ -30,34 +44,29 @@ inputPhoneContact.prototype.fieldsToStorage = function(){
// {3} On enregistre ce contact si le numéro n'est pas vide et soit pseudo/prénom/nom //
var deflated = deflater.deflate();
// Le numéro n'est pas vide
var validForm = deflated.number.value.length > 0;
// ET le pseudo et/ou le prénom et/ou le nom n'est pas vide
validForm = validForm && deflated.username.value.length+deflated.firstname.value.length+deflated.lastname.value.length > 0;
// Si le formulaire n'est pas valide, on ne l'enregistre pas
if( !validForm ) continue;
if( !this.check(deflated) ) continue;
// {4} On récupère et met en forme les valeurs du deflater //
var obj = {
uid: parseInt(deflated.uid.value),
number: deflated.number.value,
username: deflated.username.value,
firstname: deflated.firstname.value,
lastname: deflated.lastname.value,
uid: parseInt(deflated.uid),
number: deflated.number,
username: deflated.username,
firstname: deflated.firstname,
lastname: deflated.lastname,
call: parseInt(deflated.call.value),
sms: parseInt(deflated.sms.value),
call: parseInt(deflated.call),
sms: parseInt(deflated.sms),
countcall: parseInt(deflated.countcall.value),
countsms: parseInt(deflated.countsms.value)
countcall: parseInt(deflated.countcall),
countsms: parseInt(deflated.countsms)
};
/* (5) On calcule et ajoute le hash des données */
obj.hash = crc32( JSON.stringify(obj) );
// {6} On enregistre les données dans le 'localStorage' //
lsi.set('contacts', parseInt(deflated.uid.value), obj);
lsi.set('contacts', parseInt(deflated.uid), obj);
}
@ -71,7 +80,7 @@ inputPhoneContact.prototype.fieldsToStorage = function(){
/* [3] Gestion de l'ajout physique d'un nouveau contact
/* [4] Gestion de l'ajout physique d'un nouveau contact
=========================================================*/
/*
*
@ -120,7 +129,7 @@ inputPhoneContact.prototype.add = function(objectData){
/* [4] Gestion de l'affichage depuis le 'localStorage'
/* [5] Gestion de l'affichage depuis le 'localStorage'
=========================================================*/
inputPhoneContact.prototype.storageToFields = function(){
console.log('CONTACTS: STORAGE TO FIELDS');
@ -208,7 +217,7 @@ inputPhoneContact.prototype.updateNavBar = function(){
/* [5] Point d'amorçage de la gestion des contacts
/* [8] Point d'amorçage de la gestion des contacts
=========================================================*/
inputPhoneContact.prototype.attach = function(handler){
console.log('CONTACTS: ATTACH');

View File

@ -1,23 +1,19 @@
function inputPhoneFiche(a,b){this.container=a;this.nav_container=b}
inputPhoneFiche.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null,defaultData:{sexe:[defTrue,defFalse],age:".",job:".",famsit:[defTrue,defFalse,defFalse],studies:".",reltype:[defTrue,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse],reltypeSpecial:"",city:"",loc:[defTrue,defFalse,defFalse,defFalse],duration:["",""],context:[defTrue,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse,
defFalse],contextSpecial:["","",""],freq:[[defTrue,defFalse,defFalse,defFalse],[defTrue,defFalse,defFalse,defFalse],[defTrue,defFalse,defFalse,defFalse],[defTrue,defFalse,defFalse,defFalse],[defTrue,defFalse,defFalse,defFalse]],connect:[[defFalse,defTrue],[defFalse,defTrue],[defFalse,defTrue],[defFalse,defTrue],[defFalse,defTrue],[defFalse,defTrue]],connectSpecial:["",""],timestamp:0,valid:!1}};
inputPhoneFiche.prototype.fieldsToStorage=function(){console.log("FICHE: FIELDS TO STORAGE");for(var a=$$("article.relation-panel .fiche-relation"),b=0;b<a.length;b++){var c=(new FormDeflater(a[b],["input","select"],["data-name"])).deflate(),e=crc32(JSON.stringify(c)),d=lsi.get("fiches",c.uid.value);if(!1!==d){if(null!=d.hash&&d.hash==e)break;c={contact:parseInt(c.contact.value),uid:parseInt(c.uid.value),sexe:c.sexe,age:c.age.value,job:c.job.value,famsit:c.famsit,studies:c.studies.value,reltype:c.reltype,
reltypeSpecial:c.reltypeSpecial.value,city:c.city.value,loc:c.loc,duration:[c.duration[0].value,c.duration[1].value],context:c.context,contextSpecial:[c.contextSpecial[0].value,c.contextSpecial[1].value,c.contextSpecial[2].value],freq:[c.freq0,c.freq1,c.freq2,c.freq3,c.freq4],connect:[c.connect0,c.connect1,c.connect2,c.connect3,c.connect4,c.connect5],connectSpecial:[c.connectSpecial[0].value,c.connectSpecial[1].value],hash:e};c.valid=this.check(c);0<diff(d,c).length&&(console.warn("> FICHE UPDATE"),
c.timestamp=Date.now());lsi.set("fiches",c.uid,c)}}};
inputPhoneFiche.prototype.add=function(a){console.log("FICHE: ADD");if(null==a.uid||null==a.contact)return!1;a.city=null!=a.city?a.city:this.defaultData.city;a.duration[0]=null!=a.duration[0]?a.duration[0]:this.defaultData.duration[0];a.duration[1]=null!=a.duration[1]?a.duration[1]:this.defaultData.duration[1];a.reltypeSpecial=null!=a.reltypeSpecial?a.reltypeSpecial:this.defaultData.reltypeSpecial;a.contextSpecial[0]=null!=a.contextSpecial[0]?a.contextSpecial[0]:this.defaultData.contextSpecial[0];
a.contextSpecial[1]=null!=a.contextSpecial[1]?a.contextSpecial[1]:this.defaultData.contextSpecial[1];a.contextSpecial[2]=null!=a.contextSpecial[2]?a.contextSpecial[2]:this.defaultData.contextSpecial[2];a.connectSpecial[0]=null!=a.connectSpecial[0]?a.connectSpecial[0]:this.defaultData.connectSpecial[0];a.connectSpecial[1]=null!=a.connectSpecial[1]?a.connectSpecial[1]:this.defaultData.connectSpecial[1];a.job=null!=a.job?a.job:this.defaultData.job;a.studies=null!=a.studies?a.studies:this.defaultData.studies;
a.age=null!=a.age?a.age:this.defaultData.age;a.sexe=null!=a.sexe?a.sexe:this.defaultData.sexe;a.famsit=null!=a.famsit?a.famsit:this.defaultData.famsit;a.reltype=null!=a.reltype?a.reltype:this.defaultData.reltype;a.loc=null!=a.loc?a.loc:this.defaultData.loc;a.context=null!=a.context?a.context:this.defaultData.context;a.freq=null!=a.freq?a.freq:this.defaultData.freq;a.connect=null!=a.connect?a.connect:this.defaultData.connect;var b=lsi.get("contacts",a.contact);if(!1===b)return!1;this.container.innerHTML+=
ficheBuilder.build({firstname:b.firstname,lastname:b.lastname,username:0==b.username.length?"":"("+b.username+")",countcall:b.countcall,countsms:b.countsms,uid:a.uid,contact:a.contact,city:a.city,duration0:a.duration[0],duration1:a.duration[1],reltypespecial:a.reltypeSpecial,contextspecial0:a.contextSpecial[0],contextspecial1:a.contextSpecial[1],contextspecial2:a.contextSpecial[2],connectspecial0:a.connectSpecial[0],connectspecial1:a.connectSpecial[1]});b=$('article.fiche-relation input[data-name="uid"][value="'+
function inputPhoneFiche(a,b){this.container=a;this.nav_container=b}inputPhoneFiche.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null,defaultData:{sexe:"H",age:".",job:".",famsit:"0",studies:".",reltype:"0",reltypeSpecial:"",city:"",cp:"",loc:"0",duration:["",""],context:"0",contextSpecial:["","",""],freq:["0","4","8","12","16"],connect:"1 3 5 7 9 11".split(" "),connectSpecial:["",""],timestamp:0,valid:!1}};
inputPhoneFiche.prototype.fieldsToStorage=function(){console.log("FICHE: FIELDS TO STORAGE");for(var a=$$("article.relation-panel .fiche-relation"),b=0;b<a.length;b++){var c=(new FormDeflater(a[b],["input","select"],["data-name"])).deflate(),e=crc32(JSON.stringify(c)),d=lsi.get("fiches",c.uid);if(!1!==d){if(null!=d.hash&&d.hash==e)break;c={contact:parseInt(c.contact),uid:parseInt(c.uid),sexe:c.sexe,age:c.age,job:c.job,famsit:c.famsit,studies:c.studies,reltype:c.reltype,reltypeSpecial:c.reltypeSpecial,
city:c.city,cp:c.cp,loc:c.loc,duration:c.duration,context:c.context,contextSpecial:c.contextSpecial,freq:c.freq,connect:c.connect,connectSpecial:c.connectSpecial,hash:e};c.valid=this.check(c);0<diff(d,c,["hash","valid","timestamp"]).length&&(console.log(diff(d,c,["hash","valid","timestamp"])),console.warn("> FICHE UPDATE"),c.timestamp=Date.now());lsi.set("fiches",c.uid,c)}}};
inputPhoneFiche.prototype.add=function(a){console.log("FICHE: ADD");if(null==a.uid||isNaN(a.uid)||null==a.contact||isNaN(a.contact))return!1;a.city=null!=a.city?a.city:this.defaultData.city;a.cp=null!=a.cp?a.cp:this.defaultData.cp;a.duration[0]=null!=a.duration[0]?a.duration[0]:this.defaultData.duration[0];a.duration[1]=null!=a.duration[1]?a.duration[1]:this.defaultData.duration[1];a.reltypeSpecial=null!=a.reltypeSpecial?a.reltypeSpecial:this.defaultData.reltypeSpecial;a.contextSpecial[0]=null!=a.contextSpecial[0]?
a.contextSpecial[0]:this.defaultData.contextSpecial[0];a.contextSpecial[1]=null!=a.contextSpecial[1]?a.contextSpecial[1]:this.defaultData.contextSpecial[1];a.contextSpecial[2]=null!=a.contextSpecial[2]?a.contextSpecial[2]:this.defaultData.contextSpecial[2];a.connectSpecial[0]=null!=a.connectSpecial[0]?a.connectSpecial[0]:this.defaultData.connectSpecial[0];a.connectSpecial[1]=null!=a.connectSpecial[1]?a.connectSpecial[1]:this.defaultData.connectSpecial[1];a.job=null!=a.job?a.job:this.defaultData.job;
a.studies=null!=a.studies?a.studies:this.defaultData.studies;a.age=null!=a.age?a.age:this.defaultData.age;a.sexe=null!=a.sexe?a.sexe:this.defaultData.sexe;a.famsit=null!=a.famsit?a.famsit:this.defaultData.famsit;a.reltype=null!=a.reltype?a.reltype:this.defaultData.reltype;a.loc=null!=a.loc?a.loc:this.defaultData.loc;a.context=null!=a.context?a.context:this.defaultData.context;a.freq=null!=a.freq?a.freq:this.defaultData.freq;a.connect=null!=a.connect?a.connect:this.defaultData.connect;var b=lsi.get("contacts",
a.contact);if(!1===b)return!1;this.container.innerHTML+=ficheBuilder.build({name:readableName(b.username,b.firstname,b.lastname),countcall:b.countcall,countsms:b.countsms,uid:a.uid,contact:a.contact,city:a.city,cp:a.cp,duration0:a.duration[0],duration1:a.duration[1],reltypespecial:a.reltypeSpecial,contextspecial0:a.contextSpecial[0],contextspecial1:a.contextSpecial[1],contextspecial2:a.contextSpecial[2],connectspecial0:a.connectSpecial[0],connectspecial1:a.connectSpecial[1]});b=$('article.fiche-relation input[data-name="uid"][value="'+
a.uid+'"] ~ h5>span>select[data-name="job"]>option[value="'+a.job+'"]');null!=b&&b.setAttribute("selected","selected");b=$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+a.studies+'"]');null!=b&&b.setAttribute("selected","selected");b=$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+a.age+'"]');null!=b&&b.setAttribute("selected","selected");for(var c=$$('article.fiche-relation input[data-name="uid"][value="'+
a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'),b=0;b<c.length&&b<a.sexe.length;b++)a.sexe[b].status?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="famsit"]');for(b=0;b<c.length&&b<a.famsit.length;b++)a.famsit[b].status?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]');
for(b=0;b<c.length&&b<a.reltype.length;b++)a.reltype[b].status?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="loc"]');for(b=0;b<c.length&&b<a.loc.length;b++)a.loc[b].status?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="context"]');for(b=0;b<
c.length&&b<a.context.length;b++)a.context[b].status?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");for(c=0;c<a.freq.length;c++)for(var e=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="freq'+c+'"]'),b=0;b<e.length&&b<a.freq[c].length;b++)a.freq[c][b].status?e[b].setAttribute("checked","checked"):e[b].removeAttribute("checked");for(c=0;c<a.connect.length;c++)for(e=$$('article.fiche-relation input[data-name="uid"][value="'+
a.uid+'"] ~ h5>input[type="radio"][data-name="connect'+c+'"]'),b=0;b<e.length&&b<a.connect[c].length;b++)a.connect[c][b].status?e[b].setAttribute("checked","checked"):e[b].removeAttribute("checked")};inputPhoneFiche.prototype.storageToFields=function(){console.log("FICHE: STORAGE TO FIELDS");var a=lsi["export"]("fiches");this.container.innerHTML="";for(var b in a)a[b].uid==this.selected&&this.add(a[b]);this.updateNavBar()};
a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'),b=0;b<c.length;b++)c[b].value==a.sexe?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="famsit"]');for(b=0;b<c.length;b++)c[b].value==a.famsit?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]');
for(b=0;b<c.length;b++)c[b].value==a.reltype?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="loc"]');for(b=0;b<c.length;b++)c[b].value==a.loc?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="context"]');for(b=0;b<c.length;b++)c[b].value==a.context?
c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="freq"]');for(b=0;b<c.length;b++)-1<a.freq.indexOf(c[b].value)?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="connect"]');for(b=0;b<c.length;b++)-1<a.connect.indexOf(c[b].value)?c[b].setAttribute("checked",
"checked"):c[b].removeAttribute("checked")};inputPhoneFiche.prototype.storageToFields=function(){console.log("FICHE: STORAGE TO FIELDS");var a=lsi["export"]("fiches");this.container.innerHTML="";for(var b in a)a[b].uid==this.selected&&this.add(a[b]);this.updateNavBar()};
inputPhoneFiche.prototype.sync=function(){console.log("FICHE: SYNC");var a=lsi["export"]("contacts"),b=[],c;for(c in a){if(-1<a[c].call){var e=a[c].call;b.push(e);var d=lsi.get("fiches",e);null==d&&(d=this.defaultData);d.uid=e;d.contact=parseInt(c);lsi.set("fiches",e,d)}-1<a[c].sms&&(e=10+a[c].sms,b.push(e),d=lsi.get("fiches",e),null==d&&(d=this.defaultData),d.uid=e,d.contact=parseInt(c),lsi.set("fiches",e,d))}if(20>b.length)for(c in a){for(a=0;-1<b.indexOf(a)&&20>a;)a++;b.push(a);d=lsi.get("fiches",
a);null==d&&(d=this.defaultData);d.uid=a;d.contact=c;lsi.set("fiches",a,d);if(20<=b.length)break}var d=lsi["export"]("fiches"),f;for(f in d)miniData=lsi.get("mini-fiches",d[f].contact),d[f].timestamp>=miniData.timestamp?(miniData.sexe=d[f].sexe,miniData.age=d[f].age,miniData.studies=d[f].studies,miniData.loc=d[f].loc,miniData.reltype=d[f].reltype,miniData.reltypeSpecial=d[f].reltypeSpecial):(d[f].sexe=miniData.sexe,d[f].age=miniData.age,d[f].studies=miniData.studies,d[f].loc=miniData.loc,d[f].reltype=
miniData.reltype,d[f].reltypeSpecial=miniData.reltypeSpecial),lsi.set("mini-fiches",d[f].contact,miniData),lsi.set("fiches",f,d[f]);for(f in d)b=lsi.get("contacts",d[f].contact),null!=b&&-1!=b.sms&&-1!=b.call&&(b=10>parseInt(f)?10+b.sms:b.call,b=d[b],b.timestamp>=d[f].timestamp||(c=d[f],c.uid=b.uid,lsi.set("fiches",b.uid,c)))};
a);null==d&&(d=this.defaultData);d.uid=a;d.contact=parseInt(c);lsi.set("fiches",a,d);if(20<=b.length)break}for(var f in d)b=lsi.get("contacts",d[f].contact),null!=b&&-1!=b.sms&&-1!=b.call&&(b=10>parseInt(f)?10+b.sms:b.call,b=d[b],b.timestamp>=d[f].timestamp||(c=d[f],c.uid=b.uid,lsi.set("fiches",b.uid,c)))};
inputPhoneFiche.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"nav-fiche"!=a.parentNode.id)return!1;for(var b=$$("#nav-fiche > span.active"),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputPhoneFiche.prototype.updateNavBar=function(){var a=lsi["export"]("fiches"),b=lsi.keys("fiches").length;if($$("#nav-fiche [data-n]").length!=b){this.nav_container.innerHTML="<span>APPELS</span>";for(var c=0;c<b;c++)9==c?this.nav_container.innerHTML+='<span data-n="'+c+'" class="lc">'+(c%10+1)+"</span>&nbsp;&nbsp;":(10==c&&(this.nav_container.innerHTML+='<span class="fc">SMS</span>'),this.nav_container.innerHTML+='<span data-n="'+c+'">'+(c%10+1)+"</span>")}for(var e in a)b=$('#nav-fiche [data-n="'+
a[e].uid+'"]'),null!=b&&(!0===a[e].valid?b.addClass("done"):b.remClass("done"));this.nav($('#nav-fiche [data-n="'+this.selected+'"]'))};
inputPhoneFiche.prototype.check=function(a){if(2>a.city.length||isNaN(parseInt(a.duration[0]))&&0<a.duration[0].length||isNaN(parseInt(a.duration[1]))&&0<a.duration[1].length||0==a.duration[0].length+a.duration[1].length||"."==a.job||"."==a.studies||"."==a.age||!checkRadioValue(a.sexe)||!checkRadioValue(a.famsit)||!checkRadioValue(a.reltype)||!checkRadioValue(a.loc)||!checkRadioValue(a.context))return!1;for(var b=0;b<a.freq.length;b++)if(!checkRadioValue(a.freq[b]))return!1;for(b=0;b<a.connect.length;b++)if(!checkRadioValue(a.connect[b]))return!1;
return a.reltype[8].status&&2>a.reltypeSpecial.length||a.context[11].status&&2>a.contextSpecial[0].length||a.context[12].status&&2>a.contextSpecial[1].length||a.context[13].status&&2>a.contextSpecial[2].length?!1:!0};inputPhoneFiche.prototype.attach=function(a){console.log("FICHE: ATTACH");lsi.createDataset("fiches");this.storageToFields();this.handler=a;var b=this,b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};
inputPhoneFiche.prototype.updateNavBar=function(){var a=lsi["export"]("fiches"),b=lsi.keys("fiches").length;if($$("#nav-fiche [data-n]").length!=b){this.nav_container.innerHTML="";for(var c=0;c<b;c++)0==c&&(this.nav_container.innerHTML+="<span>APPELS</span>"),9==c?this.nav_container.innerHTML+='<span data-n="'+c+'" class="lc">'+(c%10+1)+"</span>&nbsp;&nbsp;":(10==c&&(this.nav_container.innerHTML+='<span class="fc">SMS</span>'),this.nav_container.innerHTML+='<span data-n="'+c+'">'+(c%10+1)+"</span>")}for(var e in a)b=
$('#nav-fiche [data-n="'+a[e].uid+'"]'),null!=b&&(!0===a[e].valid?b.addClass("done"):b.remClass("done"));this.nav($('#nav-fiche [data-n="'+this.selected+'"]'))};
inputPhoneFiche.prototype.check=function(a){if(2>a.city.length||isNaN(a.cp)||isNaN(parseInt(a.duration[0]))&&0<a.duration[0].length||isNaN(parseInt(a.duration[1]))&&0<a.duration[1].length||0==a.duration[0].length+a.duration[1].length||"."==a.job||"."==a.studies||"."==a.age||""==a.sexe||""==a.famsit||""==a.reltype||""==a.loc||""==a.context)return!1;for(var b=0;b<a.freq.length;b++)if(""==a.freq[b])return!1;for(b=0;b<a.connect.length;b++)if(""==a.connect[b])return!1;return"8"==a.reltype&&2>a.reltypeSpecial.length||
"11"==a.context&&2>a.contextSpecial[0].length||"12"==a.context&&2>a.contextSpecial[1].length||"13"==a.context&&2>a.contextSpecial[2].length?!1:!0};inputPhoneFiche.prototype.attach=function(a){console.log("FICHE: ATTACH");lsi.createDataset("fiches");this.storageToFields();this.handler=a;var b=this,b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};

View File

@ -13,34 +13,21 @@ inputPhoneFiche.prototype = {
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
sexe: [ defTrue, defFalse],
sexe: 'H',
age: '.',
job: '.',
famsit: [ defTrue, defFalse, defFalse ], // Choix 1 à 3
famsit: '0', // Choix 1 à 3
studies: '.',
reltype: [ defTrue, defFalse, defFalse, defFalse, defFalse,
defFalse, defFalse, defFalse, defFalse], // Choix 1 à 9
reltype: '0', // Choix 1 à 9
reltypeSpecial: '',
city: '',
loc: [ defTrue, defFalse, defFalse, defFalse ],
cp: '',
loc: '0',
duration: ['', ''],
context: [ defTrue, defFalse, defFalse, defFalse, defFalse,
defFalse, defFalse, defFalse, defFalse, defFalse,
defFalse, defFalse, defFalse, defFalse], // Choix 1 à 14
context: '0', // Choix 1 à 14
contextSpecial: ['', '', ''],
freq: [
[ defTrue, defFalse, defFalse, defFalse ],
[ defTrue, defFalse, defFalse, defFalse ],
[ defTrue, defFalse, defFalse, defFalse ],
[ defTrue, defFalse, defFalse, defFalse ],
[ defTrue, defFalse, defFalse, defFalse ]],
connect: [
[ defFalse, defTrue ],
[ defFalse, defTrue ],
[ defFalse, defTrue ],
[ defFalse, defTrue ],
[ defFalse, defTrue ],
[ defFalse, defTrue ]],
freq: ['0', '4', '8', '12', '16'], // 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
@ -70,7 +57,7 @@ inputPhoneFiche.prototype.fieldsToStorage = function(){
// {4} On récupère les données du LSI si elles existent //
var existingData = lsi.get('fiches', deflated.uid.value);
var existingData = lsi.get('fiches', deflated.uid);
// Si n'existe pas, on passe au suivant
if( existingData === false )
@ -84,46 +71,24 @@ inputPhoneFiche.prototype.fieldsToStorage = function(){
var obj = {
contact: parseInt(deflated.contact.value),
uid: parseInt(deflated.uid.value),
sexe: deflated.sexe, // Choix 1 à 2
age: deflated.age.value,
job: deflated.job.value,
famsit: deflated.famsit, // Choix 1 à 3
studies: deflated.studies.value,
reltype: deflated.reltype, // Choix 1 à 9
reltypeSpecial: deflated.reltypeSpecial.value,
city: deflated.city.value,
loc: deflated.loc, // Choix 1 à 3
duration: [
deflated.duration[0].value, // Durée de la relation en mois
deflated.duration[1].value // Durée de la relation en années
],
context: deflated.context, // Choix 1 à 14
contextSpecial: [
deflated.contextSpecial[0].value, // Valeur du contexte si context[11]
deflated.contextSpecial[1].value, // Valeur du contexte si context[12]
deflated.contextSpecial[2].value // Valeur du contexte si context[13]
],
freq: [
deflated.freq0, // Choix 1 à 4
deflated.freq1, // Choix 1 à 4
deflated.freq2, // Choix 1 à 4
deflated.freq3, // Choix 1 à 4
deflated.freq4 // Choix 1 à 4
],
connect: [
deflated.connect0, // Choix 1 à 2
deflated.connect1, // Choix 1 à 2
deflated.connect2, // Choix 1 à 2
deflated.connect3, // Choix 1 à 2
deflated.connect4, // Choix 1 à 2
deflated.connect5 // Choix 1 à 2
],
connectSpecial: [
deflated.connectSpecial[0].value,
deflated.connectSpecial[1].value
],
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,
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
};
@ -132,7 +97,8 @@ inputPhoneFiche.prototype.fieldsToStorage = function(){
obj.valid = this.check(obj);
// On met à jour la date de modification, si on a pas qu'@uid de différent
if( diff(existingData, obj).length > 0 ){
if( diff(existingData, obj, ['hash', 'valid', 'timestamp']).length > 0 ){
console.log( diff(existingData, obj, ['hash', 'valid', 'timestamp']) );
console.warn('> FICHE UPDATE');
obj.timestamp = Date.now();
}
@ -161,12 +127,13 @@ inputPhoneFiche.prototype.add = function(objectData){
console.log('FICHE: ADD');
// Si pas d'UID ou d'UID de contact, on retourne une erreur
if( objectData.uid == null || objectData.contact == null )
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.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;
@ -201,14 +168,13 @@ inputPhoneFiche.prototype.add = function(objectData){
// {5} Création physique //
this.container.innerHTML += ficheBuilder.build({
firstname: associatedContact.firstname,
lastname: associatedContact.lastname,
username: (associatedContact.username.length==0) ? '' : '('+associatedContact.username+')',
name: readableName(associatedContact.username, associatedContact.firstname, associatedContact.lastname),
countcall: associatedContact.countcall,
countsms: associatedContact.countsms,
uid: objectData.uid,
contact: objectData.contact, // uid du contact associé
city: objectData.city,
cp: objectData.cp,
duration0: objectData.duration[0],
duration1: objectData.duration[1],
reltypespecial: objectData.reltypeSpecial,
@ -239,54 +205,50 @@ inputPhoneFiche.prototype.add = function(objectData){
/* {9} On sélectionna la valeur des boutons <radio> pour le SEXE */
var sexeCreated = $$('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 < objectData.sexe.length ; i++ )
if( objectData.sexe[i].status ) sexeCreated[i].setAttribute('checked', 'checked');
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 = $$('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 < objectData.famsit.length ; i++ )
if( objectData.famsit[i].status ) famsitCreated[i].setAttribute('checked', 'checked');
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 = $$('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 < objectData.reltype.length ; i++ )
if( objectData.reltype[i].status ) reltypeCreated[i].setAttribute('checked', 'checked');
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 = $$('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 < objectData.loc.length ; i++ )
if( objectData.loc[i].status ) locCreated[i].setAttribute('checked', 'checked');
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 = $$('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 < objectData.context.length ; i++ )
if( objectData.context[i].status ) contextCreated[i].setAttribute('checked', 'checked');
for( var i = 0 ; i < contextCreated.length ; i++ )
if( contextCreated[i].value == objectData.context ) contextCreated[i].setAttribute('checked', 'checked');
else contextCreated[i].removeAttribute('checked');
/* {14} On sélectionna la valeur des boutons <radio> pour les FREQUENCES */
for( var f = 0 ; f < objectData.freq.length ; f++ ){
var freqCreated = $$('article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="freq'+f+'"]');
for( var i = 0 ; i < freqCreated.length && i < objectData.freq[f].length ; i++ )
if( objectData.freq[f][i].status ) freqCreated[i].setAttribute('checked', 'checked');
var freqCreated = $$('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');
}
/* {15} On sélectionna la valeur des boutons <radio> pour les CONNECTIONS */
for( var c = 0 ; c < objectData.connect.length ;c++ ){
var connectCreated = $$('article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="connect'+c+'"]');
for( var i = 0 ; i < connectCreated.length && i < objectData.connect[c].length ; i++ )
if( objectData.connect[c][i].status ) connectCreated[i].setAttribute('checked', 'checked');
var connectCreated = $$('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');
}
@ -419,7 +381,7 @@ inputPhoneFiche.prototype.sync = function(){
/* (4) On met à jour la fiche ET on l'enregistre */
ficheData.uid = ficheUid;
ficheData.contact = uid;
ficheData.contact = parseInt(uid);
lsi.set('fiches', ficheUid, ficheData);
@ -430,45 +392,7 @@ inputPhoneFiche.prototype.sync = function(){
}
/* (3) Mise à jour en fonction des MINI fiches
---------------------------------------------------------*/
/* (1) On récupère les valeurs des MINI fiches et des FICHES */
var ficheData = lsi.export('fiches');
/* (2) Pour chaque champ, on synchronise les MINI fiches avec les FICHES associées */
for( var key in ficheData ){
miniData = lsi.get('mini-fiches', ficheData[key].contact);
var ficheModifiedLast = ficheData[key].timestamp >= miniData.timestamp;
/* (3) Si la FICHE a été modifiée en dernier, on utilise ses données */
if( ficheModifiedLast ){
miniData.sexe = ficheData[key].sexe;
miniData.age = ficheData[key].age;
miniData.studies = ficheData[key].studies;
miniData.loc = ficheData[key].loc;
miniData.reltype = ficheData[key].reltype;
miniData.reltypeSpecial = ficheData[key].reltypeSpecial;
/* (4) Sinon, on utilise les données de la MINI */
}else{
ficheData[key].sexe = miniData.sexe;
ficheData[key].age = miniData.age;
ficheData[key].studies = miniData.studies;
ficheData[key].loc = miniData.loc;
ficheData[key].reltype = miniData.reltype;
ficheData[key].reltypeSpecial = miniData.reltypeSpecial;
}
/* (5) On enregistre les modifications */
lsi.set('mini-fiches', ficheData[key].contact, miniData);
lsi.set('fiches', key, ficheData[key]);
}
/* (4) Mise à jour des fiches dupliquées entre le top 10 des APPELS et celui des SMS
/* (3) Mise à jour des fiches dupliquées entre le top 10 des APPELS et celui des SMS
---------------------------------------------------------*/
for( var key in ficheData ){
/* (1) On récupère le contact associé */
@ -549,9 +473,13 @@ inputPhoneFiche.prototype.updateNavBar = function(){
/* (2) On vide et remplit la barre de nav, si elle n'est pas à jour */
if( !navBarUpToDate ){
this.nav_container.innerHTML = '<span>APPELS</span>';
this.nav_container.innerHTML = '';
for( var i = 0 ; i < len ; i++ ){
// Si 1ère valeur du top 10 des APPELS, on ajoute le bandeau "APPELS"
if( i == 0 )
this.nav_container.innerHTML += '<span>APPELS</span>';
for( var i = 0 ; i < len ; i++ )
// Si fin du top 10 des APPELS, on met un espace et un border-right
if( i == 9 )
this.nav_container.innerHTML += '<span data-n="'+i+'" class="lc">'+(i%10 + 1)+'</span>&nbsp;&nbsp;';
@ -565,6 +493,7 @@ inputPhoneFiche.prototype.updateNavBar = function(){
}else
this.nav_container.innerHTML += '<span data-n="'+i+'">'+(i%10 + 1)+'</span>';
}
}
/* (3) On montre les FICHES qui sont correctes */
for( var key in ficheData ){
@ -598,71 +527,74 @@ inputPhoneFiche.prototype.check = function(ficheData){
// 1. La ville a au moins 2 caractères
if( ficheData.city.length < 2 )
return false;
// 2. La durée de la relation en mois est vide ou un nombre
// 2. Le code postal est un nombre
if( isNaN(ficheData.cp) )
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;
// 3. La durée de la relation en année est vide ou un nombre
// 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;
// 4. Pour la durée de la relation, au moins un des 2 n'est pas vide
// 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> //
// 5. Le <select> pour la profession n'est pas indéfini
// 6. Le <select> pour la profession n'est pas indéfini
if( ficheData.job == '.' )
return false;
// 6. Le <select> pour les études n'est pas indéfini
// 7. Le <select> pour les études n'est pas indéfini
if( ficheData.studies == '.' )
return false;
// 7. Le <select> pour l'AGE n'est pas indéfini
// 8. Le <select> pour l'AGE n'est pas indéfini
if( ficheData.age == '.' )
return false;
// {3} Vérification des <input> radio //
// 8. Le SEXE a un et un seul choix
if( !checkRadioValue(ficheData.sexe) )
// 9. Le SEXE a un et un seul choix
if( ficheData.sexe == '' )
return false;
// 9. La SITUATION FAMILIALE a un et un seul choix
if( !checkRadioValue(ficheData.famsit) )
// 10. La SITUATION FAMILIALE a un et un seul choix
if( ficheData.famsit == '' )
return false;
// 10. Le TYPE DE RELATION a un et un seul choix
if( !checkRadioValue(ficheData.reltype) )
// 11. Le TYPE DE RELATION a un et un seul choix
if( ficheData.reltype == '' )
return false;
// 11. La DISTANCE DE DOMICILE (location) a un et un seul choix
if( !checkRadioValue(ficheData.loc) )
// 12. La DISTANCE DE DOMICILE (location) a un et un seul choix
if( ficheData.loc == '' )
return false;
// 12. Le CONTEXTE DE RENCONTRE a un et un seul choix
if( !checkRadioValue(ficheData.context) )
// 13. Le CONTEXTE DE RENCONTRE a un et un seul choix
if( ficheData.context == '' )
return false;
// 13. Les FRÉQUENCES ont un et un seul choix (par question de fréquence)
// 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( !checkRadioValue( ficheData.freq[i] ) )
if( ficheData.freq[i] == '' )
return false;
// 14. Les CONNECTION ont un et un seul choix (par question de connection)
// 15. Les CONNECTION ont un et un seul choix (par question de connection)
for( var i = 0 ; i < ficheData.connect.length ; i++ )
if( !checkRadioValue( ficheData.connect[i] ) )
if( ficheData.connect[i] == '' )
return false;
// {4} <input> dépendant d'un choix d'un <input> radio //
// 15. TYPE DE RELATION si autre est coché (indice 8), reltypeSpecial doit avoir au moins 2 caractère
if( ficheData.reltype[8].status && ficheData.reltypeSpecial.length < 2 )
// 16. TYPE DE RELATION si autre est coché (indice 8), reltypeSpecial doit avoir au moins 2 caractère
if( ficheData.reltype == '8' && ficheData.reltypeSpecial.length < 2 )
return false;
// 16. CONTEXTE DE RELATION si est coché indice 11, contactSpecial[0] doit avoir au moins 2 caractères
if( ficheData.context[11].status && ficheData.contextSpecial[0].length < 2 )
// 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;
// 17. CONTEXTE DE RELATION si est coché indice 12, contextSpecial[1] doit avoir au moins 2 caractères
if( ficheData.context[12].status && ficheData.contextSpecial[1].length < 2 )
// 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;
// 18. CONTEXTE DE RELATION si est coché indice 13, contextSpecial[2] doit avoir au moins 2 caractères
if( ficheData.context[13].status && ficheData.contextSpecial[2].length < 2 )
// 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;
// 19. Si tout s'est bien passé, on retourne TRUE
// 20. Si tout s'est bien passé, on retourne TRUE
return true;
};

View File

@ -1,5 +1,5 @@
function inputPhoneMatrice(a){this.container=a}inputPhoneMatrice.prototype={container:this.container};
inputPhoneMatrice.prototype.fieldsToStorage=function(){console.log("MATRICE: FIELDS TO STORAGE");var a=(new FormDeflater(this.container,["input"],["data-name"])).deflate();crc32(JSON.stringify(a));var d={},b;for(b in a)if(a[b]instanceof Array)for(var e in a[b])!0===a[b][e].status&&(null==d[b]&&(d[b]=[]),d[b].push(parseInt(a[b][e].value)));else!0===a[b].status&&(null==d[b]&&(d[b]=[]),d[b].push(parseInt(a[b].value)));lsi.set("matrice",0,d)};
inputPhoneMatrice.prototype.storageToFields=function(){console.log("MATRICE: STORAGE TO FIELDS");var a=lsi["export"]("fiches"),d=lsi.get("matrice",0),b=lsi["export"]("contacts"),e=[],c;for(c in a)-1==e.indexOf(a[c].contact)&&e.push(a[c].contact);a="<table class='line'>";for(c=0;c<e.length;c++){var f=b[c],a=a+"<tr>";0<c?(a+='<td style="text-align: right;">',a+=f.firstname+" "+f.lastname,a+=0<f.username.length?" ("+f.username+")":"",a+="</td>"):a+="<td></td>";for(var h=0;h<e.length;h++)if(h<e.length-
1){var g=b[h];0==c?(a+="<td>",a+='<span style="writing-mode: vertical-lr; text-align: right;">',a+=g.firstname+" "+g.lastname,a+=0<g.username.length?" ("+g.username+")":"",a+="</span>"):h<c?(a+="<td>",a+="<input type='checkbox' name='matrice_"+f.uid+"_"+g.uid+"' data-name='"+f.uid+"' value='"+g.uid+"' id='matrice_"+f.uid+"_"+g.uid+"'",null!=d[c]&&-1<d[c].indexOf(h)&&(a+=" checked"),a+=" >",a+="<label for='matrice_"+f.uid+"_"+g.uid+"'></label>"):a+="<td class='hidden'>";a+="</td>"}a+="</tr>"}this.container.innerHTML=
a+"</table>"};inputPhoneMatrice.prototype.attach=function(){console.log("MATRICE: ATTACH");lsi.createDataset("matrice");this.storageToFields();var a=this;this.container.addEventListener("click",function(d){a.fieldsToStorage();a.storageToFields()},!1)};
inputPhoneMatrice.prototype.fieldsToStorage=function(){console.log("MATRICE: FIELDS TO STORAGE");var a=(new FormDeflater(this.container,["input"],["data-name"])).deflate();crc32(JSON.stringify(a));var d={},b;for(b in a)if(a[b]instanceof Array)for(var e in a[b])null==d[b]&&(d[b]=[]),d[b].push(parseInt(a[b][e]));else null!==a[b]&&(null==d[b]&&(d[b]=[]),d[b].push(parseInt(a[b])));lsi.set("matrice",0,d)};
inputPhoneMatrice.prototype.storageToFields=function(){console.log("MATRICE: STORAGE TO FIELDS");var a=lsi["export"]("fiches"),d=lsi.get("matrice",0),b=lsi["export"]("contacts"),e=[],c;for(c in a)-1==e.indexOf(a[c].contact)&&e.push(a[c].contact);a="<table class='line'>";for(c=0;c<e.length;c++){var f=b[c],a=a+"<tr>";0<c?(a+='<td style="text-align: right;">',a+=readableName(f.username,f.firstname,f.lastname),a+="</td>"):a+="<td></td>";for(var h=0;h<e.length;h++)if(h<e.length-1){var g=b[h];0==c?(a+=
"<td>",a+='<span style="writing-mode: vertical-lr; text-align: right;">',a+=readableName(g.username,g.firstname,g.lastname),a+="</span>"):h<c?(a+="<td>",a+="<input type='checkbox' name='matrice_"+f.uid+"_"+g.uid+"' data-name='"+f.uid+"' value='"+g.uid+"' id='matrice_"+f.uid+"_"+g.uid+"'",null!=d[c]&&-1<d[c].indexOf(h)&&(a+=" checked"),a+=" >",a+="<label for='matrice_"+f.uid+"_"+g.uid+"'></label>"):a+="<td class='hidden'>";a+="</td>"}a+="</tr>"}this.container.innerHTML=a+"</table>"};
inputPhoneMatrice.prototype.attach=function(){console.log("MATRICE: ATTACH");lsi.createDataset("matrice");this.storageToFields();var a=this;this.container.addEventListener("click",function(d){a.fieldsToStorage();a.storageToFields()},!1)};

View File

@ -37,20 +37,19 @@ inputPhoneMatrice.prototype.fieldsToStorage = function(){
if( deflated[i] instanceof Array ){
// Pour chacune des différentes relations, on ajoute si TRUE
for( var a in deflated[i] )
if( deflated[i][a].status === true ){
for( var a in deflated[i] ){
if( obj[i] == null )
obj[i] = [];
obj[i].push( parseInt(deflated[i][a].value) );
obj[i].push( parseInt(deflated[i][a]) );
}
// {2} Si il n'y a qu'un sujet //
}else if( deflated[i].status === true ){
}else if( deflated[i] !== null ){
if( obj[i] == null )
obj[i] = [];
obj[i].push( parseInt(deflated[i].value) );
obj[i].push( parseInt(deflated[i]) );
}
lsi.set( 'matrice', 0, obj );
@ -109,8 +108,7 @@ inputPhoneMatrice.prototype.storageToFields = function(){
if( A > 0 ){ // Noms sur la première ligne (abscisses)
matrice_html += '<td style="text-align: right;">';
matrice_html += conA.firstname+' '+conA.lastname
matrice_html += (conA.username.length>0) ? ' ('+conA.username+')' : '';
matrice_html += readableName(conA.username, conA.firstname, conA.lastname);
matrice_html += '</td>';
}else // Sinon,
matrice_html += '<td></td>';
@ -123,8 +121,7 @@ inputPhoneMatrice.prototype.storageToFields = function(){
if( A == 0 ){
matrice_html += '<td>';
matrice_html += '<span style="writing-mode: vertical-lr; text-align: right;">';
matrice_html += conB.firstname+' '+conB.lastname;
matrice_html += (conB.username.length>0) ? ' ('+conB.username+')' : '';
matrice_html += readableName(conB.username, conB.firstname, conB.lastname),
matrice_html += '</span>';
// {4} Valeurs des relations (boutons) //

View File

@ -1,10 +1,11 @@
function inputPhoneMini(a,b){this.container=a;this.nav_container=b}inputPhoneMini.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null,defaultData:{sexe:[defTrue,defFalse],age:".",studies:".",loc:[defTrue,defFalse,defFalse,defFalse],reltype:[defTrue,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse,defFalse],reltypeSpecial:"",timestamp:0,valid:!1}};
inputPhoneMini.prototype.fieldsToStorage=function(){console.log("MINI FICHE: FIELDS TO STORAGE");for(var a=$$("article.mini-relation-panel .mini-fiche-relation"),b=0;b<a.length;b++){var c=(new FormDeflater(a[b],["input","select"],["data-name"])).deflate(),e=crc32(JSON.stringify(c)),d=lsi.get("mini-fiches",c.uid.value);if(!1!==d){if(null!=d.hash&&d.hash==e)break;console.warn("> MINI UPDATE");c={uid:parseInt(c.uid.value),firstname:d.firstname,lastname:d.lastname,username:d.username,sexe:c.sexe,age:c.age.value,
studies:c.studies.value,reltype:c.reltype,reltypeSpecial:c.reltypeSpecial.value,loc:c.loc,hash:e};c.valid=this.check(c);0<diff(d,c).length&&(console.warn("> FICHE UPDATE"),c.timestamp=Date.now());lsi.set("mini-fiches",c.uid,c)}}};
function inputPhoneMini(a,b){this.container=a;this.nav_container=b}inputPhoneMini.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null,defaultData:{sexe:"H",age:".",studies:".",loc:"0",reltype:"0",reltypeSpecial:"",timestamp:0,valid:!1}};
inputPhoneMini.prototype.fieldsToStorage=function(){console.log("MINI FICHE: FIELDS TO STORAGE");for(var a=$$("article.mini-relation-panel .mini-fiche-relation"),b=0;b<a.length;b++){var c=(new FormDeflater(a[b],["input","select"],["data-name"])).deflate(),e=crc32(JSON.stringify(c)),d=lsi.get("mini-fiches",c.uid);if(!1!==d){if(null!=d.hash&&d.hash==e)break;console.warn("> MINI UPDATE");c={uid:parseInt(c.uid),sexe:c.sexe,age:c.age,studies:c.studies,reltype:c.reltype,reltypeSpecial:c.reltypeSpecial,
loc:c.loc,hash:e};c.valid=this.check(c);0<diff(d,c,["hash","valid","timestamp"]).length&&(console.log(diff(d,c,["hash","valid","timestamp"])),console.warn("> FICHE UPDATE"),c.timestamp=Date.now());lsi.set("mini-fiches",c.uid,c)}}};
inputPhoneMini.prototype.add=function(a){console.log("MINI FICHE: ADD");if(null==a||null==a.uid)return!1;a.age=null!=a.age?a.age:this.defaultData.age;a.sexe=null!=a.sexe?a.sexe:this.defaultData.sexe;a.studies=null!=a.studies?a.studies:this.defaultData.studies;a.reltype=null!=a.reltype?a.reltype:this.defaultData.reltype;a.reltypeSpecial=null!=a.reltypeSpecial?a.reltypeSpecial:this.defaultData.reltypeSpecial;a.loc=null!=a.loc?a.loc:this.defaultData.loc;var b=lsi.get("contacts",a.uid);if(!1===b)return!1;
this.container.innerHTML+=miniFicheBuilder.build({firstname:b.firstname,lastname:b.lastname,username:0==b.username.length?"":"("+b.username+")",countcall:b.countcall,countsms:b.countsms,uid:a.uid,reltypespecial:a.reltypeSpecial});b=$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+a.studies+'"]');null!=b&&b.setAttribute("selected","selected");b=$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+
a.age+'"]');null!=b&&b.setAttribute("selected","selected");for(var c=$$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'),b=0;b<c.length&&b<a.sexe.length;b++)a.sexe[b].status?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]');for(b=0;b<c.length&&b<a.reltype.length;b++)a.reltype[b].status?c[b].setAttribute("checked",
"checked"):c[b].removeAttribute("checked");c=$$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="loc"]');for(b=0;b<c.length&&b<a.loc.length;b++)a.loc[b].status?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked")};inputPhoneMini.prototype.storageToFields=function(){console.log("MINI FICHE: STORAGE TO FIELDS");var a=lsi.get("mini-fiches",this.selected);this.container.innerHTML="";this.add(a);this.updateNavBar()};
inputPhoneMini.prototype.sync=function(){console.log("MINI FICHE: SYNC");var a=lsi["export"]("contacts"),b;for(b in a){var c=lsi.get("mini-fiches",b);null==c&&(c=this.defaultData,c.valid=!1);c.uid=a[b].uid;lsi.set("mini-fiches",b,c)}};inputPhoneMini.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"nav-mini"!=a.parentNode.id)return!1;for(var b=$$("#nav-mini > span.active"),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputPhoneMini.prototype.updateNavBar=function(){var a=lsi["export"]("mini-fiches"),b=Object.keys(a).length;if($$("#nav-mini [data-n]").length!=b){this.nav_container.innerHTML="";for(var c=0;c<b;c++)this.nav_container.innerHTML+='<span data-n="'+c+'">'+(c+1)+"</span>"}for(var e in a)b=$('#nav-mini [data-n="'+a[e].uid+'"]'),null!=b&&(!0===a[e].valid?b.addClass("done"):b.remClass("done"));this.nav($('#nav-mini [data-n="'+this.selected+'"]'))};
inputPhoneMini.prototype.check=function(a){return!checkRadioValue(a.sexe)||"."==a.studies||"."==a.age||!checkRadioValue(a.loc)||!checkRadioValue(a.reltype)||a.reltype[8].status&&2>a.reltypeSpecial.length?!1:!0};inputPhoneMini.prototype.attach=function(a){console.log("MINI FICHE: ATTACH");lsi.createDataset("mini-fiches");this.storageToFields();this.handler=a;var b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};
this.container.innerHTML+=miniFicheBuilder.build({name:readableName(b.username,b.firstname,b.lastname),countcall:b.countcall,countsms:b.countsms,uid:a.uid,reltypespecial:a.reltypeSpecial});b=$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+a.studies+'"]');null!=b&&b.setAttribute("selected","selected");b=$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+
a.age+'"]');null!=b&&b.setAttribute("selected","selected");for(var c=$$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'),b=0;b<c.length;b++)c[b].value==a.sexe?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]');for(b=0;b<c.length;b++)c[b].value==a.reltype?c[b].setAttribute("checked","checked"):
c[b].removeAttribute("checked");c=$$('article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="loc"]');for(b=0;b<c.length;b++)c[b].value==a.loc?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked")};inputPhoneMini.prototype.storageToFields=function(){console.log("MINI FICHE: STORAGE TO FIELDS");var a=lsi.get("mini-fiches",this.selected);if(null==a)return this.updateNavBar(),!1;this.container.innerHTML="";this.add(a);this.updateNavBar()};
inputPhoneMini.prototype.sync=function(){console.log("MINI FICHE: SYNC");var a=lsi["export"]("contacts"),b=lsi["export"]("fiches"),c=[],e;for(e in b)-1==c.indexOf(b[e].contact)&&c.push(b[e].contact);for(var d in a)-1<c.indexOf(parseInt(d))?lsi.del("mini-fiches",d):(b=0==a[d].username.length+a[d].firstname.length+a[d].lastname.length?d.toString()+"-":d,e=lsi.get("mini-fiches",b),null==e&&(e=this.defaultData,e.valid=!1,isNaN(b)&&(e.reltype="9")),e.uid=parseInt(d),lsi.set("mini-fiches",b,e))};
inputPhoneMini.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"nav-mini"!=a.parentNode.id)return!1;for(var b=$$("#nav-mini > span.active"),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputPhoneMini.prototype.updateNavBar=function(){var a=lsi["export"]("mini-fiches");this.nav_container.innerHTML="";var b=0,c;for(c in a)isNaN(c)||(this.nav_container.innerHTML+='<span data-n="'+c+'">'+ ++b+"</span>");for(c in a)isNaN(c)||(b=$('#nav-mini [data-n="'+a[c].uid+'"]'),null!=b&&(!0===a[c].valid?b.addClass("done"):b.remClass("done")));this.nav($('#nav-mini [data-n="'+this.selected+'"]'))};
inputPhoneMini.prototype.check=function(a){return""==a.sexe||"."==a.studies||"."==a.age||""==a.loc||""==a.reltype||"8"==a.reltype&&2>a.reltypeSpecial.length?!1:!0};inputPhoneMini.prototype.attach=function(a){console.log("MINI FICHE: ATTACH");lsi.createDataset("mini-fiches");this.storageToFields();this.handler=a;var b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};

View File

@ -13,12 +13,11 @@ inputPhoneMini.prototype = {
selected: 0, // UID de la MINI fiche sélectionnée
handler: null, // Fonction pour l'enregistrement et la synchronisation des données
defaultData: { // Valeur par défaut
sexe: [defTrue, defFalse],
sexe: 'H',
age: '.',
studies: '.',
loc: [defTrue, defFalse, defFalse, defFalse],
reltype: [ defTrue, defFalse, defFalse, defFalse, defFalse,
defFalse, defFalse, defFalse, defFalse], // Choix 1 à 9
loc: '0',
reltype: '0',
reltypeSpecial: '',
timestamp: 0,
valid: false
@ -31,7 +30,7 @@ inputPhoneMini.prototype = {
inputPhoneMini.prototype.fieldsToStorage = function(){
console.log('MINI FICHE: FIELDS TO STORAGE');
// {1} Pour chaque formulaire de contact présent //
// {1} Pour chaque formulaire de MINI fiche à l'écran //
var existingMiniFiches = $$('article.mini-relation-panel .mini-fiche-relation');
for( var i = 0 ; i < existingMiniFiches.length ; i++ ){
// {2} On initialise notre deflater pour récupérer les valeurs //
@ -47,7 +46,7 @@ inputPhoneMini.prototype.fieldsToStorage = function(){
// {4} On récupère les données du LSI si elles existent //
var existingData = lsi.get('mini-fiches', deflated.uid.value);
var existingData = lsi.get('mini-fiches', deflated.uid);
// Si n'existe pas, on passe à la suivante
if( existingData === false )
@ -63,15 +62,12 @@ inputPhoneMini.prototype.fieldsToStorage = function(){
var obj = {
uid: parseInt(deflated.uid.value),
firstname: existingData.firstname,
lastname: existingData.lastname,
username: existingData.username,
uid: parseInt(deflated.uid),
sexe: deflated.sexe, // [0] Homme, [1] Femme
age: deflated.age.value,
studies: deflated.studies.value,
age: deflated.age,
studies: deflated.studies,
reltype: deflated.reltype, // [0] ...
reltypeSpecial: deflated.reltypeSpecial.value,
reltypeSpecial: deflated.reltypeSpecial,
loc: deflated.loc, // [0] Choix 1 -> [3] Choix 4
hash: deflatedHash
};
@ -80,7 +76,8 @@ inputPhoneMini.prototype.fieldsToStorage = function(){
obj.valid = this.check(obj);
// On met à jour la date de modification, si on a pas qu'@uid de différent
if( diff(existingData, obj).length > 0 ){
if( diff(existingData, obj, ['hash', 'valid', 'timestamp']).length > 0 ){
console.log( diff(existingData, obj, ['hash', 'valid', 'timestamp']) );
console.warn('> FICHE UPDATE');
obj.timestamp = Date.now();
}
@ -133,9 +130,7 @@ inputPhoneMini.prototype.add = function(objectData){
// {2} Création physique //
this.container.innerHTML += miniFicheBuilder.build({
firstname: associatedContact.firstname,
lastname: associatedContact.lastname,
username: (associatedContact.username.length==0) ? '' : '('+associatedContact.username+')',
name: readableName(associatedContact.username, associatedContact.firstname, associatedContact.lastname),
countcall: associatedContact.countcall,
countsms: associatedContact.countsms,
uid: objectData.uid,
@ -155,20 +150,20 @@ inputPhoneMini.prototype.add = function(objectData){
/* {5} On sélectionna la valeur des boutons <radio> pour le SEXE */
var sexeCreated = $$('article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]');
for( var i = 0 ; i < sexeCreated.length && i < objectData.sexe.length ; i++ )
if( objectData.sexe[i].status ) sexeCreated[i].setAttribute('checked', 'checked');
for( var i = 0 ; i < sexeCreated.length ; i++ )
if( sexeCreated[i].value == objectData.sexe ) sexeCreated[i].setAttribute('checked', 'checked');
else sexeCreated[i].removeAttribute('checked');
/* {6} On sélectionna la valeur des boutons <radio> pour le TYPE DE RELATION */
var reltypeCreated = $$('article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]');
for( var i = 0 ; i < reltypeCreated.length && i < objectData.reltype.length ; i++ )
if( objectData.reltype[i].status ) reltypeCreated[i].setAttribute('checked', 'checked');
for( var i = 0 ; i < reltypeCreated.length ; i++ )
if( reltypeCreated[i].value == objectData.reltype ) reltypeCreated[i].setAttribute('checked', 'checked');
else reltypeCreated[i].removeAttribute('checked');
/* {7} On sélectionna la valeur des boutons <radio> pour la LOCATION */
var locCreated = $$('article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="loc"]');
for( var i = 0 ; i < locCreated.length && i < objectData.loc.length ; i++ )
if( objectData.loc[i].status ) locCreated[i].setAttribute('checked', 'checked');
for( var i = 0 ; i < locCreated.length ; i++ )
if( locCreated[i].value == objectData.loc ) locCreated[i].setAttribute('checked', 'checked');
else locCreated[i].removeAttribute('checked');
};
@ -190,6 +185,12 @@ inputPhoneMini.prototype.storageToFields = function(){
// {1} Pour chaque contact du 'localStorage' //
var miniData = lsi.get('mini-fiches', this.selected);
// Si on a rien trouvé, on ne fait rien
if( miniData == null ){
this.updateNavBar();
return false;
}
// On réinitialise le HTML
this.container.innerHTML = '';
@ -219,25 +220,51 @@ inputPhoneMini.prototype.sync = function(){
/* (1) On récupère les clés de tous les CONTACTS */
var contactData = lsi.export('contacts');
/* (2) Pour chaque CONTACT, on met à jour/crée la MINI fiche associée */
/* (2) On enregistre les contacts qui sont déja dans les FICHES */
var fiches = lsi.export('fiches');
var ignoredContacts = [];
for( var id in fiches )
if( ignoredContacts.indexOf( fiches[id].contact ) == -1 )
ignoredContacts.push( fiches[id].contact );
/* (3) Pour chaque CONTACT, on met à jour/crée la MINI fiche associée */
for( var key in contactData ){
/* (3) On récupère les informations de la MINI (si elle existe) */
var miniData = lsi.get('mini-fiches', key);
/* (4) Si le contact est déja dans une fiche, on le retire */
if( ignoredContacts.indexOf(parseInt(key)) > -1 ){
// On supprime au cas ou
lsi.del('mini-fiches', key);
continue;
}
/* (5) Si le contact n'a aucun nominatif, on met inconnu par défaut, mais on ne l'affiche pas */
var noName = contactData[key].username.length+contactData[key].firstname.length+contactData[key].lastname.length == 0;
// On rajoute un '.' après pour dire qu'on affichera pas
var uid = noName ? key.toString()+'-' : key;
/* (5) On récupère les informations de la MINI (si elle existe) */
var miniData = lsi.get('mini-fiches', uid);
/* (4) Si la MINI fiche n'exise pas, on la crée avec les valeurs par défaut */
/* (6) Si la MINI fiche n'exise pas, on la crée avec les valeurs par défaut */
if( miniData == null ){
miniData = this.defaultData;
miniData.valid = false;
// Si aucun nom, on met 'inconnu' par défaut pour la fiche de relation
if( isNaN(uid) )
miniData.reltype = '9';
}
/* (5) On met à jour la MINI fiche */
miniData.uid = contactData[key].uid;
/* (7) On met à jour la MINI fiche */
miniData.uid = parseInt(key);
/* (6) On enregistre les modification */
lsi.set('mini-fiches', key, miniData);
/* (8) On enregistre les modification */
lsi.set('mini-fiches', uid, miniData);
}
@ -279,24 +306,24 @@ inputPhoneMini.prototype.nav = function(element){
=========================================================*/
inputPhoneMini.prototype.updateNavBar = function(){
var miniData = lsi.export('mini-fiches');
var len = Object.keys(miniData).length;
/* (1) On vérifie si la barre de navigation est à jour */
var navBarUpToDate = $$('#nav-mini [data-n]').length == len;
/* (2) On vide et remplit la barre de nav, si elle n'est pas à jour */
if( !navBarUpToDate ){
/* (1) On vide et remplit la barre de nav, si elle n'est pas à jour */
this.nav_container.innerHTML = '';
var i = 0;
for( var i = 0 ; i < len ; i++ )
this.nav_container.innerHTML += '<span data-n="'+i+'">'+(i+1)+'</span>';
}
for( var key in miniData )
if( !isNaN(key) ) // On affiche que les clés numériques
this.nav_container.innerHTML += '<span data-n="'+key+'">'+(++i)+'</span>';
/* (3) On montre les MINI fiches qui sont correctes dans la navbar */
/* (2) On montre les MINI fiches qui sont correctes dans la navbar */
for( var key in miniData ){
// Si la clé n'est pas numérique, on ne gère pas
if( isNaN(key) )
continue;
var currentElement = $('#nav-mini [data-n="'+miniData[key].uid+'"]');
if( currentElement == null )
@ -315,7 +342,7 @@ inputPhoneMini.prototype.updateNavBar = function(){
/* (4) On séléctionne par défaut la dernière MINI fiche sélectionnée */
/* (3) On séléctionne par défaut la dernière MINI fiche sélectionnée */
this.nav( $('#nav-mini [data-n="'+this.selected+'"]') );
};
@ -327,7 +354,7 @@ inputPhoneMini.prototype.updateNavBar = function(){
inputPhoneMini.prototype.check = function(miniData){
// 1. Le sexe est défini
if( !checkRadioValue(miniData.sexe) )
if( miniData.sexe == '' )
return false;
// 2. Le métier est défini
if( miniData.studies == '.' )
@ -336,13 +363,13 @@ inputPhoneMini.prototype.check = function(miniData){
if( miniData.age == '.' )
return false;
// 4. La distance de localisation est définie
if( !checkRadioValue(miniData.loc) )
if( miniData.loc == '' )
return false;
// 5. Le TYPE DE RELATION a un et un seul choix
if( !checkRadioValue(miniData.reltype) )
if( miniData.reltype == '' )
return false;
// 6. TYPE DE RELATION si autre est coché (indice 8), reltypeSpecial doit avoir au moins 2 caractère
if( miniData.reltype[8].status && miniData.reltypeSpecial.length < 2 )
if( miniData.reltype == '8' && miniData.reltypeSpecial.length < 2 )
return false;

View File

@ -1,4 +1,4 @@
function inputPhoneSubject(a,b,c,d,e){this.number=a;this.username=b;this.firstname=c;this.lastname=d;this.store_button=e}inputPhoneSubject.prototype={store_button:this.store_button,number:this.number,username:this.username,firstname:this.firstname,lastname:this.lastname};
inputPhoneSubject.prototype.fieldsToStorage=function(){console.log("SUBJECT: FIELDS TO STORAGE");var a=0<this.number.value.length,a=a&&0<this.username.value.length+this.firstname.value.length+this.lastname.value.length;if(!a)return!1;lsi.set("subject",0,{number:this.number.value,username:this.username.value,firstname:this.firstname.value,lastname:this.lastname.value})};
function inputPhoneSubject(a,b,c,d,e){this.number=a;this.username=b;this.firstname=c;this.lastname=d;this.store_button=e}inputPhoneSubject.prototype={store_button:this.store_button,number:this.number,username:this.username,firstname:this.firstname,lastname:this.lastname};inputPhoneSubject.prototype.check=function(){var a=0<this.number.value.length;return a=a&&0<this.username.value.length+this.firstname.value.length+this.lastname.value.length};
inputPhoneSubject.prototype.fieldsToStorage=function(){console.log("SUBJECT: FIELDS TO STORAGE");if(!this.check())return!1;lsi.set("subject",0,{number:this.number.value,username:this.username.value,firstname:this.firstname.value,lastname:this.lastname.value})};
inputPhoneSubject.prototype.storageToFields=function(){console.log("SUBJECT: STORAGE TO FIELDS");var a=lsi.get("subject",0);null==a&&(a={number:"",username:"",firstname:"",lastname:""});this.number.value=a.number;this.username.value=a.username;this.firstname.value=a.firstname;this.lastname.value=a.lastname};
inputPhoneSubject.prototype.attach=function(){console.log("SUBJECT: ATTACH");lsi.createDataset("subject");var a=this;this.store_button.addEventListener("click",function(b){a.fieldsToStorage()},!1);this.storageToFields()};
inputPhoneSubject.prototype.attach=function(){function a(a){b.fieldsToStorage()&&b.storageToFields()}console.log("SUBJECT: ATTACH");lsi.createDataset("subject");var b=this;this.store_button.addEventListener("click",a,!1);this.number.addEventListener("blur",a,!1);this.username.addEventListener("blur",a,!1);this.firstname.addEventListener("blur",a,!1);this.lastname.addEventListener("blur",a,!1);this.storageToFields()};

View File

@ -20,19 +20,26 @@ inputPhoneSubject.prototype = {
};
/* [2] Gestion de l'enregistrement des formulaires de contact
/* [2] Vérification d'un formulaire
=========================================================*/
inputPhoneSubject.prototype.check = function(){
/* (1) Le numéro n'est pas vide */
var validForm = this.number.value.length > 0;
/* (2) ET le pseudo et/ou le prénom et/ou le nom n'est pas vide */
validForm = validForm && this.username.value.length+this.firstname.value.length+this.lastname.value.length > 0;
// On renvoie la validité du formulaire
return validForm;
};
/* [3] Gestion de l'enregistrement des formulaires de contact
=========================================================*/
inputPhoneSubject.prototype.fieldsToStorage = function(){
console.log('SUBJECT: FIELDS TO STORAGE');
// {1} Vérification des champs //
// Le numéro n'est pas vide
var validForm = this.number.value.length > 0;
// ET le pseudo et/ou le prénom et/ou le nom n'est pas vide
validForm = validForm && this.username.value.length+this.firstname.value.length+this.lastname.value.length > 0;
// Si le formulaire n'est pas valide, on ne l'enregistre pas
if( !validForm ) return false;
// {1} Si le formulaire n'est pas valide, on ne l'enregistre pas //
if( !this.check() ) return false;
// {2} On récupère et met en forme les valeurs du deflater //
var obj = {
@ -52,7 +59,7 @@ inputPhoneSubject.prototype.fieldsToStorage = function(){
/* [3] Gestion de l'affichage depuis le 'localStorage'
/* [4] Gestion de l'affichage depuis le 'localStorage'
=========================================================*/
inputPhoneSubject.prototype.storageToFields = function(){
console.log('SUBJECT: STORAGE TO FIELDS');
@ -72,7 +79,7 @@ inputPhoneSubject.prototype.storageToFields = function(){
/* [4] Point d'amorçage de la gestion des contacts
/* [5] Point d'amorçage de la gestion des contacts
=========================================================*/
inputPhoneSubject.prototype.attach = function(){
console.log('SUBJECT: ATTACH');
@ -80,10 +87,21 @@ inputPhoneSubject.prototype.attach = function(){
/* (1) On initialise le jeu de données */
lsi.createDataset('subject');
/* (2) On attache l'évènement sur le bouton d'ajout de contact */
// Pointeur pour les scopes des addEventListener()
var ptr = this;
this.store_button.addEventListener('click', function(e){ ptr.fieldsToStorage(); }, false);
// Handler de mise à jour quand les champs sont bons
function fts(e){ if( ptr.fieldsToStorage() ) ptr.storageToFields(); }
/* (3) On charge le sujet depuis la mémoire ('localStorage') */
/* (2) On attache l'évènement sur le bouton d'enregistrement */
this.store_button.addEventListener('click', fts, false);
/* (3) On attache un évènement de 'blur' sur chaque '<input type="text">' */
this.number.addEventListener( 'blur', fts, false);
this.username.addEventListener( 'blur', fts, false);
this.firstname.addEventListener( 'blur', fts, false);
this.lastname.addEventListener( 'blur', fts, false);
/* (4) On charge le sujet depuis la mémoire ('localStorage') */
this.storageToFields();
};

4
js/lib/api-min.js vendored
View File

@ -1,3 +1,3 @@
function APIClass(b){this.target=b}
APIClass.prototype={xhr:[],send:function(b,d,g){b.hasOwnProperty("path")||d({ModuleError:4});for(var a=0;a<this.xhr.length;a++)4==this.xhr[a].readyState&&(this.xhr=this.xhr.slice(0,a-1).concat(this.xhr.slice(a,this.xhr.length-1)));this.xhr.push(null);a=this.xhr.length-1;this.xhr[a]=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHttpRequest");console.log(b);var f=this;this.xhr[a].onreadystatechange=function(){if(4==f.xhr[a].readyState)if(-1<[0,200].indexOf(f.xhr[a].status))try{d(JSON.parse(f.xhr[a].responseText))}catch(b){d({ModuleError:-1,
ErrorDescription:"Erreur au niveau de api.js"})}else d({ModuleError:3})};var e=new FormData,c;for(c in b)"path"==c?e.append(c,b[c]):b[c]instanceof File?e.append(c,b[c]):e.append(c,JSON.stringify(b[c]));this.xhr[a].open("POST",this.target,!0);null!=g&&this.xhr[a].setRequestHeader("Authorization","Digest "+g);this.xhr[a].send(e)}};
APIClass.prototype={xhr:[],buffer:null,send:function(b,e,g){b.hasOwnProperty("path")||e({ModuleError:4});for(var a=0;a<this.xhr.length;a++)4==this.xhr[a].readyState&&(this.xhr=this.xhr.slice(0,a-1).concat(this.xhr.slice(a,this.xhr.length-1)));this.xhr.push(null);a=this.xhr.length-1;this.xhr[a]=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHttpRequest");console.log(b);var d=this;this.xhr[a].onreadystatechange=function(){if(4==d.xhr[a].readyState)if(d.buffer=d.xhr[a].responseText,
-1<[0,200].indexOf(d.xhr[a].status))try{e(JSON.parse(d.xhr[a].responseText))}catch(b){e({ModuleError:-1,ErrorDescription:"Erreur au niveau de api.js"})}else e({ModuleError:3})};var f=new FormData,c;for(c in b)"path"==c?f.append(c,b[c]):b[c]instanceof File?f.append(c,b[c]):f.append(c,JSON.stringify(b[c]));this.xhr[a].open("POST",this.target,!0);null!=g&&this.xhr[a].setRequestHeader("Authorization","Digest "+g);this.xhr[a].send(f)}};

View File

@ -4,6 +4,7 @@ function APIClass(target){ this.target = target; }
APIClass.prototype = {
xhr: [], // tableau d'objets pour les requêtes ajax
buffer: null,
/* transaction avec le serveur (http://host/api/)
*
@ -54,6 +55,7 @@ APIClass.prototype = {
this.xhr[i].onreadystatechange = function(){
if( ptrAPI.xhr[i].readyState == 4 ){ // si la requête est terminée
ptrAPI.buffer = ptrAPI.xhr[i].responseText;
/* DEBUG : affiche la réponse BRUTE de http://host/api/ */
// console.log('http://host/api/ => '+ptrAPI.xhr[i].responseText);
// console.log( JSON.parse(ptrAPI.xhr[i].responseText) );

View File

@ -1,3 +1,5 @@
function FormDeflater(b,c,a){for(var d=0;d<c.length;d++)c[d]=c[d].toLowerCase();for(d=0;d<a.length;d++)a[d]=a[d].toLowerCase();this.container=b;this.tags=c;this.attr=a}
FormDeflater.prototype={container:this.container,tags:this.tags,attr:this.attr,deflate:function(){for(var b=this.getChildren(this.container),b=this.filterElements(b),c={},a=0;a<b.length;a++)for(var d=0;d<this.attr.length;d++){var e=b[a].getAttribute(this.attr[d]);if(null!==e&&0<e.length){c.hasOwnProperty(e)?c[e]instanceof Array?c[e].push({value:b[a].value,status:b[a].checked}):c[e]=[c[e],{value:b[a].value,status:b[a].checked}]:c[e]={value:b[a].value,status:b[a].checked};break}}return c},getChildren:function(b){if(!(b instanceof
Element))return[];for(var c=b=[].slice.call(b.children),a=0;a<b.length;a++)c=c.concat([].slice.call(this.getChildren(b[a])));return c},filterElements:function(b){for(var c=[],a=0;a<b.length;a++)-1<this.tags.indexOf(b[a].tagName.toLowerCase())&&c.push(b[a]);return c}};
function FormDeflater(b,c,a){for(var d=0;d<c.length;d++)c[d]=c[d].toLowerCase();for(d=0;d<a.length;d++)a[d]=a[d].toLowerCase();this.container=b;this.tags=c;this.attr=a}FormDeflater.prototype={container:this.container,tags:this.tags,attr:this.attr};
FormDeflater.prototype.deflate=function(){for(var b=this.getChildren(this.container),b=this.filterElements(b),c={},a=0;a<b.length;a++)for(var d=0;d<this.attr.length;d++){var e=b[a].getAttribute(this.attr[d]);if(null!==e&&0<e.length){c.hasOwnProperty(e)?c[e]instanceof Array?c[e].push({target:b[a],attr:this.attr[d],value:b[a].value,checked:b[a].checked}):c[e]=[c[e],{target:b[a],attr:this.attr[d],value:b[a].value,checked:b[a].checked}]:c[e]={target:b[a],attr:this.attr[d],value:b[a].value,checked:b[a].checked};
break}}return c=this.cleanOutput(c)};FormDeflater.prototype.checkable=function(b){return"INPUT"!=b.tagName||-1==["radio","checkbox"].indexOf(b.getAttribute("type").toLowerCase())?!1:!0};
FormDeflater.prototype.cleanOutput=function(b){var c={},a;for(a in b)if(b[a]instanceof Array){var d=!0,e=[],f;for(f in b[a])if(this.checkable(b[a][f].target))!0===b[a][f].checked&&e.push(f);else{d=!1;break}if(d)if(1==e.length)c[a]=b[a][e[0]].value;else for(f in c[a]=[],e)c[a].push(b[a][e[f]].value);else for(f in c[a]=[],b[a])c[a].push(b[a][f].value)}else this.checkable(b[a].target)?c[a]=b[a].checked?b[a].value:null:c[a]=b[a].value;return c};
FormDeflater.prototype.getChildren=function(b){if(!(b instanceof Element))return[];for(var c=b=[].slice.call(b.children),a=0;a<b.length;a++)c=c.concat([].slice.call(this.getChildren(b[a])));return c};FormDeflater.prototype.filterElements=function(b){for(var c=[],a=0;a<b.length;a++)-1<this.tags.indexOf(b[a].tagName.toLowerCase())&&c.push(b[a]);return c};

View File

@ -35,17 +35,17 @@ function FormDeflater(container, tags, attr){
FormDeflater.prototype = {
container: this.container, // Contiendra le 'formulaire' (<form> ou autre)
tags: this.tags, // Contiendra les balises HTML à ne pas prendre en compte
attr: this.attr, // Contiendra la liste des attributs à prendre pour nom (par ordre de priorité)
attr: this.attr // Contiendra la liste des attributs à prendre pour nom (par ordre de priorité)
};
/* RETOURNE UN OBJET CONTENANT LES DONNÉES DU FORMULAIRE
*
* @return form<Object> Objet correspondant aux données du formulaire
*
*/
deflate: function(){
/* RETOURNE UN OBJET CONTENANT LES DONNÉES DU FORMULAIRE
*
* @return form<Object> Objet correspondant aux données du formulaire
*
*/
FormDeflater.prototype.deflate = function(){
/* [1] On récupère tous les enfants
=========================================================*/
var children = this.getChildren( this.container );
@ -68,7 +68,9 @@ FormDeflater.prototype = {
// On récupère l'attribut
var attr = children[c].getAttribute(this.attr[a]);
/* (3) Si l'attribut n'est pas null ni vide */
/* (3) Si l'attribut est défini (pas null ni vide) */
if( attr !== null && attr.length > 0 ){
/* (4) Si on a pas déja un champ de même nom */
@ -77,40 +79,144 @@ FormDeflater.prototype = {
// {1} Si l'existant est un tableau, on ajoute notre valeur //
if( existing instanceof Array )
object[attr].push( { value: children[c].value, status: children[c].checked } );
object[attr].push( { target: children[c], attr: this.attr[a], value: children[c].value, checked: children[c].checked } );
// {2} Sinon, si c'est une valeur seule, on crée un tableau //
else
object[attr] = [ object[attr], { value: children[c].value, status: children[c].checked } ];
object[attr] = [ object[attr], { target: children[c], attr: this.attr[a], value: children[c].value, checked: children[c].checked } ];
/* (5) Si c'est le premier champ avec ce nom, on le crée */
}else
object[attr] = { value: children[c].value, status: children[c].checked };
object[attr] = { target: children[c], attr: this.attr[a], value: children[c].value, checked: children[c].checked };
// On en a fini pour cet élément
break;
}
}
}
}
/* [4] On met en forme les données
=========================================================*/
object = this.cleanOutput(object);
return object;
},
};
/* RETOURNE LA LISTE DE TOUS LES ÉLÉMENTS QUEL QUE SOIT LE NIVEAU HIÉRARCHIQUE
*
* @parent<Element> Parent duquel on veut les enfants
*
* @return children<Array> Tableau contenant tous les enfants
*
*/
getChildren: function(parent){
/* RETOURNE SI UN ELEMENT EST UN BOUTON DE TYPE RADIO/CHECKBOX OU NON
*
* @element<Element> Element en question
*
* @return result<Boolean> Renvoie si TRUE or FALSE il en est un
*
*/
FormDeflater.prototype.checkable = function(element){
if( element.tagName != 'INPUT' )
return false;
if( ['radio', 'checkbox'].indexOf( element.getAttribute('type').toLowerCase() ) == -1 )
return false;
return true;
};
/* NETTOIE LES DONNÉES EN SORTIE POUR QU'ELLES SOIENT UTILISABLES ET OPTIMISÉES
*
* @input<Object> Données "brutes"
*
* @return output<Object> Données sans les valeurs inutiles et explicitées
*
*/
FormDeflater.prototype.cleanOutput = function(input){
var output = {};
/* [1] On parcourt toutes les valeurs récupérées
=========================================================*/
for( var key in input ){
/* [2] Si c'est un tableau
=========================================================*/
if( input[key] instanceof Array ){
// VRAI si tous les éléments sont radio/checkbox
var areCheckable = true;
// Contiendra les indices des valeurs ou 'checked=TRUE'
var checkedIndexes = [];
/* (1) On vérifie si tous les champs sont checkables */
for( var i in input[key])
// si pas checkable, on arrête de vérifier
if( !this.checkable(input[key][i].target) ){
areCheckable = false;
break;
// Sinon si checkable et checked=TRUE, on incrémente @nbChecked
}else if( input[key][i].checked === true )
checkedIndexes.push(i);
/* (2) Si c'est que des radio ou des checkbox avec une seule valeur à TRUE */
if( areCheckable )
if( checkedIndexes.length == 1 )
output[key] = input[key][checkedIndexes[0]].value;
/* (3) Si c'est que des radio ou des checkbox avec plusieurs valeurs à TRUE */
else{
output[key] = [];
for( var i in checkedIndexes )
output[key].push( input[key][checkedIndexes[i]].value );
}
/* (4) Si c'est pas que des radio ou des checkbox, on met les valeurs */
else{
output[key] = [];
for( var i in input[key] )
output[key].push( input[key][i].value );
}
/* [3] S'il n'y a qu'une donnée (pas un tableau)
=========================================================*/
}else{
/* (1) Si de type 'radio' ou 'checkbox', on met la valeur de 'checked' */
if( this.checkable(input[key].target) )
output[key] = input[key].checked ? input[key].value : null;
/* (2) Sinon, on met la valeur de 'value' */
else
output[key] = input[key].value;
}
}
return output;
};
/* RETOURNE LA LISTE DE TOUS LES ÉLÉMENTS QUEL QUE SOIT LE NIVEAU HIÉRARCHIQUE
*
* @parent<Element> Parent duquel on veut les enfants
*
* @return children<Array> Tableau contenant tous les enfants
*
*/
FormDeflater.prototype.getChildren = function(parent){
// Si le parent n'est pas un élément, on retourne aucun enfant
if( !(parent instanceof Element) ) return [];
@ -132,34 +238,32 @@ FormDeflater.prototype = {
/* [3] On retourne le résultat
=========================================================*/
return allChildren;
},
};
/* FILTRE LES éléments en fonction de @this.tags et @this.attr
*
* @elements<Array> Le tableau contenant les éléments à trier
*
* @return filtered<Array> Retourne le tableau des éléments filtrés
*
*/
filterElements: function(elements){
/* FILTRE LES éléments en fonction de @this.tags et @this.attr
*
* @elements<Array> Le tableau contenant les éléments à trier
*
* @return filtered<Array> Retourne le tableau des éléments filtrés
*
*/
FormDeflater.prototype.filterElements = function(elements){
// Contiendra les éléments correspondants aux critères
var filtered = [];
/* [1] On parcourt tous les éléments
=========================================================*/
for( var i = 0 ; i < elements.length ; i++ ){
/* (1) Si l'élément a le bon tag, on le garde */
for( var i = 0 ; i < elements.length ; i++ )
// Si l'élément a le bon tag, on le garde
if( this.tags.indexOf( elements[i].tagName.toLowerCase() ) > -1 )
filtered.push(elements[i]);
}
/* [3] On retourne les éléments filtržés
/* [2] On retourne les éléments filtržés
=========================================================*/
return filtered;
}
};

View File

@ -1,5 +1,5 @@
function localStorageInterface(){}
localStorageInterface.prototype={dataset:[],dataset_keys:[],set:function(a,b,d){b=b.toString();var c=this.dataset.indexOf(a);if(-1==c)return!1;-1==this.dataset_keys[c].indexOf(b)&&(this.dataset_keys[c].push(b),localStorage.setItem(a,JSON.stringify(this.dataset_keys[c])));localStorage.setItem(a+"_"+b,JSON.stringify(d));return!0},get:function(a,b){b=b.toString();return-1==this.dataset.indexOf(a)?!1:JSON.parse(localStorage.getItem(a+"_"+b))},del:function(a,b){b=b.toString();var d=this.dataset.indexOf(a);
if(-1==d)return!1;var c=this.dataset_keys[d].indexOf(b);if(-1==c)return!1;localStorage.removeItem(a+"_"+b);this.dataset_keys[d].splice(c,1);localStorage.setItem(a,JSON.stringify(this.dataset_keys[d]));return!0},createDataset:function(a){if("string"!=typeof a)return!1;if(-1<this.dataset.indexOf(a))return!0;var b=localStorage.getItem(a);null!=b?(this.dataset.push(a),this.dataset_keys.push(JSON.parse(b))):(this.dataset.push(a),this.dataset_keys.push([]),localStorage.setItem(a,JSON.stringify([])));return!0},
keys:function(a){a=this.dataset.indexOf(a);return-1==a?!1:this.dataset_keys[a]},"export":function(a){var b=this.dataset.indexOf(a);if(-1==b)return!1;for(var d={},c=0;c<this.dataset_keys[b].length;c++)d[this.dataset_keys[b][c]]=this.get(a,this.dataset_keys[b][c]);return d},"import":function(a,b){-1==this.dataset.indexOf(a)?this.createDataset(a):this.clear(a);for(var d in b)this.set(a,d,b[d]);return!0},clear:function(a){var b=this.dataset.indexOf(a);if(-1==b)return!1;var d=this["export"](a),c;for(c in d)this.del(a,
c);this.dataset_keys[b]=[];localStorage.setItem(a,JSON.stringify(this.dataset_keys[b]));return!0}};var lsi=new localStorageInterface;
localStorageInterface.prototype={dataset:[],dataset_keys:[],storage:localStorage,setStorage:function(a){if(a!=localStorage&&a!=sessionStorage)return!1;this.storage=a},set:function(a,b,d){b=b.toString();var c=this.dataset.indexOf(a);if(-1==c)return!1;-1==this.dataset_keys[c].indexOf(b)&&(this.dataset_keys[c].push(b),this.storage.setItem(a,JSON.stringify(this.dataset_keys[c])));this.storage.setItem(a+"_"+b,JSON.stringify(d));return!0},get:function(a,b){if(null!=b)return b=b.toString(),-1==this.dataset.indexOf(a)?
!1:JSON.parse(this.storage.getItem(a+"_"+b))},del:function(a,b){b=b.toString();var d=this.dataset.indexOf(a);if(-1==d)return!1;var c=this.dataset_keys[d].indexOf(b);if(-1==c)return!1;this.storage.removeItem(a+"_"+b);this.dataset_keys[d].splice(c,1);this.storage.setItem(a,JSON.stringify(this.dataset_keys[d]));return!0},createDataset:function(a){if("string"!=typeof a)return!1;if(-1<this.dataset.indexOf(a))return!0;var b=this.storage.getItem(a);null!=b?(this.dataset.push(a),this.dataset_keys.push(JSON.parse(b))):
(this.dataset.push(a),this.dataset_keys.push([]),this.storage.setItem(a,JSON.stringify([])));return!0},keys:function(a){a=this.dataset.indexOf(a);return-1==a?!1:this.dataset_keys[a]},"export":function(a){var b=this.dataset.indexOf(a);if(-1==b)return!1;for(var d={},c=0;c<this.dataset_keys[b].length;c++)d[this.dataset_keys[b][c]]=this.get(a,this.dataset_keys[b][c]);return d},"import":function(a,b){-1==this.dataset.indexOf(a)?this.createDataset(a):this.clear(a);for(var d in b)this.set(a,d,b[d]);return!0},
clear:function(a){var b=this.dataset.indexOf(a);if(-1==b)return!1;var d=this["export"](a),c;for(c in d)this.del(a,c);this.dataset_keys[b]=[];this.storage.setItem(a,JSON.stringify(this.dataset_keys[b]));return!0}};var lsi=new localStorageInterface;

View File

@ -5,6 +5,17 @@ localStorageInterface.prototype = {
dataset: [], // Contiendra les différents 'dataset'
dataset_keys: [], // Contiendra les clés de chaque 'dataset'
storage: localStorage, // Peut contenir 'localStorage' ou 'sessionStorage'
setStorage: function(storage){
// Si valeur incohérente
if( storage != localStorage && storage != sessionStorage )
return false;
// Sinon on enregistre le type de storage
this.storage = storage;
},
/* AJOUTE UN ELEMENT AU DATASET DONNE
*
@ -26,11 +37,11 @@ localStorageInterface.prototype = {
/* (2) On enregistre la nouvelle clé, si elle est nouvelle */
if( this.dataset_keys[index].indexOf(key) == -1 ){
this.dataset_keys[index].push(key);
localStorage.setItem(dataset_name, JSON.stringify(this.dataset_keys[index]));
this.storage.setItem(dataset_name, JSON.stringify(this.dataset_keys[index]));
}
/* (3) On propage au 'localStorage' */
localStorage.setItem(dataset_name+'_'+key, JSON.stringify(value) );
this.storage.setItem(dataset_name+'_'+key, JSON.stringify(value) );
return true;
},
@ -44,6 +55,9 @@ localStorageInterface.prototype = {
*
*/
get: function(dataset_name, key){
if( key == null )
return null;
// On met la clé en <String>
key = key.toString();
@ -51,7 +65,7 @@ localStorageInterface.prototype = {
if( this.dataset.indexOf(dataset_name) == -1 ) return false; // erreur
/* (2) On propage au 'localStorage' */
return JSON.parse( localStorage.getItem(dataset_name+'_'+key) );
return JSON.parse( this.storage.getItem(dataset_name+'_'+key) );
},
/* SUPPRIME UN ELEMENT D'UN DATASET DONNE
@ -75,13 +89,13 @@ localStorageInterface.prototype = {
if( keyIndex == -1 ) return false; // erreur si la clé n'est pas référencée
/* (3) On supprime dans le 'localStorage' */
localStorage.removeItem(dataset+'_'+key);
this.storage.removeItem(dataset+'_'+key);
/* (4) On supprime la clé dans la liste des clés */
this.dataset_keys[index].splice(keyIndex, 1);
/* (5) On met à jour dans le 'localStorage' */
localStorage.setItem(dataset, JSON.stringify(this.dataset_keys[index]));
this.storage.setItem(dataset, JSON.stringify(this.dataset_keys[index]));
return true;
@ -105,7 +119,7 @@ localStorageInterface.prototype = {
if( datasetIndex > -1 ) return true;
/* (3) On charge le dataset s'il existe */
var storedDataset = localStorage.getItem(name);
var storedDataset = this.storage.getItem(name);
if( storedDataset != null ){ // Si le dataset existe, on charge les données
this.dataset.push(name);
@ -116,7 +130,7 @@ localStorageInterface.prototype = {
this.dataset.push(name);
this.dataset_keys.push([]);
localStorage.setItem(name, JSON.stringify([]));
this.storage.setItem(name, JSON.stringify([]));
}
@ -218,7 +232,7 @@ localStorageInterface.prototype = {
/* (3) Par précaution, on supprime les clés du dataset */
this.dataset_keys[index] = [];
localStorage.setItem(dataset, JSON.stringify(this.dataset_keys[index]));
this.storage.setItem(dataset, JSON.stringify(this.dataset_keys[index]));
/* (4) On retourne que tout s'est bien passé */
return true;

5
js/lib/notif-min.js vendored Normal file
View File

@ -0,0 +1,5 @@
var NotificationClass=function(a){this.container=a};NotificationClass.prototype={container:this.container,stack:[],types:["warning","info","success","error"],defaultTimeout:2E3,errorCodes:{}};NotificationClass.prototype.pushStack=function(a,c,b){if(!(a instanceof Array&&b instanceof Array))return null;var e=-1,d;for(d in a)if(-1<b.indexOf(a[d])){e=d;break}if(-1==e)return a.push(c)-1;a[e]=c;return e};
NotificationClass.prototype.hide=function(a){if(isNaN(a))return!1;a=parseInt(a);this.container.removeChild(this.stack[a].element);this.stack[a]=null};
NotificationClass.prototype.show=function(a,c,b,e){a=-1<this.types.indexOf(a)?a:this.types[0];c="string"==typeof c?c:"";b="string"==typeof b.toString()?b:"...";null!=this.errorCodes[b]&&(b=this.errorCodes[b]);e="number"==typeof e?e:this.defaultTimeout;var d={element:document.createElement("div"),type:a,title:c,message:b,timeout:null};d.element.className="notification-element";d.element.setAttribute("data-"+a,"");d.element.innerHTML="<p><strong>"+c+":</strong> "+b+"<p>";this.container.appendChild(d.element);
var f=this.pushStack(this.stack,d,[null]);d.element.id=f;var g=this;d.element.className="notification-element notification-visible";setTimeout(function(){d.element.className="notification-element"},500+e);d.timeout=setTimeout(function(){g.hide(f)},500+e+500);d.element.addEventListener("click",function(a){g.hide(f)},!1);return d.element};NotificationClass.prototype.warning=function(a,c,b){return this.show("warning",a,c,b)};
NotificationClass.prototype.info=function(a,c,b){return this.show("info",a,c,b)};NotificationClass.prototype.success=function(a,c,b){return this.show("success",a,c,b)};NotificationClass.prototype.error=function(a,c,b){return this.show("error",a,c,b)};

179
js/lib/notif.js Normal file
View File

@ -0,0 +1,179 @@
/* [0] CONSTRUCTEUR
=========================================================*/
var NotificationClass = function(container){
this.container = container;
};
/* [1] PROTOTYPE ET ATTRIBUTS
=========================================================*/
NotificationClass.prototype = {
container: this.container, // Parent de la page à notifier
stack: [], // Contiendra les données de toutes les notifications actives
types: [ // Définition des différents types
'warning',
'info',
'success',
'error'
],
defaultTimeout: 2000, // Temps d'apparition par défaut
errorCodes: {} // codes d'erreurs sous la forme {codeErreur1: texteErreur1, codeErreur2: texteErreur2, ...}
};
/* [2] AJOUT D'UN ELEMENT DANS LA PILE
=========================================================*/
/*
*
* @stack<Array> Pile dans laquelle on veut ajouter un élément
* @element<Mixed> Elément que l'on veut ajouter à la pile
* @emptyValues<Array> Liste des valeurs à considérer comme 'vides'
*
*/
NotificationClass.prototype.pushStack = function(stack, element, emptyValues){
/* (0) Vérification des INPUT
---------------------------------------------------------*/
/* (1) Vérification de @stack */
if( !(stack instanceof Array) )
return null;
/* (2) Vérification de @emptyValues */
if( !(emptyValues instanceof Array) )
return null;
/* (1) On cherche la première valeur vide dans @stack
---------------------------------------------------------*/
var index = -1;
for( var i in stack )
if( emptyValues.indexOf(stack[i]) > -1 ){
index = i;
break;
}
/* (2) Insertion et résultat
---------------------------------------------------------*/
/* (1) Si on a rien trouvé, on fait un push normal */
if( index == -1 )
return stack.push(element) - 1;
/* (2) Si on a trouvé, on enregistre @element et on renvoie @index */
stack[index] = element;
return index;
};
/* [3] SUPPRESSION D'UNE NOTIFICATION
=========================================================*/
/*
*
* @id<int> Id de la notification dans la pile
*
*/
NotificationClass.prototype.hide = function(id){
/* (0) Vérification de @id */
if( isNaN(id) )
return false;
id = parseInt(id);
/* (1) Suppression de l'élément */
this.container.removeChild( this.stack[id].element );
/* (2) On supprime la notification de la pile */
this.stack[id] = null;
};
/* [4] AFFICHAGE D'UNE NOTIFICATION
=========================================================*/
/*
*
* @type<String> Type de notification parmi 'warning', 'info', 'success', 'error'
* @title<String> Titre de la notification
* @message<String> Message de la notification
* @timeout<int> Temps d'apparition de la notification en ms (millisecondes) + 2 * 500ms (fadeIn+fadeOut)
*
*/
NotificationClass.prototype.show = function(type, title, message, timeout){
/* (0) Vérification des INPUT
---------------------------------------------------------*/
/* (1) Vérification de @type */
type = this.types.indexOf(type) > -1 ? type : this.types[0];
/* (2) Vérification de @title */
title = typeof title == 'string' ? title : '';
/* (3) Vérification de @message */
message = typeof message.toString() == 'string' ? message : '...';
// On cherche s'il y a une occurence dans le dictionnaire
if( this.errorCodes[message] != null )
message = this.errorCodes[message];
/* (4) Vérification de @timeout */
timeout = typeof timeout == 'number' ? timeout : this.defaultTimeout;
/* (1) Construction de l'élément
---------------------------------------------------------*/
/* (1) Création du set de données */
var stackItem = {
element: document.createElement('div'),
type: type,
title: title,
message: message,
timeout: null
};
/* (2) Construction de l'élément */
stackItem.element.className = 'notification-element';
stackItem.element.setAttribute('data-'+type, '');
stackItem.element.innerHTML = '<p><strong>'+title+':</strong> '+message+'<p>';
/* (2) Ajout à la pile et au DOM
---------------------------------------------------------*/
this.container.appendChild(stackItem.element);
var id = this.pushStack( this.stack, stackItem, [null] );
stackItem.element.id = id;
/* (3) Gestion du temps d'apparition
---------------------------------------------------------*/
var ptr = this;
// {1} fadeIn START //
stackItem.element.className = 'notification-element notification-visible';
// {2} fadeOut START //
setTimeout(function(){
stackItem.element.className = 'notification-element';
}, 500+timeout);
// {3} fadeOut STOP + animation STOP //
stackItem.timeout = setTimeout(function(){
ptr.hide(id);
}, 500+timeout+500);
/* (4) Gestion du clic qui ferme la notification
---------------------------------------------------------*/
stackItem.element.addEventListener('click', function(e){
ptr.hide(id);
}, false);
/* (5) On retourne l'élément
---------------------------------------------------------*/
return stackItem.element;
};
/* [6] 'Raccourcis' d'accès
=========================================================*/
NotificationClass.prototype.warning = function(title, message, timeout){ return this.show('warning', title, message, timeout); };
NotificationClass.prototype.info = function(title, message, timeout){ return this.show('info', title, message, timeout); };
NotificationClass.prototype.success = function(title, message, timeout){ return this.show('success', title, message, timeout); };
NotificationClass.prototype.error = function(title, message, timeout){ return this.show('error', title, message, timeout); };

6
js/lib/reset-min.js vendored
View File

@ -1,4 +1,4 @@
function $(a){return document.querySelector(a)}function $$(a){return document.querySelectorAll(a)}Element.prototype.getData=function(a){return"undefined"==typeof this.dataset?!1:this.dataset.hasOwnProperty(a)?this.dataset[a]:!1};Element.prototype.addClass=function(a){var b=this.className.split(" ");-1<b.indexOf(a)||(b.push(a),this.className=b.join(" ").trim())};
Element.prototype.remClass=function(a){var b=this.className.split(" ");a=b.indexOf(a);-1!=a&&(b=b.slice(0,a).concat(b.slice(a+1)),this.className=b.join(" ").trim())};NodeList.prototype.indexOf=HTMLCollection.prototype.indexOf=function(a){for(var b=0;b<this.length;b++)if(this[b]==a)return b;return-1};Element.prototype.anim=function(a,b){var c=this;c.addClass(a);setTimeout(function(){c.remClass(a)},b)};var _includes=[],_includeTags=[];
function include(a,b,c){a="string"===typeof a?a:null;b="function"===typeof b?b:function(){console.log("[x] "+a+" loaded")};if(null==a)return!1;if("boolean"===typeof c&&c){b=_includes.indexOf(a);if(-1==b)return!1;document.head.removeChild(_includeTags[b]);_includes.splice(b,1);_includeTags.splice(b,1)}else{if(-1<_includes.indexOf(a))return b(),!0;c=document.createElement("script");c.type="text/javascript";c.src=a;document.head.appendChild(c);_includes.push(a);_includeTags.push(c);c.onload=b}return!0}
function diff(a,b){var c=[],d;for(d in a)null!=b[d]&&null!=a[d]&&(typeof a[d]!==typeof b[d]?c.push(d):a[d]instanceof Object&&b[d]instanceof Object?0<diff(a[d],b[d]).length&&c.push(d):a[d]!=b[d]&&c.push(d));return c}var format_number=new formatChecker(null,"0i ii ii ii ii");
Element.prototype.remClass=function(a){var b=this.className.split(" ");a=b.indexOf(a);-1!=a&&(b=b.slice(0,a).concat(b.slice(a+1)),this.className=b.join(" ").trim())};NodeList.prototype.indexOf=HTMLCollection.prototype.indexOf=function(a){for(var b=0;b<this.length;b++)if(this[b]==a)return b;return-1};Element.prototype.anim=function(a,b){var d=this;d.addClass(a);setTimeout(function(){d.remClass(a)},b)};var _includes=[],_includeTags=[];
function include(a,b,d){a="string"===typeof a?a:null;b="function"===typeof b?b:function(){console.log("[x] "+a+" loaded")};if(null==a)return!1;if("boolean"===typeof d&&d){b=_includes.indexOf(a);if(-1==b)return!1;document.head.removeChild(_includeTags[b]);_includes.splice(b,1);_includeTags.splice(b,1)}else{if(-1<_includes.indexOf(a))return b(),!0;d=document.createElement("script");d.type="text/javascript";d.src=a;document.head.appendChild(d);_includes.push(a);_includeTags.push(d);d.onload=b}return!0}
function diff(a,b,d){var e=[],c;for(c in a)null==b[c]||null==a[c]||d instanceof Array&&-1<d.indexOf(c)||(typeof a[c]!==typeof b[c]?e.push(c):a[c]instanceof Object&&b[c]instanceof Object?0<diff(a[c],b[c]).length&&e.push(c):a[c]!=b[c]&&e.push(c));return e}var format_number=new formatChecker(null,"0i ii ii ii ii");

View File

@ -152,16 +152,17 @@ function include(jsResource, callback, action){ // action=true -> EXCLUSION, SIN
*
* @A<Object> Premier Objet
* @B<Object> Second Objet
* @ignore<Array> Tableau des clés à ignorer
*
* @return diff<Array> Tableau contenant les clés des valeurs différentes (uniquement les clés communes et non NULLes)
*
*/
function diff(A, B){
function diff(A, B, ignore){
var dKeys = [];
for( var key in A ){
// Si A[key] ou B[key] est NULL, on ne compare pas
if( B[key] == null || A[key] == null )
if( B[key] == null || A[key] == null || ignore instanceof Array && ignore.indexOf(key) > -1 )
continue;

View File

@ -48,7 +48,7 @@
if( self::$instance == null || self::$error != ManagerError::Success ){ // Si aucune instance existante OU erreur de connection
// chargement de la configuration du server SQL
if( !isset($_SERVER['HTTP_HOST']) || isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] == 'socioview' )
if( !checkdnsrr($_SERVER['SERVER_NAME'], 'NS') )
$conf = json_decode( ResourceDispatcher::getResource(self::$config_path['local']), true );
else
$conf = json_decode( ResourceDispatcher::getResource(self::$config_path['remote']), true );

View File

@ -110,7 +110,7 @@
case self::UploadError: return "Une erreur d'upload est survenue."; break;
case self::FormatError: return "Le fichier n'est pas au bon format."; break;
// default: return "Erreur inconnue..."; break;
default: return "Description d'erreur inconnue..."; break;
}
// Erreur inconnue

View File

@ -1,12 +1,36 @@
<?php
// On definit la racine __ROOT__ si c'est pas deja fait
/* [0] On definit la racine __ROOT__ si c'est pas deja fait
=========================================================*/
if( !defined('__ROOT__') ) define('__ROOT__', dirname(dirname(__FILE__)) );
/* [1] On définit __SERVER_HOST__ et __SERVER_ROOT__ si c'est pas déja fait
=========================================================*/
if( !defined('__SERVER_HOST__') || !defined('__SERVER_ROOT') ){
/* (1) On charge le fichier de configuration */
$json = json_decode( file_get_contents(__ROOT__.'/config/server.json'), true );
// Si pas d'erreur, on définit
if( !is_null($json) ){
/* (2) Gestion de la config si server local ou remote */
if( !checkdnsrr($_SERVER['SERVER_NAME'], 'NS') )
$config = $json['local'];
else
$config = $json['remote'];
/* (3) Création des constantes */
define('__SERVER_HOST__', $config['host']);
define('__SERVER_ROOT__', $config['root']);
}
}
/* ACTIVE LE DEBUGGAGE (WARNING + EXCEPTION)
@ -53,7 +77,7 @@
/* [1] Gestion des droits des utilisateurs
/* [3] Gestion des droits des utilisateurs
=========================================================*/
/* (1) Retourne si l'utilisateur est connecte ou non */
function connected(){ return isset($_SESSION['permission']) && count($_SESSION['permission']) > 0; }

View File

@ -74,6 +74,7 @@
/* (2) On enregistre le contact dans l'annuaire s'il y est pas déjà */
if( !isset($phone_directory[$number]) )
$phone_directory[$number] = array(
'name' => strlen($log['Name']) ? (string) $log['Name'] : null,
'calls' => 0,
'sms' => 0
@ -89,8 +90,9 @@
/* (5) On complète le log */
$phone_log = array(
'source' => ($log['Direction']=='INCOMING') ? $number : Database::formatNumber($phone_number),
'target' => ($log['Direction']=='INCOMING') ? Database::formatNumber($phone_number) : $number,
'source' => ($log['Direction']!='OUTCOMING') ? $number : Database::formatNumber($phone_number),
'target' => ($log['Direction']!='OUTCOMING') ? Database::formatNumber($phone_number) : $number,
'missed' => $log['Direction']==['MISSED'],
'type' => strtolower($log['Type']),
'date' => strtotime($log['Date']),
'duration' => (int) $log['Duration']
@ -175,136 +177,6 @@
/* DESERIALISATION D'UN JOURNAL D'APPEL
*
* @content<String> Le contenu du journal d'appel a deserialiser
*
* @return sms<Array> Retourne un tableau associatif contenant les sms triees
* @return call<Array> Retourne un tableau associatif contenant les appels triees
* @return contact<Array> Retourne un tableau associatif contenant les correspondances numero/nom de contact
*
*/
private static function unserializeOld($params){
$filecontent = null;
extract($params);
/* [2] On recupere le xml
=========================================================*/
$xml = simplexml_load_string($filecontent);
// Si le format XML n'est pas bon, on retourne une erreur
if( $xml === false )
return array('ModuleError' => ManagerError::ParsingFailed);
return array( 'ModuleError' => ManagerError::Success, 'xml' => $xml );
/* [3] Initialisation des variables
=========================================================*/
$names = array(); // Contiendra les correspondances numero/contact
$msms = array(); // Contiendra les personnes utilisant SMS/MMS
$call = array(); // Contiendra les personnes utilisant CALL
/* [4] On traite les donnees pour chaque champ du xml
=========================================================*/
foreach($xml->Item as $log){
// On recupere le numero en string
$num = (string) $log['Number'];
// On formatte le numero
if( preg_match("/^(?:\+33|33|0)(.+)/", $num, $m) )
$num = '0'.$m[1];
// Si pas un numero, on sort de la boucle
else
continue;
/* (1) Si le type est MMS ou SMS */
if( $log['Type'] == 'SMS' || $log['Type'] == 'MMS' ){
// Si la personne n'est pas referencee, on l'ajoute
// Sinon on incremente son nombre d'apparition
if( isset($msms[$num]) )
$msms[$num]+= 1;
else
$msms[$num] = 1;
// On enregistre le nom si c'est pas fait
if( !isset($names[$num]) ) $names[$num] = $log['Name'];
/* (2) Si le type est PHONE */
}else if( $log['Type'] == 'PHONE' ){
// Si la personne n'est pas referencee, on l'ajoute
// Sinon on incremente son nombre d'apparition
if( isset($call[$num]) )
$call[$num]+= 1;
else
$call[$num] = 1;
// On enregistre le nom si c'est pas fait
if( !isset($names[$num]) ) $names[$num] = $log['Name'];
}
}
/* [4] On trie par nombre d'interactions (sms/appel)
=========================================================*/
$tmp = $msms;
/* (1) Tri des SMS/MMS */
$sortedMSMS = array();
// On fait le tri pour les 10 premiers elements sauf s'il en a moins
for( $i = 0 ; $i < 10 && $i < count($tmp) ; $i++ ){
$maxval = max($tmp);
$maxkey = array_search($maxval, $tmp);
array_push( $sortedMSMS, array($maxkey, $maxval) );
unset($tmp[$maxkey]);
}
$tmp = $call;
/* (2) Tri des appels */
$sortedCALL = array();
// On fait le tri pour les 10 premiers elements sauf s'il en a moins
for( $i = 0 ; $i < 10 && $i < count($tmp) ; $i++ ){
$maxval = max($tmp);
$maxkey = array_search($maxval, $tmp);
array_push( $sortedCALL, array($maxkey, $maxval) );
unset($tmp[$maxkey]);
}
/* [5] Gestion du retour
=========================================================*/
return array(
'ModuleError' => ManagerError::Success,
'sms' => $sortedMSMS,
'call' => $sortedCALL,
'contact' => $names
);
}
}

View File

@ -10,7 +10,6 @@
class input{
/* TRAITE LES DONNÉES D'UN FORMULAIRE DE TYPE TÉLÉPHONIQUE
*
* @subject<Array> Tableau contenant les données du sujet
@ -46,17 +45,141 @@
$subject_id = $create_subject_response->get('id_subject');
/* [2] Pour chaque contact, on crée le sujet + les relations
/* [2] On extrait les contacts des 2 top 10 (sans duplication)
=========================================================*/
// TODO : Here !!
$closest = array();
foreach($fiches as $i=>$fiche){
/* (1) Si le contact n'est pas déja enregistré, on l'enregistre */
if( !array_key_exists($fiche['contact'], $closest) )
$closest[ $fiche['contact'] ] = array();
/* (2) Si c'est un lien par CALL, on l'ajoute */
if( $i < 10 )
array_push( $closest[ $fiche['contact'] ], 'CALL' );
/* (3) Si c'est un lien par SMS, on l'ajoute */
else
array_push( $closest[ $fiche['contact'] ], 'SMS' );
}
/* [2] Gestion du retour
/* [3] On crée les contacts les plus proches
=========================================================*/
$closest_id = array();
// Pour chacun des top 10*2 plus proches
foreach($closest as $contact=>$relations){
/* (1) On rédige la requête de création de sujet*/
$create_contact_request = new ModuleRequest('subject/create', array(
'username' => $contacts[$contact]['username'],
'firstname' => $contacts[$contact]['firstname'],
'lastname' => $contacts[$contact]['lastname'],
'number' => $contacts[$contact]['number']
));
/* (2) On exécute la requête (création) */
$create_contact_response = $create_contact_request->dispatch();
/* (3) Gestion de l'erreur, si erreur de création */
if( $create_contact_response->error != ManagerError::Success )
return array( 'ModuleError' => $create_contact_response->error );
/* (4) On récupère l'id du sujet */
$closest_id[$contact] = $create_contact_response->get('id_subject');
/* [4] On crée les relations avec le sujet de l'enquête
=========================================================*/
/* (1) Relation de type _CALL_ */
if( in_array('CALL', $relations) ){
$call_rel_request = new Repo('subject/link', array( $subject_id, $closest_id[$contact], '_CALL_' ));
$call_rel_response = $call_rel_request->answer();
// Si erreur de création de relation
if( $call_rel_response === false )
return array( 'ModuleError' => ManagerError::ModuleError );
}
/* (2) Relation de type _SMS_ */
if( in_array('SMS', $relations) ){
$sms_rel_request = new Repo('subject/link', array( $subject_id, $closest_id[$contact], '_SMS_' ));
$sms_rel_response = $sms_rel_request->answer();
// Si erreur de création de relation
if( $sms_rel_response === false )
return array( 'ModuleError' => ManagerError::ModuleError );
}
}
/* [4] Ajout des relations de la matrice
=========================================================*/
// Pour chacun des top 10*2 plus proches
foreach($closest as $A=>$rels){
// Pour chaque relation avec le contact actuel (s'il y en a)
if( isset($matrice[$A]) && is_array($matrice[$A]) ){
foreach($matrice[$A] as $B){
$relation_request = new Repo('subject/link', array( $closest_id[$A], $closest_id[$B], '' ));
$relation_response = $relation_request->answer();
// Si erreur de création de relation
if( $relation_response === false )
return array( 'ModuleError' => ManagerError::ModuleError );
}
}
}
/* [5] Enregistrer les données des FICHES dans la base de données
=========================================================*/
// TODO: Enregistrer les données des fiches dans la base de données
/* [6] Enregistrement des mini-fiches dans un fichier '.json'
=========================================================*/
$file = array();
/* (1) On enregistre les données des fiches */
foreach($mini as $id=>$miniFiche){
$data = array(
'number' => $contacts[$id]['number'],
'username' => $contacts[$id]['username'],
'firstname' => $contacts[$id]['firstname'],
'lastname' => $contacts[$id]['lastname'],
// TODO: Finir l'implémentation du fichier XML contenant les données des MINI+des CONTACTS
);
}
/* (2) On enregistre les données des mini-fiches */
/* [n] Gestion du retour
=========================================================*/
return array(
'ModuleError' => ManagerError::Success,
'subject_id' => $subject_id
'subject_id' => $subject_id,
'contacts' => $closest,
'created' => $closest_id
);
}

View File

@ -126,6 +126,10 @@
$remove = new Repo('subject/remove', array($id_subject));
$remove_status = $remove->answer();
// Si erreur lors de la requête
if( $remove_status === false )
return array( 'ModuleError' => ManagerError::ModuleError );
/* [3] On verifie que le sujet est bien supprime
=========================================================*/

View File

@ -279,10 +279,10 @@
/* (5) Vérification des mini-fiches */
foreach($json['mini'] as $mini){
$checkMini = isset($mini['uid']) && is_numeric($mini['uid']);
$checkMini = $checkMini && isset($mini['sexe']) && is_array($mini['sexe']);
$checkMini = $checkMini && isset($mini['sexe']) && is_string($mini['sexe']);
$checkMini = $checkMini && isset($mini['age']) && is_string($mini['age']);
$checkMini = $checkMini && isset($mini['studies']) && is_string($mini['studies']);
$checkMini = $checkMini && isset($mini['loc']) && is_array($mini['loc']);
$checkMini = $checkMini && isset($mini['loc']) && is_numeric($mini['loc']);
// Si erreur des attributs des mini-fiches incorrects ou manquants
if( !$checkMini )
@ -295,17 +295,18 @@
foreach($json['fiches'] as $fiches){
$checkFiche = isset($fiches['uid']) && is_numeric($fiches['uid']);
$checkFiche = $checkFiche && isset($fiches['contact']) && is_numeric($fiches['contact']);
$checkFiche = $checkFiche && isset($fiches['sexe']) && is_array($fiches['sexe']);
$checkFiche = $checkFiche && isset($fiches['sexe']) && is_string($fiches['sexe']);
$checkFiche = $checkFiche && isset($fiches['age']) && is_string($fiches['age']);
$checkFiche = $checkFiche && isset($fiches['job']) && is_string($fiches['job']);
$checkFiche = $checkFiche && isset($fiches['loc']) && is_array($fiches['loc']);
$checkFiche = $checkFiche && isset($fiches['loc']) && is_numeric($fiches['loc']);
$checkFiche = $checkFiche && isset($fiches['studies']) && is_string($fiches['studies']);
$checkFiche = $checkFiche && isset($fiches['famsit']) && is_array($fiches['famsit']);
$checkFiche = $checkFiche && isset($fiches['reltype']) && is_array($fiches['reltype']);
$checkFiche = $checkFiche && isset($fiches['famsit']) && is_numeric($fiches['famsit']);
$checkFiche = $checkFiche && isset($fiches['reltype']) && is_numeric($fiches['reltype']);
$checkFiche = $checkFiche && isset($fiches['reltypeSpecial']) && is_string($fiches['reltypeSpecial']);
$checkFiche = $checkFiche && isset($fiches['city']) && is_string($fiches['city']);
$checkFiche = $checkFiche && isset($fiches['cp']) && is_string($fiches['cp']);
$checkFiche = $checkFiche && isset($fiches['duration']) && is_array($fiches['duration']);
$checkFiche = $checkFiche && isset($fiches['context']) && is_array($fiches['context']);
$checkFiche = $checkFiche && isset($fiches['context']) && is_numeric($fiches['context']);
$checkFiche = $checkFiche && isset($fiches['contextSpecial']) && is_array($fiches['contextSpecial']);
$checkFiche = $checkFiche && isset($fiches['freq']) && is_array($fiches['freq']);
$checkFiche = $checkFiche && isset($fiches['connect']) && is_array($fiches['connect']);

62
manager/repo/category.php Normal file
View File

@ -0,0 +1,62 @@
<?php
namespace manager\repo;
use \manager\Database;
use \manager\sessionManager;
class category extends parentRepo{
protected static function table_name(){ static $table_name = 'categories'; return $table_name; }
/* CREATION D'UNE NOUVELLE CATEGORIE SI AUCUNE AVEC CE NOM N'EXISTE DEJA, SINON RENVOIE L'ID
*
* @intitule<String> Nom de la catégorie
*
* @return id<int> Retourne l'id de la catégorie crée, FALSE si erreur
*
*/
public static function getOrCreate($intitule){
/* [0] Vérification des INPUT
=========================================================*/
// Si erreur de type de paramètre, on retourne FALSE
if( !Database::check('varchar(0,40)', $intitule) )
return false;
/* [1] Vérification qu'aucune n'a cet intitulé
=========================================================*/
$existing = self::getByIntitule($intitule);
/* (1) Si existe déja avec cet intitulé, on récupère l'id */
if( is_array($existing) && count($existing) > 0 )
return $existing[0]['idCategorie'];
/* [2] Création si l'intitulé n'est pas déja utilisé
=========================================================*/
$create_r = Database::getPDO()->prepare("INSERT INTO categories(idCategorie, intitule)
VALUES(DEFAULT, :intitule)");
$create_r_status = $create_r->execute( array( ':intitule' => $intitule ) );
// Si erreur de requête
if( $create_r_status === false )
return false;
/* [3] On vérifie et renvoie l'id
=========================================================*/
$created = self::getByIntitule($intitule);
/* (1) Si existe déja avec cet intitulé, on récupère l'id */
if( is_array($created) && count($created) > 0 )
return $created[0]['idCategorie'];
// Sinon, c'est qu'il y a une erreur
return false;
}
}
?>

View File

@ -45,6 +45,7 @@
array_push($table_columns, $column['Field']);
}
/* [3] On vérifie que la valeur après 'get' est dans $table_columns
=========================================================*/
$columnName = strtolower($matches[1]);
@ -56,15 +57,25 @@
// Si ni 'getAll' ni 'getSomething' -> erreur
if( !$getById && !$getAll && !$getSomething ) return false;
/* [4] On rédige la requête
=========================================================*/
$getRequestString = 'SELECT * FROM '.static::table_name();
// Si c'est 'getById', on ajoute une condition (clé primaire)
if( $getById ){
$getRequestString .= ' WHERE '.$table_columns['_PRIMARY_'][0].' = :value';
// TODO: Gestion d'une clé primaire composée (plusieurs arguments)
// S'il manque un paramètre, on retourne une erreur
if( count($args) < count($table_columns['_PRIMARY_']) )
return false;
// Pour chaque clé primaire (si elle est composée)
foreach($table_columns['_PRIMARY_'] as $i=>$primary_column)
// Première ligne
if( $i == 0 ) $getRequestString .= ' WHERE '.$table_columns['_PRIMARY_'][$i].' = :primary'.$i;
// Lignes suivantes
else $getRequestString .= ' AND '.$table_columns['_PRIMARY_'][$i].' = :primary'.$i;
// Si c'est 'getSomething', on ajoute une condition
}else if( $getSomething )
@ -75,9 +86,21 @@
// On prépare la requête
$getRequest = Database::getPDO()->prepare($getRequestString);
/* [5] On exécute la requête
=========================================================*/
// Si 'getById', on compose la clé primaire
if( $getById ){
$pdo_vars = array();
foreach($table_columns['_PRIMARY_'] as $i=>$primary_column)
$pdo_vars[':primary'.$i] = $args[$i];
$getRequest->execute( $pdo_vars );
// Si 'getSomething', on ajoute le champ
}else
$getRequest->execute(array(
':value' => ($getSomething||$getById) ? $args[0] : null
));

80
manager/repo/relation.php Normal file
View File

@ -0,0 +1,80 @@
<?php
namespace manager\repo;
use \manager\Database;
use \manager\sessionManager;
class relation extends parentRepo{
protected static function table_name(){ static $table_name = 'relations'; return $table_name; }
/* CREATION D'UNE RELATION ENTRE @A ET @B DE TYPE @category
*
* @A<int> UID du sujet A
* @B<int> UID du sujet B
* @category<int> UID de la categorie en question
*
* @return status<Boolean> On retourne TRUE si tout s'est bien passé, sinon FALSE si erreur
*
*/
public static function create($A, $B, $category){
/* [0] Vérification des INPUT
=========================================================*/
$checkInput = Database::check('id', $A);
$checkInput = $checkInput && Database::check('id', $B);
$checkInput = $checkInput && Database::check('id', $category);
// Si erreur de type de paramètre, on retourne FALSE
if( !$checkInput )
return false;
/* [1] On vérifie que la relation n'existe pas déja
=========================================================*/
$exists = self::getById($A, $B, $category);
// Si la relation existe, on retourne TRUE
if( is_array($exists) && count($exists) > 0 )
return true;
/* [2] Création de la relation
=========================================================*/
$create_relation = Database::getPDO()->prepare("INSERT INTO relations(idPersonneA, idPersonneB, idCategorie)
VALUES(:A, :B, :category)");
$create_rel_status = $create_relation->execute( array(
':A' => $A,
':B' => $B,
':category' => $category
));
// Si erreur de requête -> FALSE
if( $create_rel_status === false )
return false;
/* [3] On vérifie que la relation est crée
=========================================================*/
$get_relation = self::getById($A, $B, $category);
// Si la relation n'existe pas, on renvoie une erreur
if( !is_array($get_relation) || is_array($get_relation) && count($get_relation) == 0 )
return false;
// Si tout s'est bien passé, on retourne TRUE
return true;
}
public static function remove(){
}
}
?>

View File

@ -3,6 +3,7 @@
namespace manager\repo;
use \manager\Database;
use \manager\sessionManager;
use \manager\Repo;
class subject extends parentRepo{
@ -24,7 +25,11 @@
$getSubject = Database::getPDO()->prepare("SELECT idSujet, pseudo, prenom, nom, id_facebook, telephone
FROM sujets
WHERE idSujet = :id_subject");
$getSubject->execute(array( ':id_subject' => $id_subject ));
$get_status = $getSubject->execute(array( ':id_subject' => $id_subject ));
// Si erreur de requête
if( $get_status === false )
return false;
/* [2] On recupere le resultat de la requete
@ -157,12 +162,64 @@
* @id_subject<int> UID du sujet en question
*
*/
// TODO: Finir l'implémentation
public static function remove($id_subject){
/* [0] Vérification des INPUT
=========================================================*/
if( !Database::check('id', $id_subject) )
return false;
/* [1] On effectue la suppression
=========================================================*/
$getSubject = Database::getPDO()->prepare("DELETE FROM subjects WHERE id_subject = :id_subject");
$getSubject->execute(array( ':id_subject' => $id_subject ));
$delSubject = Database::getPDO()->prepare("DELETE FROM sujets WHERE idSujet = :id_subject");
return $delSubject->execute(array( ':id_subject' => $id_subject ));
}
/* CREER UNE RELATION ENTRE 2 SUJETS
*
* @A<int> UID du premier sujet
* @B<int> UID du second sujet
* @category<String> Intitulé du type de relation
*
* @return id_relation<int> Renvoie l'id de la relation crée, sinon FALSE si erreur
*
*/
public static function link($A, $B, $category){
/* [0] Vérification des INPUT
=========================================================*/
$checkInput = Database::check('id', $A);
$checkInput = $checkInput && Database::check('id', $B);
$checkInput = $checkInput && Database::check('varchar(0,40)', $category);
// Si erreur de type de paramètre, on retourne FALSE
if( !$checkInput )
return false;
/* [1] On récupère ou crée la catégorie
=========================================================*/
$category_id_req = new Repo('category/getOrCreate', array($category));
$category_id = $category_id_req->answer();
// Si erreur -> FALSE
if( $category_id === false )
return false;
/* [2] On crée la relation
=========================================================*/
$relation_req = new Repo('relation/create', array($A, $B, $category_id));
$relation = $relation_req->answer();
// Si erreur de création -> FALSE
if( $relation === false )
return false;
// Si tout s'est bien passé, on retourne TRUE
return true;
}
}

22
manager/server.php Normal file
View File

@ -0,0 +1,22 @@
<?php
// On definit la racine __ROOT__ si c'est pas deja fait
if( !defined('__ROOT__') ) define('__ROOT__', dirname(dirname(__FILE__)) );
// On charge l'autoloader
require_once __ROOT__.'/manager/autoloader.php';
use \manager\ResourceDispatcher;
define('__HOST__')
/* [1] Si on est en local, on charge les données locales
=========================================================*/
if( !checkdnsrr($_SERVER['SERVER_NAME'], 'NS') ){
$config_file = ResourceDispatcher::getResource('f/json/server-local/confs');
if( !$config_file )
}
?>

2
src/upload/.htaccess Normal file
View File

@ -0,0 +1,2 @@
Order deny,allow
Deny from all

File diff suppressed because one or more lines are too long

View File

@ -22,6 +22,7 @@
<link type='text/css' rel='stylesheet' href='/f/css/min/css/menu-side' /> <!-- Gestion du menu -->
<link type='text/css' rel='stylesheet' href='/f/css/min/css/container' /> <!-- Gestion du container -->
<link type='text/css' rel='stylesheet' href='/f/css/min/css/global' /> <!-- Style global -->
<link type='text/css' rel='stylesheet' href='/f/css/min/css/notif' /> <!-- Inclusion du system de notifs -->
<!-- Dépendences Javascript -->
@ -33,6 +34,7 @@
<script type='text/javascript' src='/f/js/reset-min/js/lib' ></script> <!-- Corrections Javascript natif (ajouts) -->
<script type='text/javascript' src='/f/js/api-min/js/lib' ></script> <!-- Gestion des transactions avec le serveur -->
<script type='text/javascript' src='/f/js/page-manager-min/js/lib' ></script> <!-- Gestion réseau/chargement/liens/URL -->
<script type='text/javascript' src='/f/js/notif-min/js/lib' ></script> <!-- Gestion des notifications -->
<!-- Dépendences Spéficiques pré-chargeables -->
<script type='text/javascript' src='/f/js/input-html-data-min/js/includes' ></script> <!-- Gestion du constructeur HTML pour la page d'acquisition -->
@ -70,6 +72,10 @@
</div>
<!-- CONTENEUR DES NOTIFICATIONS -->
<div id='notification-container'></div>
<!-- CORPS DE LA PAGE -->
<div id='WRAPPER'>

View File

@ -27,10 +27,20 @@ $pers = $request->answer();
<input type='password' name='pass1' value='value_pass1'>
<input type='number' name='number1' value='value_number1'>
<input type='radio' data-name='rad1' id='A' value='A'><label for='A'>A</label><br>
<input type='radio' data-name='rad1' id='A' value='A' checked><label for='A'>A</label><br>
<input type='radio' data-name='rad1' id='B' value='B'><label for='B'>B</label><br>
<input type='radio' data-name='rad1' id='C' value='C'><label for='C'>C</label><br>
<br><br>
<input type='radio' data-name='rad2' name='rad2' id='D' value='D' checked><label for='D'>D</label><br>
<input type='radio' data-name='rad2' name='rad2' id='E' value='E'><label for='E'>E</label><br>
<input type='radio' data-name='rad2' name='rad2' id='F' value='F'><label for='F'>F</label><br>
<br><br>
<input type='radio' data-name='rad3' id='G' value='G'><label for='G'>G</label><br>
<input type='checkbox' data-name='chk1' id='H' value='H'><label for='H'>H</label><br>
<br>
<div>
<span>
<input type='test' values='valuetestHier'>

7
view/error.php Normal file
View File

@ -0,0 +1,7 @@
<?php
// On définit la racine ET on récupère l'autoloader
if( !defined('__ROOT__') ) define('__ROOT__', dirname(dirname(__FILE__)) );
require_once __ROOT__.'/manager/autoloader.php';
header('Location: '.__SERVER_HOST__.__SERVER_ROOT__);
?>

View File

@ -120,63 +120,12 @@
<article class='relation-panel'></article>
<span data-space></span>
<!-- MATRICE RELATIONNELLE DES 2 TOP 10 -->
<h3 data-n='5' class='color4'>Saisir les matrices des relations entre les contacts les plus contactés</h3>
<!-- NAVIGATION ENTRE LES FICHES -->
<article class='matrice-panel'>
<table class='line'>
<?php
$contacts = array(
array(1, 'Sujet', 'Un' ),
array(2, 'Sujet', 'Deux' ),
array(3, 'Sujet', 'Trois' ),
array(4, 'Sujet', 'Quatre' ),
array(5, 'Sujet', 'Cinq' ),
array(6, 'Sujet', 'Six' ),
array(7, 'Sujet', 'Sept' ),
array(8, 'Sujet', 'Huit' ),
array(9, 'Sujet', 'Neuf' ),
array(10, 'Sujet', 'Dix' ),
array(11, 'Sujet', 'Onze' ),
array(12, 'Sujet', 'Douze' ),
array(13, 'Sujet', 'Treize' ),
array(14, 'Sujet', 'Quatorze'),
array(15, 'Sujet', 'Quinze' ),
array(16, 'Sujet', 'Seize' ),
array(17, 'Sujet', 'Dix-sept'),
array(18, 'Sujet', 'Dix-huit'),
array(19, 'Sujet', 'Dix-neuf'),
array(20, 'Sujet', 'Vingt' )
);
foreach($contacts as $A=>$contactA){
echo '<tr>';
if( $A > 0 )
echo '<td style="text-align: right;">'.$contactA[1].' '.$contactA[2].'</td>';
else
echo '<td></td>';
foreach($contacts as $B=>$contactB){ if( $B < count($contacts)-1 ){
if( $A == 0 )
echo '<td><span style="writing-mode: vertical-lr; text-align: right;">'.$contactB[1].' '.$contactB[2].'</span>';
else if( $B < $A )
echo "<td><input type='checkbox' name='matrice_$A"."_$B' data-name='$A' value='$B' id='matrice_$A"."_$B'><label for='matrice_$A"."_$B' title='matrice_$A"."_$B'></label>";
else
echo "<td class='hidden'>";
echo '</td>';
}}
echo '</tr>';
}
?>
</table>
<h4 class='self color2' data-icon=''>
<input type='submit' class='primary' id='store-matrice' value='Enregistrer les relations'>
</h4>
</article>
<article class='matrice-panel'></article>
<!-- BOUTON D'ENVOI DU FORMULAIRE -->

24
view/js/input-min.js vendored
View File

@ -1,13 +1,15 @@
var subjectManager,contactManager,miniManager,ficheManager,matriceManager,defTrue={status:!0,value:"on"},defFalse={status:!1,value:"on"};
function dynamicUpdate(a){var f=a instanceof Element,b=f&&"SPAN"==a.tagName&&"switch-left"==a.className,e=f&&"SPAN"==a.tagName&&"switch-both"==a.className,c=f&&"INPUT"==a.tagName&&"submit"==a.type,d=f&&"SPAN"==a.tagName&&("nav-mini"==a.parentNode.id||"nav-fiche"==a.parentNode.id),f=f&&"SPAN"==a.tagName&&"nav-contact"==a.parentNode.id;if(!(e||b||c||d||f)&&!0!==a)return!1;if(e)console.log("> switch firstname <-> lastname"),b=a.parentNode,a=b.children[8],b=b.children[10],e=a.value,a.value=b.value,b.value=
e;else if(b){console.log("> switch firstname+lastname -> username");b=a.parentNode;e=b.children[6];a=b.children[8];b=b.children[10];if(0<e.value.length||0==a.value.length&&0==b.value.length)return!1;e.value=a.value+" "+b.value;a.value="";b.value=""}else console.log("> dynamic update"),miniManager.fieldsToStorage(),ficheManager.fieldsToStorage(),contactManager.fieldsToStorage(),matriceManager.fieldsToStorage(),miniManager.sync(),ficheManager.sync(),miniManager.storageToFields(),ficheManager.storageToFields(),
matriceManager.storageToFields(),(c||f)&&contactManager.storageToFields()}function checkRadioValue(a){for(var f=0,b=0;b<a.length;b++)!0===a[b].status&&f++;return 1!=f?!1:!0}
var subjectManager,contactManager,miniManager,ficheManager,matriceManager;
function dynamicUpdate(b){var a=b instanceof Element,e=a&&"SPAN"==b.tagName&&"switch-left"==b.className,f=a&&"SPAN"==b.tagName&&"switch-both"==b.className,g=a&&"INPUT"==b.tagName&&"submit"==b.type,c=a&&"SPAN"==b.tagName&&("nav-mini"==b.parentNode.id||"nav-fiche"==b.parentNode.id),a=a&&"SPAN"==b.tagName&&"nav-contact"==b.parentNode.id;if(!(f||e||g||c||a)&&!0!==b)return!1;if(f)console.log("> switch firstname <-> lastname"),e=b.parentNode,b=e.children[8],e=e.children[10],f=b.value,b.value=e.value,e.value=
f;else if(e){console.log("> switch firstname+lastname -> username");e=b.parentNode;f=e.children[6];b=e.children[8];e=e.children[10];if(0<f.value.length||0==b.value.length&&0==e.value.length)return!1;f.value=b.value+" "+e.value;b.value="";e.value=""}else console.log("> dynamic update"),miniManager.fieldsToStorage(),ficheManager.fieldsToStorage(),contactManager.fieldsToStorage(),matriceManager.fieldsToStorage(),ficheManager.sync(),miniManager.sync(),miniManager.storageToFields(),ficheManager.storageToFields(),
matriceManager.storageToFields(),(g||a)&&contactManager.storageToFields()}function readableName(b,a,e){var f=a.length,g=e.length;return 0<b.length?0<f+g?b+" ("+(a+" "+e).trim()+")":b:0<f+g?(a+" "+e).trim():"Inconnu"}
include("/js/includes/input-phone-subject.js",function(){include("/js/includes/input-phone-contact.js",function(){include("/js/includes/input-phone-mini.js",function(){include("/js/includes/input-phone-fiche.js",function(){include("/js/includes/input-phone-matrice.js",function(){subjectManager=new inputPhoneSubject($('article.subject-panel [data-name="number"]'),$('article.subject-panel [data-name="username"]'),$('article.subject-panel [data-name="firstname"]'),$('article.subject-panel [data-name="lastname"]'),
$('article.subject-panel [data-name="submit"]'));subjectManager.attach();contactManager=new inputPhoneContact($("article.contact-panel"),$("#nav-contact"));contactManager.attach(dynamicUpdate);miniManager=new inputPhoneMini($("article.mini-relation-panel"),$("#nav-mini"));miniManager.attach(dynamicUpdate);ficheManager=new inputPhoneFiche($("article.relation-panel"),$("#nav-fiche"));ficheManager.attach(dynamicUpdate);matriceManager=new inputPhoneMatrice($("article.matrice-panel"));matriceManager.attach(dynamicUpdate);
$('input#call_log-import[type="file"]').addEventListener("click",function(a){a.target.value=null},!1);$('input#call_log-import[type="file"]').addEventListener("change",function(a){a={path:"upload/call_log",phone_number:$("#subject_phone_number").value,file:a.target.files[0]};api.send(a,function(a){console.log(a);if(0==a.ModuleError){for(var b=0,e=[],c=0;c<a.calls.length&&10>c;c++)e.push(a.calls[c].number);for(c=0;c<e.length;c++){var d=a.directory[e[c]].name.split(" ");lsi.set("contacts",b,{uid:b,
number:e[c],username:1==d.length?d[0]:"",firstname:1<d.length?d[0]:"",lastname:1<d.length?d.splice(1).join(" "):"",countsms:a.directory[e[c]].sms,countcall:a.directory[e[c]].calls,call:c,sms:-1});b++}for(var g=[],c=0;c<a.sms.length&&10>c;c++)g.push(a.sms[c].number);for(c=0;c<g.length;c++)if(d=e.indexOf(g[c]),-1<d){var k=lsi.get("contacts",d);k.sms=c;lsi.set("contacts",d,k)}else d=a.directory[g[c]].name.split(" "),lsi.set("contacts",b,{uid:b,number:g[c],username:1==d.length?d[0]:"",firstname:1<d.length?
d[0]:"",lastname:1<d.length?d.splice(1).join(" "):"",countsms:a.directory[g[c]].sms,countcall:a.directory[g[c]].calls,call:-1,sms:c}),b++;for(var h in a.directory)-1<e.indexOf(h)||-1<g.indexOf(h)||(d=(null===a.directory[h].name?"":a.directory[h].name).split(" "),lsi.set("contacts",b,{uid:b,number:h,username:1==d.length?d[0]:"",firstname:1<d.length?d[0]:"",lastname:1<d.length?d.splice(1).join(" "):"",countsms:a.directory[h].sms,countcall:a.directory[h].calls,call:-1,sms:-1}),b++);contactManager.storageToFields();
dynamicUpdate(!0)}})},!1);$("#clear-all").addEventListener("click",function(a){lsi.clear("subject");lsi.clear("contacts");lsi.clear("mini-fiches");lsi.clear("fiches");lsi.clear("matrice");subjectManager.storageToFields();contactManager.storageToFields();miniManager.storageToFields();ficheManager.storageToFields();matriceManager.storageToFields()},!1);$("#export-all").addEventListener("click",function(a){a={subject:lsi["export"]("subject")[0],contacts:lsi["export"]("contacts"),mini:lsi["export"]("mini-fiches"),
fiches:lsi["export"]("fiches"),matrice:lsi["export"]("matrice")[0]};var f=$("#download-target");f.download="local-data.json";f.href="data:application/octet-stream,"+encodeURIComponent(JSON.stringify(a));f.click()},!1);$("#import-all").addEventListener("click",function(a){$("#local-upload").click()},!1);$("#local-upload").addEventListener("click",function(a){a.target.value=null},!1);$("#local-upload").addEventListener("change",function(a){a={path:"upload/local_data",file:$("#local-upload").files[0]};
api.send(a,function(a){console.log(a);if(0!=a.ModuleError)return!1;console.log(a.local_data.matrice);lsi.set("subject",0,a.local_data.subject);lsi["import"]("contacts",a.local_data.contacts);lsi["import"]("mini-fiches",a.local_data.mini);lsi["import"]("fiches",a.local_data.fiches);lsi.set("matrice",0,a.local_data.matrice);subjectManager.storageToFields();contactManager.storageToFields();matriceManager.storageToFields();dynamicUpdate(!0)})},!1);$("#submit-all").addEventListener("click",function(a){console.log("> GATHERING ALL DATA");
subjectManager.fieldsToStorage();contactManager.fieldsToStorage();miniManager.fieldsToStorage();ficheManager.fieldsToStorage();a={path:"input/phone",subject:lsi["export"]("subject")[0],contacts:lsi["export"]("contacts"),mini:lsi["export"]("mini-fiches"),fiches:lsi["export"]("fiches")};api.send(a,function(a){console.log(a)},!1)},!1)})})})})});
$('input#call_log-import[type="file"]').addEventListener("click",function(b){b.target.value=null},!1);$('input#call_log-import[type="file"]').addEventListener("change",function(b){b={path:"upload/call_log",phone_number:$("#subject_phone_number").value,file:b.target.files[0]};api.send(b,function(a){console.log(a);var b=null;if(0!=a.ModuleError)9==a.ModuleError?Notification.error("Erreur","Il est n\u00e9cessaire de saisir les informations du <b>sujet</b> avant d'exporter son journal d'appel"):Notification.error("Erreur",
a.ModuleError);else{for(var b=Notification.info("Info","Chargement du journal d'appel"),f=0,g=[],c=0;c<a.calls.length&&10>c;c++)g.push(a.calls[c].number);for(c=0;c<g.length;c++){var d=a.directory[g[c]].name.split(" ");lsi.set("contacts",f,{uid:f,number:g[c],username:1==d.length?d[0]:"",firstname:1<d.length?d[0]:"",lastname:1<d.length?d.splice(1).join(" "):"",countsms:a.directory[g[c]].sms,countcall:a.directory[g[c]].calls,call:c,sms:-1});f++}console.warn(1);for(var h=[],c=0;c<a.sms.length&&10>c;c++)h.push(a.sms[c].number);
for(c=0;c<h.length;c++)if(d=g.indexOf(h[c]),-1<d){var l=lsi.get("contacts",d);l.sms=c;lsi.set("contacts",d,l)}else d=[""],null!=a.directory[h[c]].name&&(d=a.directory[h[c]].name.split(" ")),lsi.set("contacts",f,{uid:f,number:h[c],username:0<d.length?d[0]:"",firstname:0<d.length?d[0]:"",lastname:1<d.length?d.splice(1).join(" "):"",countsms:a.directory[h[c]].sms,countcall:a.directory[h[c]].calls,call:-1,sms:c}),f++;for(var k in a.directory)-1<g.indexOf(k)||-1<h.indexOf(k)||(d=(null===a.directory[k].name?
"":a.directory[k].name).split(" "),lsi.set("contacts",f,{uid:f,number:k,username:1==d.length?d[0]:"",firstname:1<d.length?d[0]:"",lastname:1<d.length?d.splice(1).join(" "):"",countsms:a.directory[k].sms,countcall:a.directory[k].calls,call:-1,sms:-1}),f++);console.warn(3);contactManager.storageToFields();dynamicUpdate(!0);null!=b&&b.click();Notification.success("OK","Chargement termin\u00e9")}})},!1);$("#clear-all").addEventListener("click",function(b){lsi.clear("subject");lsi.clear("contacts");lsi.clear("mini-fiches");
lsi.clear("fiches");lsi.clear("matrice");subjectManager.storageToFields();contactManager.storageToFields();miniManager.storageToFields();ficheManager.storageToFields();matriceManager.storageToFields();Notification.success("OK","Les donn\u00e9es ont \u00e9t\u00e9 supprim\u00e9es")},!1);$("#export-all").addEventListener("click",function(b){Notification.info("INFORMATION","Lancement du t\u00e9l\u00e9chargement de la sauvegarde");b={subject:lsi["export"]("subject")[0],contacts:lsi["export"]("contacts"),
mini:lsi["export"]("mini-fiches"),fiches:lsi["export"]("fiches"),matrice:lsi["export"]("matrice")[0]};var a=$("#download-target");a.download="local-data.json";a.href="data:application/octet-stream,"+encodeURIComponent(JSON.stringify(b));a.click()},!1);$("#import-all").addEventListener("click",function(b){$("#local-upload").click()},!1);$("#local-upload").addEventListener("click",function(b){b.target.value=null},!1);$("#local-upload").addEventListener("change",function(b){b={path:"upload/local_data",
file:$("#local-upload").files[0]};api.send(b,function(a){console.log(a);if(0!=a.ModuleError)return Notification.error("Erreur",a.ModuleError),!1;lsi.set("subject",0,a.local_data.subject);lsi["import"]("contacts",a.local_data.contacts);lsi["import"]("mini-fiches",a.local_data.mini);lsi["import"]("fiches",a.local_data.fiches);lsi.set("matrice",0,a.local_data.matrice);subjectManager.storageToFields();contactManager.storageToFields();matriceManager.storageToFields();dynamicUpdate(!0)})},!1);$("#submit-all").addEventListener("click",
function(b){console.log("> GATHERING ALL DATA");subjectManager.fieldsToStorage();contactManager.fieldsToStorage();miniManager.fieldsToStorage();ficheManager.fieldsToStorage();if(!subjectManager.check())return Notification.warning("Attention","Vous devez saisir les informations du <i>sujet</i>"),!1;b=lsi["export"]("mini-fiches");for(var a in b)if(!b[a].valid)return Notification.warning("Attention","La <i>fiche rapide</i> <b>"+(parseInt(a)+1)+"</b> est incompl\u00e8te et/ou incorrecte"),!1;b=lsi["export"]("fiches");
for(a in b)if(!b[a].valid)return Notification.warning("Attention","La <i>fiche compl\u00e8te</i> <b>"+(parseInt(a)+1)+"</b> est incompl\u00e8te et/ou incorrecte"),!1;a={path:"input/phone",subject:lsi["export"]("subject")[0],contacts:lsi["export"]("contacts"),mini:lsi["export"]("mini-fiches"),fiches:lsi["export"]("fiches"),matrice:lsi["export"]("matrice")[0]};api.send(a,function(a){if(0!=a.ModuleError)return Notification.error("ERREUR",a.ModuleError),!1;console.log(a)},!1)},!1)})})})})});

View File

@ -15,10 +15,6 @@ var miniManager;
var ficheManager;
var matriceManager;
// CONSTANTES
var defTrue = {status: true, value: 'on'};
var defFalse = {status: false, value: 'on'};
/* (2) Fonctions utiles */
function dynamicUpdate(target){
@ -95,14 +91,14 @@ function dynamicUpdate(target){
/* (4) On enregistre la MATRICE */
matriceManager.fieldsToStorage();
/* (5) On synchronise les MINI avec les CONTACTS */
miniManager.sync();
/* (6) On synchronise les FICHE avec les CONTACTS */
/* (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
ficheManager.sync();
/* (6) On synchronise les MINI avec les CONTACTS */
// Supprime les contacts déja dans les FICHES
miniManager.sync();
/* (7) On affiche le tout */
miniManager.storageToFields();
@ -115,15 +111,40 @@ function dynamicUpdate(target){
}
}
// Vérifie qu'une seule valeur vaut TRUE et les autres false (objet deflated de type <radio> )
function checkRadioValue(selectData){
var nbTrue = 0;
for( var i = 0 ; i < selectData.length ; i++ )
if( selectData[i].status === true )
nbTrue++;
if( nbTrue != 1 ) return false;
else return true;
/* AFFICHE UN NOM EXPLICITE A PARTIR DE @u username, @f firstname, et @l lastname
*
*/
function readableName(u, f, l){
/* (1) On calcule les tailles des chaines */
var ul = u.length,
fl = f.length,
ll = l.length;
/* (2) Si @username n'est pas vide */
if( ul > 0 ){
/* (3) Si @username+(@firstname et/ou @lastname) -> username (firstname lastname) */
if( fl+ll > 0 )
return u+' ('+(f+' '+l).trim()+')';
/* (4) Si @username uniquement -> username */
else
return u;
/* (5) Si pas @username */
}else{
/* (6) Si @firstname et/ou @lastname -> firstname lastname*/
if( fl+ll > 0 )
return (f+' '+l).trim();
/* (7) Si rien -> Inconnu */
else
return 'Inconnu';
}
}
@ -137,17 +158,10 @@ function checkRadioValue(selectData){
/* [2] Inclusion des scripts externes et lancement
=========================================================*/
// TODO: Mettre les versions minifiées
include('/js/includes/input-phone-subject.js', function(){
include('/js/includes/input-phone-contact.js', function(){
include('/js/includes/input-phone-mini.js', function(){
@ -250,9 +264,17 @@ include('/js/includes/input-phone-matrice.js', function(){
api.send(request, function(response){
console.log(response);
var loadingNotif = null;
// Si erreur, on quitte
if( response.ModuleError != 0 )
if( response.ModuleError != 0 ){
if( response.ModuleError == 9 )
Notification.error('Erreur', 'Il est nécessaire de saisir les informations du <b>sujet</b> avant d\'exporter son journal d\'appel');
else
Notification.error('Erreur', response.ModuleError);
return;
}else
loadingNotif = Notification.info('Info', 'Chargement du journal d\'appel');
@ -282,6 +304,7 @@ include('/js/includes/input-phone-matrice.js', function(){
uid++;
}
console.warn(1);
@ -301,13 +324,16 @@ include('/js/includes/input-phone-matrice.js', function(){
continue;
}
var splittedName = response.directory[most_sms[i]].name.split(' ');
var splittedName = [''];
if( response.directory[most_sms[i]].name != null )
splittedName = response.directory[most_sms[i]].name.split(' ');
lsi.set('contacts', uid, {
uid: uid,
number: most_sms[i],
username: splittedName.length == 1 ? splittedName[0] : '', // Si un seul mot -> pseudo
firstname: splittedName.length > 1 ? splittedName[0] : '', // Si plusieurs mots -> le 1er est le prénom
username: splittedName.length > 0 ? splittedName[0] : '', // Si un seul mot -> pseudo
firstname: splittedName.length > 0 ? splittedName[0] : '', // Si plusieurs mots -> le 1er est le prénom
lastname: splittedName.length > 1 ? splittedName.splice(1).join(' ') : '', // et les autres sont le nom
countsms: response.directory[most_sms[i]].sms, // Nombre de sms
countcall: response.directory[most_sms[i]].calls, // Nombre d'appels
@ -351,11 +377,20 @@ include('/js/includes/input-phone-matrice.js', function(){
uid++;
}
console.warn(3);
/* (8) On met à jour l'affichage */
contactManager.storageToFields();
dynamicUpdate(true);
/* (9) On notifie la fin du chargement */
// On retire la notification de chargement
if( loadingNotif != null )
loadingNotif.click();
// On notifie que tout s'est bien passé
Notification.success('OK', 'Chargement terminé');
});
}, false);
@ -379,6 +414,8 @@ include('/js/includes/input-phone-matrice.js', function(){
miniManager.storageToFields();
ficheManager.storageToFields();
matriceManager.storageToFields();
Notification.success('OK', 'Les données ont été supprimées');
}, false);
@ -386,6 +423,9 @@ include('/js/includes/input-phone-matrice.js', function(){
/* (8) Gestion de l'export des données locales
---------------------------------------------------------*/
$('#export-all').addEventListener('click', function(e){
Notification.info('INFORMATION', 'Lancement du téléchargement de la sauvegarde');
/* (1) On construit les données */
var data = {
subject: lsi.export('subject')[0],
@ -433,10 +473,10 @@ include('/js/includes/input-phone-matrice.js', function(){
console.log(response);
// Si erreur, on quitte
if( response.ModuleError != 0 )
if( response.ModuleError != 0 ){
Notification.error('Erreur', response.ModuleError);
return false;
console.log(response.local_data.matrice);
}
/* (3) On enregistre les données dans le 'localStorage' */
lsi.set('subject', 0, response.local_data.subject);
@ -469,24 +509,54 @@ include('/js/includes/input-phone-matrice.js', function(){
miniManager.fieldsToStorage();
ficheManager.fieldsToStorage();
/* (2) On prépare la requête avec toutes les données */
/* (2) Vérification de la validité de toutes les données */
// {1} Vérification du sujet //
if( !subjectManager.check() ){
Notification.warning('Attention', 'Vous devez saisir les informations du <i>sujet</i>');
return false;
}
// {2} Vérification des mini-fiches //
var mini = lsi.export('mini-fiches');
for( var id in mini )
if( !mini[id].valid ){
Notification.warning('Attention', 'La <i>fiche rapide</i> <b>'+(parseInt(id)+1)+'</b> est incomplète et/ou incorrecte');
return false;
}
// {3} Vérification des fiches //
var fiches = lsi.export('fiches');
for( var id in fiches )
if( !fiches[id].valid ){
Notification.warning('Attention', 'La <i>fiche complète</i> <b>'+(parseInt(id)+1)+'</b> est incomplète et/ou incorrecte');
return false;
}
/* (3) On prépare la requête avec toutes les données */
var request = {
path: 'input/phone',
subject: lsi.export('subject')[0],
contacts: lsi.export('contacts'),
mini: lsi.export('mini-fiches'),
fiches: lsi.export('fiches')
fiches: lsi.export('fiches'),
matrice: lsi.export('matrice')[0]
};
/* (3) On envoie la requête et traite la réponse */
/* (4) On envoie la requête et traite la réponse */
api.send(request, function(response){
// Si erreur, on la notifie
if( response.ModuleError != 0 ){
Notification.error('ERREUR', response.ModuleError);
return false;
}
console.log(response);
}, false);
}, false);
}); }); }); }); });