Merged feature/input_phone into dev

This commit is contained in:
xdrm-brackets 2016-05-09 09:34:42 +02:00
commit 6c764edddb
64 changed files with 3524 additions and 3347 deletions

View File

@ -44,11 +44,11 @@
echo $num.' <> '.$name.'<br>';
}
parseCallLog();
// parseCallLog();
/* () Test du client de l'API generique */
/* [1] Test du client de l'API generique
=========================================================*/
// $api = new client();
// $response = $api->send('generate-network-chart-data', array(
@ -57,10 +57,32 @@
// var_dump($response);
// var_dump( Database::delNumeric( Database::getPDO()->query("SHOW COLUMNS FROM users")->fetchAll() ) );
/* [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) );
/* [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 //
// var_dump($_FILES);
//
// if( isset($_FILES) ){
//
// $request = new ModuleRequest('upload/local_data', array() );
// $response = $request->dispatch();
// var_dump( ManagerError::explicit($response->error) );
//
// }
?>

View File

@ -29,6 +29,13 @@
"description": "Méthode utile à phpunit pour le test des permissions.",
"permissions": ["a", "b"],
"parameters": {}
},
"markdown": {
"description": "Retourne une description en markdown des différents modules de l'API",
"permissions": [],
"parameters": {}
}
},
@ -92,12 +99,12 @@
"description": "Recupere le contenu d'un fichier XML de journal d'appel s'il a été importé au préalable.",
"permissions": [],
"parameters": {
"phone_number": { "description": "Numéro de téléphone de l'interrogé.", "type": "phone_number" }
"phone_number": { "description": "Numéro de téléphone de l'interrogé.", "type": "number" }
}
}
},
"charts": {
"chart": {
"network_data": {
"description": "Renvoie un jeu de donnees fictif pour un graphique de type #network.",
@ -178,13 +185,39 @@
},
"input": {
"phone": {
"description": "Enregistre les données d'une enquête téléphonique.",
"permissions": ["admin"],
"parameters": {
"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>" }
}
}
},
"upload": {
"call_log": {
"description": "Upload d'un journal d'appel au format .xml.",
"permissions": ["admin"],
"parameters": {
"file": { "description": "Fichier du journal d'appel", "type": "FILE" }
"phone_number": { "description": "Numéro de téléphone de l'interrogé.", "type": "number" },
"file": { "description": "Fichier du journal d'appel.", "type": "FILE" }
}
},
"local_data": {
"description": "Upload d'une sauvegarde de formulaire local au format .json.",
"permissions": ["admin"],
"parameters": {
"file": { "description": "Fichier du de sauvegarde de formulaire local.", "type": "FILE" }
}
}

View File

@ -2,6 +2,7 @@
"root": "/src/upload",
"directories": [
"call_log",
"local_data",
"spss",
"pspp"
]

View File

@ -82,6 +82,7 @@
-ms-user-select: none; /* IE/Edge */
user-select: none; /* non-prefixed */
cursor: pointer;
// Receptacle
&:before{
@ -104,6 +105,11 @@
cursor: pointer;
}
// Animation de hover pour le texte
&:hover{
text-decoration: underline;
}
}
// Quand actif
@ -117,6 +123,10 @@
// Specifique a checkbox
& input[type="checkbox"] + label[for]:before{
border-radius: 3px;
@include transition( border .1s ease-in-out );
}
& input[type="checkbox"] + label[for]:hover:before{
border-color: darken($theme-fg-primary, 15);
}

File diff suppressed because one or more lines are too long

View File

@ -6,9 +6,9 @@
"../constants.scss"
],
"sourcesContent": [
"@import 'constants.scss';\n\n#WRAPPER > #CONTAINER{\n\n\t/* [1] Section (contenu)\n\t=========================================================*/\n\t& > section{\n\t\tdisplay: none;\n\n\t\tmargin: 3em;\n\n\t\t// Gestion de l'activation des sous-parties\n\t\t&.active{ display: block; }\n\n\t\t// Gestion d'une section contenant des graphiques\n\t\t&.charts{\n\t\t\tdisplay: flex;\n\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: space-around;\n\t\t}\n\n\t\tposition: relative;\n\t\tflex-grow: 1;\n\n\t\tpadding: 1em;\n\n\t\tborder-radius: 3px;\n\n\t\tbackground-color: #fff;\n\n\t\tcolor: #000;\n\t\tfont-size: 1em;\n\n\t\tborder: 1px solid #ddd;\n\n\n\n\t\t/* [2] Titres\n\t\t=========================================================*/\n\t\t& h6{\n\t\t\tcolor: lighten($theme-fg, 20);\n\t\t\tfont-size: 1.2em;\n\t\t\ttext-transform: uppercase;\n\t\t\tfont-weight: 300;\n\t\t\tletter-spacing: .2em;\n\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\n\t\t\t&:before{content:'- ';}\n\t\t\t&:after{content:' -';}\n\n\t\t\t// quand centré\n\t\t\t&.center{\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t}\n\n\n\n\n\n\t\t/* [3][4] Boutons radio + Checkboxes\n\t\t=========================================================*/\n\t\t& input[type=\"radio\"],\n\t\t& input[type=\"checkbox\"]{\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t// Label\n\t\t& input[type=\"radio\"] + label[for],\n\t\t& input[type=\"checkbox\"] + label[for]{\n\t\t\tpadding-left: .8em;\n\n\t\t\t// Pas de selection\n\t\t\t-webkit-touch-callout: none; /* iOS Safari */\n\t\t\t-webkit-user-select: none; /* Chrome/Safari/Opera */\n\t\t\t-khtml-user-select: none; /* Konqueror */\n\t\t\t-moz-user-select: none; /* Firefox */\n\t\t\t-ms-user-select: none; /* IE/Edge */\n\t\t\tuser-select: none; /* non-prefixed */\n\n\n\t\t\t// Receptacle\n\t\t\t&:before{\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tposition: relative;\n\t\t\t\t\ttop: .1em;\n\t\t\t\t\tleft: -.8em;\n\t\t\t\t\twidth: calc( 1em - 2*.15em );\n\t\t\t\t\theight: calc( 1em - 2*.15em );\n\n\t\t\t\tborder-radius: 50% / 50%;\n\t\t\t\tborder: .15em solid $theme-fg-primary;\n\n\t\t\t\tbackground: #fff center center no-repeat;\n\t\t\t\tbackground-image: none;\n\t\t\t\tbackground-size: 70% auto;\n\n\t\t\t\t@include transition( background .2s ease-in-out );\n\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\n\t\t// Quand actif\n\t\t& input[type=\"radio\"]:checked + label[for]:before,\n\t\t& input[type=\"checkbox\"]:checked + label[for]:before{\n\t\t\tbackground-color: $theme-fg-primary;\n\t\t\tbackground-image: url('/f/svg/checked/st/container');\n\t\t}\n\n\n\t\t// Specifique a checkbox\n\t\t& input[type=\"checkbox\"] + label[for]:before{\n\t\t\tborder-radius: 3px;\n\t\t}\n\n\n\n\n\n\t\t/* [5] Boutons de submit\n\t\t=========================================================*/\n\t\t& input[type=\"submit\"],\n\t\t& input[type=\"button\"]{\n\t\t\tmargin: .5em 0;\n\t\t\tpadding: .3em .5em;\n\n\t\t\tborder-radius: 3px;\n\t\t\tborder: 1px solid $theme-fg;\n\n\t\t\tcolor: $theme-fg;\n\n\t\t\tbackground-color: #fff;\n\n\t\t\t@include transition( background .1s ease-in-out, color .1s ease-in-out );\n\n\t\t\t/* (1) Animation de @hover */\n\t\t\t&:hover{\n\t\t\t\tbackground-color: $theme-fg;\n\t\t\t\tcolor: #fff;\n\t\t\t}\n\n\n\t\t\t/* (2) Bouton primaire */\n\t\t\t&.primary{\n\t\t\t\tborder-color: $theme-fg-primary;\n\t\t\t\tcolor: $theme-fg-primary;\n\t\t\t\tbackground-color: #fff;\n\n\n\t\t\t\t/* (3) Animation de @hover pour bouton primaire */\n\t\t\t\t&:hover{\n\t\t\t\t\tbackground-color: $theme-fg-primary;\n\t\t\t\t\tcolor: #fff;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t}\n\n\t\t/* [6] Images inline\n\t\t=========================================================*/\n\t\t& img{\n\t\t\tmargin: 1em;\n\t\t\theight: 3em;\n\t\t}\n\n\t\t/* [7] Contour flags\n\t\t=========================================================*/\n\t\t& .flag{\n\t\t\tmargin: 0 .8em;\n\t\t\tpadding: .2em .5em;\n\n\t\t\tborder-radius: 5px;\n\t\t\tborder: 1px solid #b5b5b5;\n\n\t\t\tcolor: #555;\n\t\t\tfont-family: 'Inconsolata';\n\t\t}\n\n\n\t}\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"
"@import 'constants.scss';\n\n#WRAPPER > #CONTAINER{\n\n\t/* [1] Section (contenu)\n\t=========================================================*/\n\t& > section{\n\t\tdisplay: none;\n\n\t\tmargin: 3em;\n\n\t\t// Gestion de l'activation des sous-parties\n\t\t&.active{ display: block; }\n\n\t\t// Gestion d'une section contenant des graphiques\n\t\t&.charts{\n\t\t\tdisplay: flex;\n\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: space-around;\n\t\t}\n\n\t\tposition: relative;\n\t\tflex-grow: 1;\n\n\t\tpadding: 1em;\n\n\t\tborder-radius: 3px;\n\n\t\tbackground-color: #fff;\n\n\t\tcolor: #000;\n\t\tfont-size: 1em;\n\n\t\tborder: 1px solid #ddd;\n\n\n\n\t\t/* [2] Titres\n\t\t=========================================================*/\n\t\t& h6{\n\t\t\tcolor: lighten($theme-fg, 20);\n\t\t\tfont-size: 1.2em;\n\t\t\ttext-transform: uppercase;\n\t\t\tfont-weight: 300;\n\t\t\tletter-spacing: .2em;\n\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\n\t\t\t&:before{content:'- ';}\n\t\t\t&:after{content:' -';}\n\n\t\t\t// quand centré\n\t\t\t&.center{\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t}\n\n\n\n\n\n\t\t/* [3][4] Boutons radio + Checkboxes\n\t\t=========================================================*/\n\t\t& input[type=\"radio\"],\n\t\t& input[type=\"checkbox\"]{\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t// Label\n\t\t& input[type=\"radio\"] + label[for],\n\t\t& input[type=\"checkbox\"] + label[for]{\n\t\t\tpadding-left: .8em;\n\n\t\t\t// Pas de selection\n\t\t\t-webkit-touch-callout: none; /* iOS Safari */\n\t\t\t-webkit-user-select: none; /* Chrome/Safari/Opera */\n\t\t\t-khtml-user-select: none; /* Konqueror */\n\t\t\t-moz-user-select: none; /* Firefox */\n\t\t\t-ms-user-select: none; /* IE/Edge */\n\t\t\tuser-select: none; /* non-prefixed */\n\n\t\t\tcursor: pointer;\n\n\t\t\t// Receptacle\n\t\t\t&:before{\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tposition: relative;\n\t\t\t\t\ttop: .1em;\n\t\t\t\t\tleft: -.8em;\n\t\t\t\t\twidth: calc( 1em - 2*.15em );\n\t\t\t\t\theight: calc( 1em - 2*.15em );\n\n\t\t\t\tborder-radius: 50% / 50%;\n\t\t\t\tborder: .15em solid $theme-fg-primary;\n\n\t\t\t\tbackground: #fff center center no-repeat;\n\t\t\t\tbackground-image: none;\n\t\t\t\tbackground-size: 70% auto;\n\n\t\t\t\t@include transition( background .2s ease-in-out );\n\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\n\t\t\t// Animation de hover pour le texte\n\t\t\t&:hover{\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\n\t\t// Quand actif\n\t\t& input[type=\"radio\"]:checked + label[for]:before,\n\t\t& input[type=\"checkbox\"]:checked + label[for]:before{\n\t\t\tbackground-color: $theme-fg-primary;\n\t\t\tbackground-image: url('/f/svg/checked/st/container');\n\t\t}\n\n\n\t\t// Specifique a checkbox\n\t\t& input[type=\"checkbox\"] + label[for]:before{\n\t\t\tborder-radius: 3px;\n\t\t\t@include transition( border .1s ease-in-out );\n\t\t}\n\t\t& input[type=\"checkbox\"] + label[for]:hover:before{\n\t\t\tborder-color: darken($theme-fg-primary, 15);\n\t\t}\n\n\n\n\n\n\t\t/* [5] Boutons de submit\n\t\t=========================================================*/\n\t\t& input[type=\"submit\"],\n\t\t& input[type=\"button\"]{\n\t\t\tmargin: .5em 0;\n\t\t\tpadding: .3em .5em;\n\n\t\t\tborder-radius: 3px;\n\t\t\tborder: 1px solid $theme-fg;\n\n\t\t\tcolor: $theme-fg;\n\n\t\t\tbackground-color: #fff;\n\n\t\t\t@include transition( background .1s ease-in-out, color .1s ease-in-out );\n\n\t\t\t/* (1) Animation de @hover */\n\t\t\t&:hover{\n\t\t\t\tbackground-color: $theme-fg;\n\t\t\t\tcolor: #fff;\n\t\t\t}\n\n\n\t\t\t/* (2) Bouton primaire */\n\t\t\t&.primary{\n\t\t\t\tborder-color: $theme-fg-primary;\n\t\t\t\tcolor: $theme-fg-primary;\n\t\t\t\tbackground-color: #fff;\n\n\n\t\t\t\t/* (3) Animation de @hover pour bouton primaire */\n\t\t\t\t&:hover{\n\t\t\t\t\tbackground-color: $theme-fg-primary;\n\t\t\t\t\tcolor: #fff;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t}\n\n\t\t/* [6] Images inline\n\t\t=========================================================*/\n\t\t& img{\n\t\t\tmargin: 1em;\n\t\t\theight: 3em;\n\t\t}\n\n\t\t/* [7] Contour flags\n\t\t=========================================================*/\n\t\t& .flag{\n\t\t\tmargin: 0 .8em;\n\t\t\tpadding: .2em .5em;\n\n\t\t\tborder-radius: 5px;\n\t\t\tborder: 1px solid #b5b5b5;\n\n\t\t\tcolor: #555;\n\t\t\tfont-family: 'Inconsolata';\n\t\t}\n\n\n\t}\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: #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.scss';\n\n#WRAPPER > #CONTAINER{\n\n\t/* [1] Section (contenu)\n\t=========================================================*/\n\t& > section{\n\t\tdisplay: none;\n\n\t\tmargin: 3em;\n\n\t\t// Gestion de l'activation des sous-parties\n\t\t&.active{ display: block; }\n\n\t\t// Gestion d'une section contenant des graphiques\n\t\t&.charts{\n\t\t\tdisplay: flex;\n\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: space-around;\n\t\t}\n\n\t\tposition: relative;\n\t\tflex-grow: 1;\n\n\t\tpadding: 1em;\n\n\t\tborder-radius: 3px;\n\n\t\tbackground-color: #fff;\n\n\t\tcolor: #000;\n\t\tfont-size: 1em;\n\n\t\tborder: 1px solid #ddd;\n\n\n\n\t\t/* [2] Titres\n\t\t=========================================================*/\n\t\t& h6{\n\t\t\tcolor: lighten($theme-fg, 20);\n\t\t\tfont-size: 1.2em;\n\t\t\ttext-transform: uppercase;\n\t\t\tfont-weight: 300;\n\t\t\tletter-spacing: .2em;\n\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\n\t\t\t&:before{content:'- ';}\n\t\t\t&:after{content:' -';}\n\n\t\t\t// quand centré\n\t\t\t&.center{\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t}\n\n\n\n\n\n\t\t/* [3][4] Boutons radio + Checkboxes\n\t\t=========================================================*/\n\t\t& input[type=\"radio\"],\n\t\t& input[type=\"checkbox\"]{\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t// Label\n\t\t& input[type=\"radio\"] + label[for],\n\t\t& input[type=\"checkbox\"] + label[for]{\n\t\t\tpadding-left: .8em;\n\n\t\t\t// Pas de selection\n\t\t\t-webkit-touch-callout: none; /* iOS Safari */\n\t\t\t-webkit-user-select: none; /* Chrome/Safari/Opera */\n\t\t\t-khtml-user-select: none; /* Konqueror */\n\t\t\t-moz-user-select: none; /* Firefox */\n\t\t\t-ms-user-select: none; /* IE/Edge */\n\t\t\tuser-select: none; /* non-prefixed */\n\n\n\t\t\t// Receptacle\n\t\t\t&:before{\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tposition: relative;\n\t\t\t\t\ttop: .1em;\n\t\t\t\t\tleft: -.8em;\n\t\t\t\t\twidth: calc( 1em - 2*.15em );\n\t\t\t\t\theight: calc( 1em - 2*.15em );\n\n\t\t\t\tborder-radius: 50% / 50%;\n\t\t\t\tborder: .15em solid $theme-fg-primary;\n\n\t\t\t\tbackground: #fff center center no-repeat;\n\t\t\t\tbackground-image: none;\n\t\t\t\tbackground-size: 70% auto;\n\n\t\t\t\t@include transition( background .2s ease-in-out );\n\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\n\t\t// Quand actif\n\t\t& input[type=\"radio\"]:checked + label[for]:before,\n\t\t& input[type=\"checkbox\"]:checked + label[for]:before{\n\t\t\tbackground-color: $theme-fg-primary;\n\t\t\tbackground-image: url('/f/svg/checked/st/container');\n\t\t}\n\n\n\t\t// Specifique a checkbox\n\t\t& input[type=\"checkbox\"] + label[for]:before{\n\t\t\tborder-radius: 3px;\n\t\t}\n\n\n\n\n\n\t\t/* [5] Boutons de submit\n\t\t=========================================================*/\n\t\t& input[type=\"submit\"],\n\t\t& input[type=\"button\"]{\n\t\t\tmargin: .5em 0;\n\t\t\tpadding: .3em .5em;\n\n\t\t\tborder-radius: 3px;\n\t\t\tborder: 1px solid $theme-fg;\n\n\t\t\tcolor: $theme-fg;\n\n\t\t\tbackground-color: #fff;\n\n\t\t\t@include transition( background .1s ease-in-out, color .1s ease-in-out );\n\n\t\t\t/* (1) Animation de @hover */\n\t\t\t&:hover{\n\t\t\t\tbackground-color: $theme-fg;\n\t\t\t\tcolor: #fff;\n\t\t\t}\n\n\n\t\t\t/* (2) Bouton primaire */\n\t\t\t&.primary{\n\t\t\t\tborder-color: $theme-fg-primary;\n\t\t\t\tcolor: $theme-fg-primary;\n\t\t\t\tbackground-color: #fff;\n\n\n\t\t\t\t/* (3) Animation de @hover pour bouton primaire */\n\t\t\t\t&:hover{\n\t\t\t\t\tbackground-color: $theme-fg-primary;\n\t\t\t\t\tcolor: #fff;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t}\n\n\t\t/* [6] Images inline\n\t\t=========================================================*/\n\t\t& img{\n\t\t\tmargin: 1em;\n\t\t\theight: 3em;\n\t\t}\n\n\t\t/* [7] Contour flags\n\t\t=========================================================*/\n\t\t& .flag{\n\t\t\tmargin: 0 .8em;\n\t\t\tpadding: .2em .5em;\n\n\t\t\tborder-radius: 5px;\n\t\t\tborder: 1px solid #b5b5b5;\n\n\t\t\tcolor: #555;\n\t\t\tfont-family: 'Inconsolata';\n\t\t}\n\n\n\t}\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"
"@import 'constants.scss';\n\n#WRAPPER > #CONTAINER{\n\n\t/* [1] Section (contenu)\n\t=========================================================*/\n\t& > section{\n\t\tdisplay: none;\n\n\t\tmargin: 3em;\n\n\t\t// Gestion de l'activation des sous-parties\n\t\t&.active{ display: block; }\n\n\t\t// Gestion d'une section contenant des graphiques\n\t\t&.charts{\n\t\t\tdisplay: flex;\n\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tjustify-content: space-around;\n\t\t}\n\n\t\tposition: relative;\n\t\tflex-grow: 1;\n\n\t\tpadding: 1em;\n\n\t\tborder-radius: 3px;\n\n\t\tbackground-color: #fff;\n\n\t\tcolor: #000;\n\t\tfont-size: 1em;\n\n\t\tborder: 1px solid #ddd;\n\n\n\n\t\t/* [2] Titres\n\t\t=========================================================*/\n\t\t& h6{\n\t\t\tcolor: lighten($theme-fg, 20);\n\t\t\tfont-size: 1.2em;\n\t\t\ttext-transform: uppercase;\n\t\t\tfont-weight: 300;\n\t\t\tletter-spacing: .2em;\n\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\n\t\t\t&:before{content:'- ';}\n\t\t\t&:after{content:' -';}\n\n\t\t\t// quand centré\n\t\t\t&.center{\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t}\n\n\n\n\n\n\t\t/* [3][4] Boutons radio + Checkboxes\n\t\t=========================================================*/\n\t\t& input[type=\"radio\"],\n\t\t& input[type=\"checkbox\"]{\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t// Label\n\t\t& input[type=\"radio\"] + label[for],\n\t\t& input[type=\"checkbox\"] + label[for]{\n\t\t\tpadding-left: .8em;\n\n\t\t\t// Pas de selection\n\t\t\t-webkit-touch-callout: none; /* iOS Safari */\n\t\t\t-webkit-user-select: none; /* Chrome/Safari/Opera */\n\t\t\t-khtml-user-select: none; /* Konqueror */\n\t\t\t-moz-user-select: none; /* Firefox */\n\t\t\t-ms-user-select: none; /* IE/Edge */\n\t\t\tuser-select: none; /* non-prefixed */\n\n\t\t\tcursor: pointer;\n\n\t\t\t// Receptacle\n\t\t\t&:before{\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tposition: relative;\n\t\t\t\t\ttop: .1em;\n\t\t\t\t\tleft: -.8em;\n\t\t\t\t\twidth: calc( 1em - 2*.15em );\n\t\t\t\t\theight: calc( 1em - 2*.15em );\n\n\t\t\t\tborder-radius: 50% / 50%;\n\t\t\t\tborder: .15em solid $theme-fg-primary;\n\n\t\t\t\tbackground: #fff center center no-repeat;\n\t\t\t\tbackground-image: none;\n\t\t\t\tbackground-size: 70% auto;\n\n\t\t\t\t@include transition( background .2s ease-in-out );\n\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\n\t\t\t// Animation de hover pour le texte\n\t\t\t&:hover{\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\n\t\t// Quand actif\n\t\t& input[type=\"radio\"]:checked + label[for]:before,\n\t\t& input[type=\"checkbox\"]:checked + label[for]:before{\n\t\t\tbackground-color: $theme-fg-primary;\n\t\t\tbackground-image: url('/f/svg/checked/st/container');\n\t\t}\n\n\n\t\t// Specifique a checkbox\n\t\t& input[type=\"checkbox\"] + label[for]:before{\n\t\t\tborder-radius: 3px;\n\t\t\t@include transition( border .1s ease-in-out );\n\t\t}\n\t\t& input[type=\"checkbox\"] + label[for]:hover:before{\n\t\t\tborder-color: darken($theme-fg-primary, 15);\n\t\t}\n\n\n\n\n\n\t\t/* [5] Boutons de submit\n\t\t=========================================================*/\n\t\t& input[type=\"submit\"],\n\t\t& input[type=\"button\"]{\n\t\t\tmargin: .5em 0;\n\t\t\tpadding: .3em .5em;\n\n\t\t\tborder-radius: 3px;\n\t\t\tborder: 1px solid $theme-fg;\n\n\t\t\tcolor: $theme-fg;\n\n\t\t\tbackground-color: #fff;\n\n\t\t\t@include transition( background .1s ease-in-out, color .1s ease-in-out );\n\n\t\t\t/* (1) Animation de @hover */\n\t\t\t&:hover{\n\t\t\t\tbackground-color: $theme-fg;\n\t\t\t\tcolor: #fff;\n\t\t\t}\n\n\n\t\t\t/* (2) Bouton primaire */\n\t\t\t&.primary{\n\t\t\t\tborder-color: $theme-fg-primary;\n\t\t\t\tcolor: $theme-fg-primary;\n\t\t\t\tbackground-color: #fff;\n\n\n\t\t\t\t/* (3) Animation de @hover pour bouton primaire */\n\t\t\t\t&:hover{\n\t\t\t\t\tbackground-color: $theme-fg-primary;\n\t\t\t\t\tcolor: #fff;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t}\n\n\t\t/* [6] Images inline\n\t\t=========================================================*/\n\t\t& img{\n\t\t\tmargin: 1em;\n\t\t\theight: 3em;\n\t\t}\n\n\t\t/* [7] Contour flags\n\t\t=========================================================*/\n\t\t& .flag{\n\t\t\tmargin: 0 .8em;\n\t\t\tpadding: .2em .5em;\n\n\t\t\tborder-radius: 5px;\n\t\t\tborder: 1px solid #b5b5b5;\n\n\t\t\tcolor: #555;\n\t\t\tfont-family: 'Inconsolata';\n\t\t}\n\n\n\t}\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: #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": "AAEA,QAAQ,CAAG,UAAU,CAIhB,OAAO,AAAA,CACV,OAAO,CAAE,IAAK,CAEd,MAAM,CAAE,GAAI,CAcZ,QAAQ,CAAE,QAAS,CACnB,SAAS,CAAE,CAAE,CAEb,OAAO,CAAE,GAAI,CAEb,aAAa,CAAE,GAAI,CAEnB,gBAAgB,CAAE,IAAK,CAEvB,KAAK,CAAE,IAAK,CACZ,SAAS,CAAE,GAAI,CAEf,MAAM,CAAE,cAAe,CAuJvB,AAxLF,QAAQ,CAAG,UAAU,CAIhB,OAAO,AAMT,OAAO,AAAA,CAAE,OAAO,CAAE,KAAM,CAAI,AAV/B,QAAQ,CAAG,UAAU,CAIhB,OAAO,AAST,OAAO,AAAA,CACP,OAAO,CAAE,IAAK,CAEd,cAAc,CAAE,GAAI,CACpB,SAAS,CAAE,IAAK,CAChB,eAAe,CAAE,YAAa,CAC9B,AAnBH,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAmCR,EAAE,AAAA,CACH,KAAK,CAAE,OAAO,CACd,SAAS,CAAE,KAAM,CACjB,cAAc,CAAE,SAAU,CAC1B,WAAW,CAAE,GAAI,CACjB,cAAc,CAAE,IAAK,CAErB,MAAM,CAAE,CAAE,CACV,OAAO,CAAE,CAAE,CASX,AAxDH,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAmCR,EAAE,AAUF,OAAO,AAAA,CAAC,OAAO,CAAC,IAAK,CAAG,AAjD5B,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAmCR,EAAE,AAWF,MAAM,AAAA,CAAC,OAAO,CAAC,IAAK,CAAG,AAlD3B,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAmCR,EAAE,AAcF,OAAO,AAAA,CACP,UAAU,CAAE,MAAO,CACnB,AAvDJ,QAAQ,CAAG,UAAU,CAIhB,OAAO,CA4DR,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,EAhEV,QAAQ,CAAG,UAAU,CAIhB,OAAO,CA6DR,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,CAAgB,CACvB,OAAO,CAAE,IAAK,CACd,AAnEH,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAkER,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,EAAgB,KAAK,CAAA,AAAA,GAAC,AAAA,EAtEhC,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAmER,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,EAAmB,KAAK,CAAA,AAAA,GAAC,AAAA,CAAI,CACpC,YAAY,CAAE,IAAK,CAGnB,qBAAqB,CAAE,IAAK,CAC5B,mBAAmB,CAAI,IAAK,CAC5B,kBAAkB,CAAK,IAAK,CAC5B,gBAAgB,CAAO,IAAK,CAC5B,eAAe,CAAQ,IAAK,CAC5B,WAAW,CAAY,IAAK,CAwB5B,AAxGH,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAkER,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,EAAgB,KAAK,CAAA,AAAA,GAAC,AAAA,CAc5B,OAAO,CApFX,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAmER,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,EAAmB,KAAK,CAAA,AAAA,GAAC,AAAA,CAa/B,OAAO,AAAA,CACP,OAAO,CAAE,EAAG,CACZ,OAAO,CAAE,YAAa,CACtB,QAAQ,CAAE,QAAS,CAClB,GAAG,CAAE,IAAK,CACV,IAAI,CAAE,KAAM,CACZ,KAAK,CAAE,oBAAI,CACX,MAAM,CAAE,oBAAI,CAEb,aAAa,CAAE,SAAU,CACzB,MAAM,CAAE,MAAK,CAAC,KAAK,CC1FJ,OAAO,CD4FtB,UAAU,CAAE,4BAA6B,CACzC,gBAAgB,CAAE,IAAK,CACvB,eAAe,CAAE,QAAS,CC7D1B,kBAAkB,CD+DG,UAAU,CAAC,IAAG,CAAC,WAAW,CC9D/C,UAAU,CD8DW,UAAU,CAAC,IAAG,CAAC,WAAW,CAE/C,MAAM,CAAE,OAAQ,CAChB,AAvGJ,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAuGR,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,CAAa,QAAQ,CAAG,KAAK,CAAA,AAAA,GAAC,AAAA,CAAI,OAAO,CA3GnD,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAwGR,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,CAAgB,QAAQ,CAAG,KAAK,CAAA,AAAA,GAAC,AAAA,CAAI,OAAO,AAAA,CACnD,gBAAgB,CCzGA,OAAO,CD0GvB,gBAAgB,CAAE,kCAAG,CACrB,AA/GH,QAAQ,CAAG,UAAU,CAIhB,OAAO,CA+GR,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,EAAmB,KAAK,CAAA,AAAA,GAAC,AAAA,CAAI,OAAO,AAAA,CAC3C,aAAa,CAAE,GAAI,CACnB,AArHH,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAyHR,KAAK,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,EA7HV,QAAQ,CAAG,UAAU,CAIhB,OAAO,CA0HR,KAAK,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,CACrB,MAAM,CAAE,MAAO,CACf,OAAO,CAAE,SAAU,CAEnB,aAAa,CAAE,GAAI,CACnB,MAAM,CAAE,GAAG,CAAC,KAAK,CChID,OAAO,CDkIvB,KAAK,CClIW,OAAO,CDoIvB,gBAAgB,CAAE,IAAK,CClGtB,kBAAkB,CDoGE,UAAU,CAAC,IAAG,CAAC,WAAW,CAAE,KAAK,CAAC,IAAG,CAAC,WAAW,CCnGrE,UAAU,CDmGU,UAAU,CAAC,IAAG,CAAC,WAAW,CAAE,KAAK,CAAC,IAAG,CAAC,WAAW,CAwBtE,AAjKH,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAyHR,KAAK,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAeN,MAAM,CA5IV,QAAQ,CAAG,UAAU,CAIhB,OAAO,CA0HR,KAAK,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAcN,MAAM,AAAA,CACN,gBAAgB,CC1ID,OAAO,CD2ItB,KAAK,CAAE,IAAK,CACZ,AA/IJ,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAyHR,KAAK,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAsBN,QAAQ,CAnJZ,QAAQ,CAAG,UAAU,CAIhB,OAAO,CA0HR,KAAK,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAqBN,QAAQ,AAAA,CACR,YAAY,CChJG,OAAO,CDiJtB,KAAK,CCjJU,OAAO,CDkJtB,gBAAgB,CAAE,IAAK,CAQvB,AA9JJ,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAyHR,KAAK,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAsBN,QAAQ,AAOP,MAAM,CA1JX,QAAQ,CAAG,UAAU,CAIhB,OAAO,CA0HR,KAAK,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAqBN,QAAQ,AAOP,MAAM,AAAA,CACN,gBAAgB,CCvJF,OAAO,CDwJrB,KAAK,CAAE,IAAK,CACZ,AA7JL,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAiKR,GAAG,AAAA,CACJ,MAAM,CAAE,GAAI,CACZ,MAAM,CAAE,GAAI,CACZ,AAxKH,QAAQ,CAAG,UAAU,CAIhB,OAAO,CAwKR,KAAK,AAAA,CACN,MAAM,CAAE,MAAO,CACf,OAAO,CAAE,SAAU,CAEnB,aAAa,CAAE,GAAI,CACnB,MAAM,CAAE,iBAAkB,CAE1B,KAAK,CAAE,IAAK,CACZ,WAAW,CAAE,aAAc,CAC3B",
"mappings": "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",
"names": []
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -7,3 +7,34 @@
/* [2] Formulaire de type 'timeline'
=========================================================*/
@import 'timeline-form';
#WRAPPER > #CONTAINER table,
#WRAPPER > #CONTAINER > section > table{
& tr,
& > tr{
& > td{
padding: .8em;
color: #888;
font-weight: normal;
text-align: center;
white-space: nowrap;
& > input[type="checkbox"]+label[for]:before{
left: -.4em;
width: calc( 1.05em - 2*.15em );
}
}
& > td.hidden:before{
content: '+';
color: #ddd;
font-weight: bold;
}
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -124,7 +124,7 @@ body{
width: 35em;
height: 10em;
background: url('/f/svg/icon/st') center center no-repeat;
background: url('/f/svg/iconv2/st') center center no-repeat;
background-size: auto 100%;
}

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/icon/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\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",
"/* [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/icon/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\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",
"/* [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

@ -1,5 +1,5 @@
@import 'constants';
@import 'constants';
/* [1] Formulaire de type timeline
=========================================================*/
#WRAPPER > #CONTAINER section[data-timeline]{
@ -39,9 +39,6 @@
// background-color: $timeline-color;
/* TODO: Transformer les background en ::before pour que ca soit juste un cercle avec bg et border*/
/* FIXME: Corriger le liseré pour les autres navigateurs que FF*/
/* Gestion du before (compteur css) //*/
&[data-n]:before{
content: attr(data-n);
@ -427,7 +424,7 @@
border: 1px solid darken(#d8e0e9, 10);
// Pas de rebord droite sauf si dernier
&:not(:last-child){
&:not(:last-child):not(.lc){
border-right: 0;
}
@ -438,8 +435,13 @@
@include transition( .2s ease-in-out );
&:first-child{ border-top-left-radius: 5px; border-bottom-left-radius: 5px; }
&:last-child{ border-top-right-radius: 5px; border-bottom-right-radius: 5px; }
// Arrondi pour premier
&:first-child,
&.fc{ border-top-left-radius: 5px; border-bottom-left-radius: 5px; }
// Arrondi pour dernier
&:last-child,
&.lc{ border-top-right-radius: 5px; border-bottom-right-radius: 5px; }
// Animation quand la page est validée
&.done{

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1001
doc/sample_wrong_format.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
function sociogramClass(a){this.container=a;this.log("sociogram created")}
sociogramClass.prototype={container:this.container,sigma:null,request:{path:"charts/network_data"},response:null,nodes:[],edges:[],rad:500,nodeDistance:100,overloadGraph:function(){},load:function(){},nodeAt:function(a,b){},arrange:function(a,b,d){},extractNodesFromResponse:function(){},extractEdgesFromResponse:function(){},renderNodes:function(){},renderEdges:function(){},overload:{nodeNeighbors:function(a){},nodeDirectNeighbors:function(a){}},bindings:{clickNode:function(a,b){},clickStage:function(a,
sociogramClass.prototype={container:this.container,sigma:null,request:{path:"chart/network_data"},response:null,nodes:[],edges:[],rad:500,nodeDistance:100,overloadGraph:function(){},load:function(){},nodeAt:function(a,b){},arrange:function(a,b,d){},extractNodesFromResponse:function(){},extractEdgesFromResponse:function(){},renderNodes:function(){},renderEdges:function(){},overload:{nodeNeighbors:function(a){},nodeDirectNeighbors:function(a){}},bindings:{clickNode:function(a,b){},clickStage:function(a,
b){}},log:function(a){console.log("--[SOCIOGRAM]--");console.warn(a);console.log("--[/SOCIOGRAM]--")}};sociogramClass.prototype.overloadGraph=function(){sigma.classes.graph.addMethod("nodeNeighbors",this.overload.nodeNeighbors);sigma.classes.graph.addMethod("nodeDirectNeighbors",this.overload.nodeDirectNeighbors);this.log("graph overloaded")};
sociogramClass.prototype.load=function(){this.sigma=new sigma({renderer:{container:this.container,type:"canvas"}});var a=this;api.send(this.request,function(b){a.log(b);0==b.ModuleError&&(a.response=b,a.sigma.settings({defaultNodeColor:"#348ed8",defaultLabelSize:14,defaultLabelBGColor:"#ddd",defaultHoverLabelBGColor:"#002147",defaultLabelHoverColor:"#fff",labelThreshold:10,defaultEdgeType:"line"}),a.extractNodesFromResponse(),a.extractEdgesFromResponse(),a.addNodes(),a.addEdges(),a.sigma.bind("clickNode",
function(b){a.bindings.clickNode(a,b)}),a.sigma.bind("clickStage",function(b){a.bindings.clickStage(a,b)}),a.sigma.graph.nodes().forEach(function(b){a.arrange(b.id,null,!0)}),a.sigma.camera.ratio=1.2,a.sigma.refresh())})};sociogramClass.prototype.nodeAt=function(a,b){var d=this.sigma.graph.nodes(),c=null,e;for(e in d){var f=Math.sqrt(Math.pow(a-d[e].x,2)+Math.pow(b-d[e].y,2));if(null==c||f<c)c=f}return c};

View File

@ -27,7 +27,7 @@ function sociogramClass(container){
sociogramClass.prototype = {
container: this.container,
sigma: null,
request: { path: 'charts/network_data' },
request: { path: 'chart/network_data' },
response: null,
nodes: [],
edges: [],

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,15 @@
/* (1) Constructeur de formulaire de contact */
var contactBuilder = new HTMLBuilder();
contactBuilder.setLayout(
"<h4 data-icon='p' class='new-contact color2'> \n"+
"<h4 data-icon='o' class='new-contact color2'> \n"+
"\t<input type='hidden' data-name='uid' value='@uid'>\n"+
"\t<input type='hidden' data-name='call' value='@call'>\n"+
"\t<input type='hidden' data-name='sms' value='@sms'>\n"+
"\t<input type='hidden' data-name='countcall' value='@countcall'>\n"+
"\t<input type='hidden' data-name='countsms' value='@countsms'>\n"+
"\t<input type='text' data-name='number' placeholder='Numéro de téléphone' value='@number' > \n"+
"\t<input type='text' data-name='username' placeholder='Pseudo' value='@username' > \n"+
"\t<span class='switch-left'></span> \n"+
@ -43,7 +51,14 @@ miniFicheBuilder.setLayout(
"\t<input type='hidden' data-name='username' value='@username'>\n"+
"\t<span data-space></span>\n"+
"\t<h4 data-icon='o' class='color2'>@firstname @lastname (@username)</h4>\n"+
"\t<h4 data-icon='a' class='color2'>@firstname @lastname @username</h4>\n"+
"\t<h5 class='nobold color0'>"+
"\t\t@countcall appels"+
"\t</h5>"+
"\t<h5 class='nobold color0'>"+
"\t\t@countsms sms"+
"\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"+
@ -52,59 +67,83 @@ miniFicheBuilder.setLayout(
"\t<h5 class='nobold color0'>\n"+
"\t\t<input type='number' min='5' max='120' data-name='age' placeholder='Age' value='@age'>\n"+
"\t\t<span class='select-container'><select data-name='age'>\n"+
"\t\t\t<option value='.' disabled selected>Age:</option>\n"+
"\t\t\t<option value='1' >5 à 10 ans</option>\n"+
"\t\t\t<option value='2' >10 à 15 ans</option>\n"+
"\t\t\t<option value='3' >15 à 20 ans</option>\n"+
"\t\t\t<option value='4' >20 à 25 ans</option>\n"+
"\t\t\t<option value='5' >25 à 30 ans</option>\n"+
"\t\t\t<option value='6' >30 à 35 ans</option>\n"+
"\t\t\t<option value='7' >35 à 40 ans</option>\n"+
"\t\t\t<option value='8' >40 à 45 ans</option>\n"+
"\t\t\t<option value='9' >45 à 50 ans</option>\n"+
"\t\t\t<option value='10'>50 à 55 ans</option>\n"+
"\t\t\t<option value='11'>55 à 60 ans</option>\n"+
"\t\t\t<option value='12'>60 à 65 ans</option>\n"+
"\t\t\t<option value='13'>65 à 70 ans</option>\n"+
"\t\t\t<option value='14'>70 à 75 ans</option>\n"+
"\t\t\t<option value='15'>75 à 80 ans</option>\n"+
"\t\t\t<option value='16'>80 à 85 ans</option>\n"+
"\t\t\t<option value='17'>85 à 90 ans</option>\n"+
"\t\t\t<option value='18'>90 à 95 ans</option>\n"+
"\t\t\t<option value='19'>95 à 100 ans</option>\n"+
"\t\t</select></span>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<span class='select-container'><select data-name='job'>\n"+
"\t\t\t<option value='.' disabled>Dernière profession exercée:</option>\n"+
"\t\t<span class='select-container'><select data-name='studies'>\n"+
"\t\t\t<option value='.' disabled selected>Niveau d'études maximal:</option>\n"+
"\t\t\t<option value='0'>Inconnue</option>\n"+
"\t\t\t<option value='1-' disabled>Agriculateur exploitants</option>\n"+
"\t\t\t\t<option value='10'>- Agriculteurs exploitants (Agriculteurs, maraîchers, viticulteurs…)</option>\n"+
"\t\t\t<option value='2-' disabled>Artisans, commerçants et chefs d'entreprises</option>\n"+
"\t\t\t\t<option value='21'>- Artisans (Maçons, électriciens, couturiers, boulangers, garagistes, coiffeurs…)</option>\n"+
"\t\t\t\t<option value='22'>- Commerçants et assimilés (Commerçants en détail ou en gros, buralistes, cafetiers, agents immobiliers…)</option>\n"+
"\t\t\t\t<option value='23'>- Chefs d'entreprise de 10 salariés ou plus</option>\n"+
"\t\t\t<option value='3-' disabled>Cadres et professions intellectuelles supérieures</option>\n"+
"\t\t\t\t<option value='31'>- Professions libérales et assimilés (Médecins, avocats, notaires, architectes libéraux…)</option>\n"+
"\t\t\t\t<option value='32'>- Cadres de la fonction publique, professions intellectuelles et artistiques (Personnels administratifs</option>\n"+
"\t\t\t\t\t<option class='pad' value='32'>de catégorie A, professeurs de lenseignement secondaire ou supérieur, médecins hospitaliers, artistes…)</option>\n"+
"\t\t\t\t<option value='36'>- Cadres d'entreprise (Cadres administratifs, cadres commerciaux, ingénieurs…)</option>\n"+
"\t\t\t<option value='4-' disabled>Professions Intermédiaires</option>\n"+
"\t\t\t\t<option value='41'>- Professions intermédiaires de l'enseignement, de la santé, de la fonction publique et assimilés </option>\n"+
"\t\t\t\t\t<option class='pad' value='41'>(Personnels administratifs de catégorie B, instituteurs, infirmiers, travailleurs sociaux…)</option>\n"+
"\t\t\t\t<option value='46'>- Professions intermédiaires administratives et commerciales des entreprises (Comptables, chargés de clientèles…)</option>\n"+
"\t\t\t\t<option value='47'>- Techniciens (Techniciens détudes, techniciens de contrôle, dessinateurs en bâtiment, géomètres…)</option>\n"+
"\t\t\t\t<option value='48'>- Contremaîtres, agents de maîtrise (Conducteurs de travaux, chefs déquipe…)</option>\n"+
"\t\t\t<option value='5-' disabled>Employés</option>\n"+
"\t\t\t\t<option value='51'>- Employés de la fonction publique (Personnels de catégorie C, agents administratifs, agents de service…)</option>\n"+
"\t\t\t\t<option value='54'>- Employés administratifs d'entreprise (Secrétaires, agents daccueil…)</option>\n"+
"\t\t\t\t<option value='55'>- Employés de commerce (Vendeurs, caissiers…)</option>\n"+
"\t\t\t\t<option value='56'>- Personnels des services directs aux particuliers (Serveurs, coiffeurs, assistantes maternelles…)</option>\n"+
"\t\t\t<option value='6-' disabled>Ouvriers</option>\n"+
"\t\t\t\t<option value='61'>- Ouvriers qualifiés de type industriel ou artisanal (Mécaniciens, chauffeurs, cuisiniers…)</option>\n"+
"\t\t\t\t<option value='66'>- Ouvriers non qualifiés de type industriel ou artisanal (Ouvrier de production, manœuvres…)</option>\n"+
"\t\t\t\t<option value='69'>- Ouvriers agricoles (Bergers, ouvriers de la viticulture, bûcherons, ouvrier forestiers…)</option>\n"+
"\t\t\t<option value='7-' disabled>Retraités</option>\n"+
"\t\t\t\t<option value='71'>- Anciens agriculteurs exploitants</option>\n"+
"\t\t\t\t<option value='72'>- Anciens artisans, commerçants, chefs d'entreprise</option>\n"+
"\t\t\t\t<option value='73'>- Anciens cadres</option>\n"+
"\t\t\t\t<option value='74'>- Anciennes professions intermédiaires</option>\n"+
"\t\t\t\t<option value='75'>- Anciens employés</option>\n"+
"\t\t\t\t<option value='76'>- Anciens ouvriers</option>\n"+
"\t\t\t<option value='8-' disabled>Sans activité professionnelle</option>\n"+
"\t\t\t\t<option value='81'>- Chômeurs n'ayant jamais travaillé</option>\n"+
"\t\t\t\t<option value='82'>- Inactifs divers (autres que retraités)</option>\n"+
"\t\t\t<option value='01'>Pas de scolarité</option>\n"+
"\t\t\t<option value='02'>Aucun diplôme mais scolarité jusqu'en école primaire ou au collège</option>\n"+
"\t\t\t<option value='03'>Aucun diplôme mais scolarité au-delà du collège</option>\n"+
"\t\t\t<option value='04'>Certificat d'études primaires (CEP)</option>\n"+
"\t\t\t<option value='05'>BEPC, brevet élémentaire, brevet des collèges</option>\n"+
"\t\t\t<option value='06'>Certificat d'aptitudes professionnelles (CAP), brevet de compagnon, y compris CAPA</option>\n"+
"\t\t\t<option value='07'>Brevet d'études professionnelles (BEP), y compris BEPA et diplômes agricoles (BAA, BPA)</option>\n"+
"\t\t\t\t<option value='07' class='pad'>Diplômes sociaux (aide-soignante, auxiliaire de puériculture, travailleuse familiale)</option>\n"+
"\t\t\t<option value='08'>Baccalauréat général, brevet supérieur</option>\n"+
"\t\t\t\t<option class='pad' value='08'>BAC ( L, ES, S ou A, B , C, D, D, E )</option>\n"+
"\t\t\t<option value='09'>Bac technologique ou professionnel, brevet professionnel ou de technicien</option>\n"+
"\t\t\t\t<option class='pad' value='09'>BAC (STI, STL, SMS, STT ou F, G, H)</option>\n"+
"\t\t\t\t<option class='pad' value='09'>BEC, BEI, BEH, capacité en droit</option>\n"+
"\t\t\t\t<option class='pad' value='09'>Brevet de technicien agricole (BTA)</option>\n"+
"\t\t\t<option value='10'>Diplôme universitaire de 1er cycle</option>\n"+
"\t\t\t\t<option class='pad' value='10'>BTS, DUT, DEUG</option>\n"+
"\t\t\t\t<option class='pad' value='10'>Diplôme des professions sociales ou de santé, d'infirmier(ère)</option>\n"+
"\t\t\t\t<option class='pad' value='10'>Diplôme universitaire propédeutique, DUEL, DUES, DEUG, PCEM</option>\n"+
"\t\t\t<option value='11'>Diplôme universitaire de 2ème ou 3ème cycle</option>\n"+
"\t\t\t\t<option class='pad' value='11'>MASTER, DOCTORAT (y compris médecine, pharmacie, dentaire),</option>\n"+
"\t\t\t\t<option class='pad' value='11'>Maîtrise, DEA, DESS,</option>\n"+
"\t\t\t\t<option class='pad' value='11'>CAPES, CAPET, agrégation</option>\n"+
"\t\t\t\t<option class='pad' value='11'>Diplôme d'ingénieur, d'une grande école, etc.</option>\n"+
"\t\t</select></span>\n"+
"\t</h5>\n"+
"\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</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 10km</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 10km à 30km</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 30km à 100km</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'>+ de 100km</label>\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</h5>\n"+
"</article>");
@ -157,12 +196,20 @@ var ficheBuilder = new HTMLBuilder();
ficheBuilder.setLayout(
"<article class='fiche-relation'>\n"+
"\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='o' class='color2'>@firstname @lastname (@username)</h4>\n"+
"\t<h4 data-icon='a' class='color2'>@firstname @lastname @username</h4>\n"+
"\t<h5 class='nobold color0'>"+
"\t\t@countcall appels"+
"\t</h5>"+
"\t<h5 class='nobold color0'>"+
"\t\t@countsms sms"+
"\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"+
@ -171,7 +218,28 @@ ficheBuilder.setLayout(
"\t<h5 class='nobold color0'>\n"+
"\t\t<input type='number' min='5' max='120' data-name='age' placeholder='Age' value='@age'>\n"+
"\t\t<span class='select-container'><select data-name='age'>\n"+
"\t\t\t<option value='.' disabled selected>Age:</option>\n"+
"\t\t\t<option value='1' >5 à 10 ans</option>\n"+
"\t\t\t<option value='2' >10 à 15 ans</option>\n"+
"\t\t\t<option value='3' >15 à 20 ans</option>\n"+
"\t\t\t<option value='4' >20 à 25 ans</option>\n"+
"\t\t\t<option value='5' >25 à 30 ans</option>\n"+
"\t\t\t<option value='6' >30 à 35 ans</option>\n"+
"\t\t\t<option value='7' >35 à 40 ans</option>\n"+
"\t\t\t<option value='8' >40 à 45 ans</option>\n"+
"\t\t\t<option value='9' >45 à 50 ans</option>\n"+
"\t\t\t<option value='10'>50 à 55 ans</option>\n"+
"\t\t\t<option value='11'>55 à 60 ans</option>\n"+
"\t\t\t<option value='12'>60 à 65 ans</option>\n"+
"\t\t\t<option value='13'>65 à 70 ans</option>\n"+
"\t\t\t<option value='14'>70 à 75 ans</option>\n"+
"\t\t\t<option value='15'>75 à 80 ans</option>\n"+
"\t\t\t<option value='16'>80 à 85 ans</option>\n"+
"\t\t\t<option value='17'>85 à 90 ans</option>\n"+
"\t\t\t<option value='18'>90 à 95 ans</option>\n"+
"\t\t\t<option value='19'>95 à 100 ans</option>\n"+
"\t\t</select></span>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
@ -179,41 +247,41 @@ ficheBuilder.setLayout(
"\t\t\t<option value='.' disabled selected>Dernière profession exercée:</option>\n"+
"\t\t\t<option value='0'>Inconnue</option>\n"+
"\t\t\t<option value='1-' disabled>Agriculateur exploitants</option>\n"+
"\t\t\t\t<option value='10'>- Agriculteurs exploitants (Agriculteurs, maraîchers, viticulteurs…)</option>\n"+
"\t\t\t\t<option value='10'>Agriculteurs exploitants (Agriculteurs, maraîchers, viticulteurs…)</option>\n"+
"\t\t\t<option value='2-' disabled>Artisans, commerçants et chefs d'entreprises</option>\n"+
"\t\t\t\t<option value='21'>- Artisans (Maçons, électriciens, couturiers, boulangers, garagistes, coiffeurs…)</option>\n"+
"\t\t\t\t<option value='22'>- Commerçants et assimilés (Commerçants en détail ou en gros, buralistes, cafetiers, agents immobiliers…)</option>\n"+
"\t\t\t\t<option value='23'>- Chefs d'entreprise de 10 salariés ou plus</option>\n"+
"\t\t\t\t<option value='21'>Artisans (Maçons, électriciens, couturiers, boulangers, garagistes, coiffeurs…)</option>\n"+
"\t\t\t\t<option value='22'>Commerçants et assimilés (Commerçants en détail ou en gros, buralistes, cafetiers, agents immobiliers…)</option>\n"+
"\t\t\t\t<option value='23'>Chefs d'entreprise de 10 salariés ou plus</option>\n"+
"\t\t\t<option value='3-' disabled>Cadres et professions intellectuelles supérieures</option>\n"+
"\t\t\t\t<option value='31'>- Professions libérales et assimilés (Médecins, avocats, notaires, architectes libéraux…)</option>\n"+
"\t\t\t\t<option value='32'>- Cadres de la fonction publique, professions intellectuelles et artistiques (Personnels administratifs</option>\n"+
"\t\t\t\t<option value='31'>Professions libérales et assimilés (Médecins, avocats, notaires, architectes libéraux…)</option>\n"+
"\t\t\t\t<option value='32'>Cadres de la fonction publique, professions intellectuelles et artistiques (Personnels administratifs</option>\n"+
"\t\t\t\t\t<option class='pad' value='32'>de catégorie A, professeurs de lenseignement secondaire ou supérieur, médecins hospitaliers, artistes…)</option>\n"+
"\t\t\t\t<option value='36'>- Cadres d'entreprise (Cadres administratifs, cadres commerciaux, ingénieurs…)</option>\n"+
"\t\t\t\t<option value='36'>Cadres d'entreprise (Cadres administratifs, cadres commerciaux, ingénieurs…)</option>\n"+
"\t\t\t<option value='4-' disabled>Professions Intermédiaires</option>\n"+
"\t\t\t\t<option value='41'>- Professions intermédiaires de l'enseignement, de la santé, de la fonction publique et assimilés </option>\n"+
"\t\t\t\t<option value='41'>Professions intermédiaires de l'enseignement, de la santé, de la fonction publique et assimilés </option>\n"+
"\t\t\t\t\t<option class='pad' value='41'>(Personnels administratifs de catégorie B, instituteurs, infirmiers, travailleurs sociaux…)</option>\n"+
"\t\t\t\t<option value='46'>- Professions intermédiaires administratives et commerciales des entreprises (Comptables, chargés de clientèles…)</option>\n"+
"\t\t\t\t<option value='47'>- Techniciens (Techniciens détudes, techniciens de contrôle, dessinateurs en bâtiment, géomètres…)</option>\n"+
"\t\t\t\t<option value='48'>- Contremaîtres, agents de maîtrise (Conducteurs de travaux, chefs déquipe…)</option>\n"+
"\t\t\t\t<option value='46'>Professions intermédiaires administratives et commerciales des entreprises (Comptables, chargés de clientèles…)</option>\n"+
"\t\t\t\t<option value='47'>Techniciens (Techniciens détudes, techniciens de contrôle, dessinateurs en bâtiment, géomètres…)</option>\n"+
"\t\t\t\t<option value='48'>Contremaîtres, agents de maîtrise (Conducteurs de travaux, chefs déquipe…)</option>\n"+
"\t\t\t<option value='5-' disabled>Employés</option>\n"+
"\t\t\t\t<option value='51'>- Employés de la fonction publique (Personnels de catégorie C, agents administratifs, agents de service…)</option>\n"+
"\t\t\t\t<option value='54'>- Employés administratifs d'entreprise (Secrétaires, agents daccueil…)</option>\n"+
"\t\t\t\t<option value='55'>- Employés de commerce (Vendeurs, caissiers…)</option>\n"+
"\t\t\t\t<option value='56'>- Personnels des services directs aux particuliers (Serveurs, coiffeurs, assistantes maternelles…)</option>\n"+
"\t\t\t\t<option value='51'>Employés de la fonction publique (Personnels de catégorie C, agents administratifs, agents de service…)</option>\n"+
"\t\t\t\t<option value='54'>Employés administratifs d'entreprise (Secrétaires, agents daccueil…)</option>\n"+
"\t\t\t\t<option value='55'>Employés de commerce (Vendeurs, caissiers…)</option>\n"+
"\t\t\t\t<option value='56'>Personnels des services directs aux particuliers (Serveurs, coiffeurs, assistantes maternelles…)</option>\n"+
"\t\t\t<option value='6-' disabled>Ouvriers</option>\n"+
"\t\t\t\t<option value='61'>- Ouvriers qualifiés de type industriel ou artisanal (Mécaniciens, chauffeurs, cuisiniers…)</option>\n"+
"\t\t\t\t<option value='66'>- Ouvriers non qualifiés de type industriel ou artisanal (Ouvrier de production, manœuvres…)</option>\n"+
"\t\t\t\t<option value='69'>- Ouvriers agricoles (Bergers, ouvriers de la viticulture, bûcherons, ouvrier forestiers…)</option>\n"+
"\t\t\t\t<option value='61'>Ouvriers qualifiés de type industriel ou artisanal (Mécaniciens, chauffeurs, cuisiniers…)</option>\n"+
"\t\t\t\t<option value='66'>Ouvriers non qualifiés de type industriel ou artisanal (Ouvrier de production, manœuvres…)</option>\n"+
"\t\t\t\t<option value='69'>Ouvriers agricoles (Bergers, ouvriers de la viticulture, bûcherons, ouvrier forestiers…)</option>\n"+
"\t\t\t<option value='7-' disabled>Retraités</option>\n"+
"\t\t\t\t<option value='71'>- Anciens agriculteurs exploitants</option>\n"+
"\t\t\t\t<option value='72'>- Anciens artisans, commerçants, chefs d'entreprise</option>\n"+
"\t\t\t\t<option value='73'>- Anciens cadres</option>\n"+
"\t\t\t\t<option value='74'>- Anciennes professions intermédiaires</option>\n"+
"\t\t\t\t<option value='75'>- Anciens employés</option>\n"+
"\t\t\t\t<option value='76'>- Anciens ouvriers</option>\n"+
"\t\t\t\t<option value='71'>Anciens agriculteurs exploitants</option>\n"+
"\t\t\t\t<option value='72'>Anciens artisans, commerçants, chefs d'entreprise</option>\n"+
"\t\t\t\t<option value='73'>Anciens cadres</option>\n"+
"\t\t\t\t<option value='74'>Anciennes professions intermédiaires</option>\n"+
"\t\t\t\t<option value='75'>Anciens employés</option>\n"+
"\t\t\t\t<option value='76'>Anciens ouvriers</option>\n"+
"\t\t\t<option value='8-' disabled>Sans activité professionnelle</option>\n"+
"\t\t\t\t<option value='81'>- Chômeurs n'ayant jamais travaillé</option>\n"+
"\t\t\t\t<option value='82'>- Inactifs divers (autres que retraités)</option>\n"+
"\t\t\t\t<option value='81'>Chômeurs n'ayant jamais travaillé</option>\n"+
"\t\t\t\t<option value='82'>Inactifs divers (autres que retraités)</option>\n"+
"\t\t</select></span>\n"+
"\t</h5>\n"+
@ -229,26 +297,26 @@ ficheBuilder.setLayout(
"\t\t<span class='select-container'><select data-name='studies'>\n"+
"\t\t\t<option value='.' disabled selected>Niveau d'études maximal:</option>\n"+
"\t\t\t<option value='0'>Inconnue</option>\n"+
"\t\t\t<option value='01'>- Pas de scolarité</option>\n"+
"\t\t\t<option value='02'>- Aucun diplôme mais scolarité jusqu'en école primaire ou au collège</option>\n"+
"\t\t\t<option value='03'>- Aucun diplôme mais scolarité au-delà du collège</option>\n"+
"\t\t\t<option value='04'>- Certificat d'études primaires (CEP)</option>\n"+
"\t\t\t<option value='05'>- BEPC, brevet élémentaire, brevet des collèges</option>\n"+
"\t\t\t<option value='06'>- Certificat d'aptitudes professionnelles (CAP), brevet de compagnon, y compris CAPA</option>\n"+
"\t\t\t<option value='07'>- Brevet d'études professionnelles (BEP), y compris BEPA et diplômes agricoles (BAA, BPA)</option>\n"+
"\t\t\t<option value='01'>Pas de scolarité</option>\n"+
"\t\t\t<option value='02'>Aucun diplôme mais scolarité jusqu'en école primaire ou au collège</option>\n"+
"\t\t\t<option value='03'>Aucun diplôme mais scolarité au-delà du collège</option>\n"+
"\t\t\t<option value='04'>Certificat d'études primaires (CEP)</option>\n"+
"\t\t\t<option value='05'>BEPC, brevet élémentaire, brevet des collèges</option>\n"+
"\t\t\t<option value='06'>Certificat d'aptitudes professionnelles (CAP), brevet de compagnon, y compris CAPA</option>\n"+
"\t\t\t<option value='07'>Brevet d'études professionnelles (BEP), y compris BEPA et diplômes agricoles (BAA, BPA)</option>\n"+
"\t\t\t\t<option value='07' class='pad'>Diplômes sociaux (aide-soignante, auxiliaire de puériculture, travailleuse familiale)</option>\n"+
"\t\t\t<option value='08'>- Baccalauréat général, brevet supérieur</option>\n"+
"\t\t\t<option value='08'>Baccalauréat général, brevet supérieur</option>\n"+
"\t\t\t\t<option class='pad' value='08'>BAC ( L, ES, S ou A, B , C, D, D, E )</option>\n"+
"\t\t\t<option value='09'>- Bac technologique ou professionnel, brevet professionnel ou de technicien</option>\n"+
"\t\t\t<option value='09'>Bac technologique ou professionnel, brevet professionnel ou de technicien</option>\n"+
"\t\t\t\t<option class='pad' value='09'>BAC (STI, STL, SMS, STT ou F, G, H)</option>\n"+
"\t\t\t\t<option class='pad' value='09'>BEC, BEI, BEH, capacité en droit</option>\n"+
"\t\t\t\t<option class='pad' value='09'>Brevet de technicien agricole (BTA)</option>\n"+
"\t\t\t<option value='10'>- Diplôme universitaire de 1er cycle</option>\n"+
"\t\t\t<option value='10'>Diplôme universitaire de 1er cycle</option>\n"+
"\t\t\t\t<option class='pad' value='10'>BTS, DUT, DEUG</option>\n"+
"\t\t\t\t<option class='pad' value='10'>Diplôme des professions sociales ou de santé, d'infirmier(ère)</option>\n"+
"\t\t\t\t<option class='pad' value='10'>Diplôme universitaire propédeutique, DUEL, DUES, DEUG, PCEM</option>\n"+
"\t\t\t<option value='11'>- Diplôme universitaire de 2ème ou 3ème cycle</option>\n"+
"\t\t\t<option value='11'>Diplôme universitaire de 2ème ou 3ème cycle</option>\n"+
"\t\t\t\t<option class='pad' value='11'>MASTER, DOCTORAT (y compris médecine, pharmacie, dentaire),</option>\n"+
"\t\t\t\t<option class='pad' value='11'>Maîtrise, DEA, DESS,</option>\n"+
"\t\t\t\t<option class='pad' value='11'>CAPES, CAPET, agrégation</option>\n"+
@ -277,10 +345,11 @@ ficheBuilder.setLayout(
"\t<h5 class='nobold color0'>\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\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</h5>\n"+
"\t<h5 class='nobold color0'>\n"+

View File

@ -1,5 +1,8 @@
function inputPhoneContact(a){this.container=a}inputPhoneContact.prototype={container:this.container,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 d=a[c].parentNode.children.indexOf(a[c]),b=(new FormDeflater(a[c],["input"],["data-name"])).deflate(),e=0<b.number.value.length;if(e=e&&0<b.username.value.length+b.firstname.value.length+b.lastname.value.length)b={uid:d,number:b.number.value,username:b.username.value,firstname:b.firstname.value,lastname:b.lastname.value},b.hash=
crc32(JSON.stringify(b)),lsi.set("contacts","form"+d,b)}};
inputPhoneContact.prototype.add=function(a){console.log("CONTACTS: ADD");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:"";this.container.innerHTML+=contactBuilder.build(a);a=$$("article.contact-panel .new-contact");for(var c=this,d=0;d<a.length;d++)a[d].removeEventListener("click",function(a){c.handler(a.target)},!1),a[d].addEventListener("click",function(a){c.handler(a.target)},!1)};
inputPhoneContact.prototype.storageToFields=function(){console.log("CONTACTS: STORAGE TO FIELDS");var a=lsi["export"]("contacts");this.container.innerHTML="";for(var c in a)this.add(a[c]);this.add({number:"",firstname:"",lastname:"",username:""})};inputPhoneContact.prototype.attach=function(a){console.log("CONTACTS: ATTACH");lsi.createDataset("contacts");this.handler=a;this.storageToFields()};
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)}};
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)};

View File

@ -1,14 +1,17 @@
/* [0] Constructeur -> définit le conteneur et le bouton d'ajout
=========================================================*/
function inputPhoneContact(container){
this.container = container;
function inputPhoneContact(container, navContainer){
this.container = container;
this.nav_container = navContainer;
}
/* [1] Attributs
=========================================================*/
inputPhoneContact.prototype = {
container: this.container, // Conteneur des formulaires de contact
handler: null // Fonction pour l'enregistrement et la synchronisation des données
container: this.container, // Conteneur des formulaires de contact
nav_container: this.nav_container, // Conteneur de la navigation entre les formulaires
selected: 0, // UID du permier des contacts sélectionnés (10 par 10)
handler: null // Fonction pour l'enregistrement et la synchronisation des données
};
@ -18,16 +21,13 @@ inputPhoneContact.prototype.fieldsToStorage = function(){
console.log('CONTACTS: FIELDS TO STORAGE');
// {1} Pour chaque formulaire de contact présent //
var existingContacts = $$('article.contact-panel .new-contact');
for( var i = 0 ; i < existingContacts.length ; i++ ){
var visibleContacts = $$('article.contact-panel .new-contact');
for( var i = 0 ; i < visibleContacts.length ; i++ ){
// {2} On récupère les informations relatives à l'élément courant //
var indexInParent = existingContacts[i].parentNode.children.indexOf(existingContacts[i]);
// {2} On initialise notre deflater pour récupérer les valeurs //
var deflater = new FormDeflater(visibleContacts[i], ['input'], ['data-name']);
// {3} On initialise notre deflater pour récupérer les valeurs //
var deflater = new FormDeflater(existingContacts[i], ['input'], ['data-name']);
// {4} On enregistre ce contact si le numéro n'est pas vide et soit pseudo/prénom/nom //
// {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
@ -38,25 +38,29 @@ inputPhoneContact.prototype.fieldsToStorage = function(){
// Si le formulaire n'est pas valide, on ne l'enregistre pas
if( !validForm ) continue;
// {5} On récupère et met en forme les valeurs du deflater //
// {4} On récupère et met en forme les valeurs du deflater //
var obj = {
uid: indexInParent,
uid: parseInt(deflated.uid.value),
number: deflated.number.value,
username: deflated.username.value,
firstname: deflated.firstname.value,
lastname: deflated.lastname.value
lastname: deflated.lastname.value,
call: parseInt(deflated.call.value),
sms: parseInt(deflated.sms.value),
countcall: parseInt(deflated.countcall.value),
countsms: parseInt(deflated.countsms.value)
};
/* (6) On calcule et ajoute le hash des données */
/* (5) On calcule et ajoute le hash des données */
obj.hash = crc32( JSON.stringify(obj) );
// {7} On enregistre les données dans le 'localStorage' //
lsi.set('contacts', 'form'+indexInParent, obj);
// {6} On enregistre les données dans le 'localStorage' //
lsi.set('contacts', parseInt(deflated.uid.value), obj);
}
// {7} On met à jour le rendu des contacts//
// this.storageToFields();
};
@ -77,11 +81,19 @@ inputPhoneContact.prototype.fieldsToStorage = function(){
inputPhoneContact.prototype.add = function(objectData){
console.log('CONTACTS: ADD');
// Si pas d'uid, on quitte
if( objectData == null || objectData.uid == null || isNaN(objectData.uid) )
return false
// {0} On formatte l'object //
objectData.number = (objectData.number != null) ? objectData.number : '';
objectData.username = (objectData.username != null) ? objectData.username : '';
objectData.firstname = (objectData.firstname != null) ? objectData.firstname : '';
objectData.lastname = (objectData.lastname != null) ? objectData.lastname : '';
objectData.call = (objectData.call != null) ? objectData.call : -1;
objectData.sms = (objectData.sms != null) ? objectData.sms : -1;
objectData.countcall = (objectData.countcall != null) ? objectData.countcall : 0;
objectData.countsms = (objectData.countsms != null) ? objectData.countsms : 0;
// {1} On ajoute le HTML //
@ -93,8 +105,8 @@ inputPhoneContact.prototype.add = function(objectData){
// On met à jour les listener (remove, puis add)
var ptr = this;
for( var i = 0 ; i < contactForms.length ; i++ ){
contactForms[i].removeEventListener('click', function(e){ ptr.handler(e.target); }, false);
contactForms[i].addEventListener('click', function(e){ ptr.handler(e.target); }, false);
contactForms[i].removeEventListener('click', function(e){ ptr.nav(e.target); ptr.handler(e.target); }, false);
contactForms[i].addEventListener('click', function(e){ ptr.nav(e.target); ptr.handler(e.target); }, false);
}
};
@ -114,23 +126,88 @@ inputPhoneContact.prototype.storageToFields = function(){
console.log('CONTACTS: STORAGE TO FIELDS');
// {1} Pour chaque contact du 'localStorage' //
var contactsData = lsi.export('contacts');
var contactKeys = lsi.keys('contacts');
// On réinitialise le HTML
this.container.innerHTML = '';
// {2} On ajoute chaque contact à la liste //
for( var key in contactsData )
this.add(contactsData[key]);
// {2} On ajoute chaque contact (parmi les séléctionnés) à la liste //
var min = this.selected; // On affiche du contact sélectionné
var max = this.selected+10; // On s'arrête à 10 contacs
for( var i = min ; i < max && i < contactKeys.length ; i++ )
this.add( lsi.get('contacts', contactKeys[i]) );
// On ajoute un champ de plus à remplir
this.add({number:'', firstname:'', lastname:'', username:''});
// On ajoute un champ de plus à remplir si c'est la dernière page
if( max >= contactKeys.length )
this.add({uid: contactKeys.length});
/* (3) On met à jour la barre de navigation */
this.updateNavBar();
};
/* [6] Gestion de la navigation entre les formulaires (10 par 10)
=========================================================*/
inputPhoneContact.prototype.nav = function(element){
/* (1) On vérifie que l'élément contient un nombre et existe */
if( element == null )
return false;
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'nav-contact' )
return false;
/* (2) On désactive tous les éléments actifs */
var activeElements = $$('#nav-contact > span.active');
for( var i = 0 ; i < activeElements.length ; i++ )
activeElements[i].remClass('active');
/* (3) On active l'élément courant */
element.addClass('active');
this.selected = parseInt(element.getData('n'));
};
/* [7] Mise à jour de la navigation
=========================================================*/
inputPhoneContact.prototype.updateNavBar = function(){
var contactKeys = lsi.keys('contacts');
var len = contactKeys.length;
/* (1) On vérifie si la barre de navigation est à jour */
var navBarUpToDate = this.nav_container.children.length == len;
/* (2) On vide et remplit la barre de nav, si elle n'est pas à jour */
if( !navBarUpToDate ){
this.nav_container.innerHTML = '';
for( var i = 0 ; i < len ; i+=10 )
this.nav_container.innerHTML += '<span data-n="'+i+'">'+ (1+i/10) +'</span>';
}
/* (4) On séléctionne par défaut la dernière MINI fiche sélectionnée */
this.nav( $('#nav-contact [data-n="'+( this.selected )+'"]') );
};
/* [5] Point d'amorçage de la gestion des contacts
=========================================================*/
inputPhoneContact.prototype.attach = function(handler){
@ -139,9 +216,20 @@ inputPhoneContact.prototype.attach = function(handler){
/* (1) On initialise le jeu de données */
lsi.createDataset('contacts');
/* (2) On enregistre le handler */
/* (2) On charge les contacts depuis la mémoire ('localStorage') */
this.storageToFields();
/* (3) On enregistre le handler */
this.handler = handler;
/* (3) On charge les contacts depuis la mémoire ('localStorage') */
this.storageToFields();
/* (4) On attache l'évènement sur le conteneur de navigation */
var ptr = this;
this.nav_container.addEventListener('click', function(e){
// 1. On gère la navigation
ptr.nav(e.target);
// 2. On gere le chargement dynamique
ptr.handler(e.target);
}, false);
};

View File

@ -1,22 +1,23 @@
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:{firstname:"",lastname:"",username:"",sexe:[{status:!0},{status:!1}],age:"",job:".",famsit:[{status:!0},{status:!1},{status:!1}],studies:".",reltype:[{status:!0},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1}],reltypeSpecial:"",city:"",loc:[{status:!0},{status:!1},{status:!1},{status:!1}],duration:["",""],context:[{status:!0},{status:!1},
{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1},{status:!1}],contextSpecial:["","",""],freq:[[{status:!0},{status:!1},{status:!1},{status:!1}],[{status:!0},{status:!1},{status:!1},{status:!1}],[{status:!0},{status:!1},{status:!1},{status:!1}],[{status:!0},{status:!1},{status:!1},{status:!1}],[{status:!0},{status:!1},{status:!1},{status:!1}]],connect:[[{status:!1},{status:!0}],[{status:!1},{status:!0}],[{status:!1},
{status:!0}],[{status:!1},{status:!0}],[{status:!1},{status:!0}],[{status:!1},{status:!0}]],connectSpecial:["",""]}};
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();console.log(c);var d=lsi.get("fiches","form"+c.uid.value);!1===d&&(d.username="inconnu",d.firstname="inconnu",d.lastname="inconnu");c={uid:c.uid.value,firstname:d.firstname,lastname:d.lastname,username:d.username,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]};c.valid=this.check(c);lsi.set("fiches",
"form"+c.uid,c)}};
inputPhoneFiche.prototype.add=function(a){console.log("FICHE: ADD");if(null==a.uid)return!1;a.firstname=null!=a.firstname?a.firstname:this.defaultData.firstname;a.lastname=null!=a.lastname?a.lastname:this.defaultData.lastname;a.username=null!=a.username?a.username:this.defaultData.username;a.age=null!=a.age?a.age:this.defaultData.age;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.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;this.container.innerHTML+=ficheBuilder.build({firstname:a.firstname,lastname:a.lastname,username:a.username,uid:a.uid,age:a.age,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]});var 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");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 d=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="freq'+c+'"]'),b=0;b<d.length&&b<a.freq[c].length;b++)a.freq[c][b].status?d[b].setAttribute("checked","checked"):d[b].removeAttribute("checked");for(c=0;c<a.connect.length;c++)for(d=$$('article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="connect'+c+'"]'),b=0;b<d.length&&b<a.connect[c].length;b++)a.connect[c][b].status?
d[b].setAttribute("checked","checked"):d[b].removeAttribute("checked")};inputPhoneFiche.prototype.storageToFields=function(){console.log("FICHE: STORAGE TO FIELDS");var a=lsi["export"]("fiches");this.container.innerHTML="";var b=[],c;for(c in a){var d=a[c].uid;d==this.selected&&this.add(a[c]);b.push(d)}this.updateNavBar(b)};
inputPhoneFiche.prototype.sync=function(){console.log("FICHE: SYNC");for(var a=lsi.keys("contacts"),b=0;b<a.length&&10>b;b++){var c=lsi.get("contacts",a[b]),d=lsi.get("fiches",a[b]);null==d&&(d=this.defaultData);d.uid=c.uid;d.firstname=c.firstname;d.lastname=c.lastname;d.username=c.username;lsi.set("fiches",a[b],d)}};
inputPhoneFiche.prototype.nav=function(a){if("undefined"==typeof a||isNaN(a.innerHTML))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.innerHTML)-1};
inputPhoneFiche.prototype.updateNavBar=function(a){this.nav_container.innerHTML="";for(var b=0;b<a.length;b++){var c=parseInt(a[b])+1;this.nav_container.innerHTML+="<span>"+c+"</span>"}a=lsi["export"]("fiches");for(var d in a)!0===a[d].valid?this.nav_container.children[a[d].uid].addClass("done"):this.nav_container.children[a[d].uid].remClass("done");this.nav(this.nav_container.children[this.selected])};
inputPhoneFiche.prototype.check=function(a){if(isNaN(parseInt(a.age))||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||!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()},!1)};
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="'+
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()};
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)))};
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)};

View File

@ -13,38 +13,37 @@ 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
firstname: '',
lastname: '',
username: '',
sexe: [ {status:true}, {status:false}],
age: '',
sexe: [ defTrue, defFalse],
age: '.',
job: '.',
famsit: [ {status:true}, {status:false}, {status:false} ], // Choix 1 à 3
famsit: [ defTrue, defFalse, defFalse ], // Choix 1 à 3
studies: '.',
reltype: [ {status:true}, {status:false}, {status:false}, {status:false}, {status:false},
{status:false}, {status:false}, {status:false}, {status:false}], // Choix 1 à 9
reltype: [ defTrue, defFalse, defFalse, defFalse, defFalse,
defFalse, defFalse, defFalse, defFalse], // Choix 1 à 9
reltypeSpecial: '',
city: '',
loc: [ {status:true}, {status:false}, {status:false}, {status:false} ],
loc: [ defTrue, defFalse, defFalse, defFalse ],
duration: ['', ''],
context: [ {status:true}, {status:false}, {status:false}, {status:false}, {status:false},
{status:false}, {status:false}, {status:false}, {status:false}, {status:false},
{status:false}, {status:false}, {status:false}, {status:false}], // Choix 1 à 14
context: [ defTrue, defFalse, defFalse, defFalse, defFalse,
defFalse, defFalse, defFalse, defFalse, defFalse,
defFalse, defFalse, defFalse, defFalse], // Choix 1 à 14
contextSpecial: ['', '', ''],
freq: [
[ {status:true}, {status:false}, {status:false}, {status:false} ],
[ {status:true}, {status:false}, {status:false}, {status:false} ],
[ {status:true}, {status:false}, {status:false}, {status:false} ],
[ {status:true}, {status:false}, {status:false}, {status:false} ],
[ {status:true}, {status:false}, {status:false}, {status:false} ]],
[ defTrue, defFalse, defFalse, defFalse ],
[ defTrue, defFalse, defFalse, defFalse ],
[ defTrue, defFalse, defFalse, defFalse ],
[ defTrue, defFalse, defFalse, defFalse ],
[ defTrue, defFalse, defFalse, defFalse ]],
connect: [
[ {status:false}, {status:true} ],
[ {status:false}, {status:true} ],
[ {status:false}, {status:true} ],
[ {status:false}, {status:true} ],
[ {status:false}, {status:true} ],
[ {status:false}, {status:true} ]],
connectSpecial: ['', '']
[ defFalse, defTrue ],
[ defFalse, defTrue ],
[ defFalse, defTrue ],
[ defFalse, defTrue ],
[ defFalse, defTrue ],
[ defFalse, defTrue ]],
connectSpecial: ['', ''],
timestamp: 0,
valid: false
}
};
@ -63,37 +62,39 @@ inputPhoneFiche.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();
// On crée le hash
var deflatedHash = crc32(JSON.stringify(deflated));
console.log(deflated);
// console.log( deflated );
// {4} On récupère les données du LSI si elles existent //
var existingData = lsi.get('fiches', 'form'+deflated.uid.value);
var existingData = lsi.get('fiches', deflated.uid.value);
// Si n'existe pas, on initialise
if( existingData === false ){
existingData.username = 'inconnu';
existingData.firstname = 'inconnu';
existingData.lastname = 'inconnu';
}
// Si n'existe pas, on passe au suivant
if( existingData === false )
continue;
// {5} On récupère et met en forme les valeurs du deflater //
// Si le hash est le même, on ne fait rien
if( existingData.hash != null && existingData.hash == deflatedHash )
return;
var obj = {
uid: deflated.uid.value,
firstname: existingData.firstname,
lastname: existingData.lastname,
username: existingData.username,
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
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
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
@ -122,15 +123,22 @@ inputPhoneFiche.prototype.fieldsToStorage = function(){
connectSpecial: [
deflated.connectSpecial[0].value,
deflated.connectSpecial[1].value
]
],
hash: deflatedHash
};
/* (6) On vérifie la validité des données et on l'enregistre dans l'objet */
/* (6) On vérifie la validité des données et on l'enregistre dans l'objet avec la date de modification */
obj.valid = this.check(obj);
// {6} On enregistre les données dans le 'localStorage' //
lsi.set('fiches', 'form'+obj.uid, obj);
// On met à jour la date de modification, si on a pas qu'@uid de différent
if( diff(existingData, obj).length > 0 ){
console.warn('> FICHE UPDATE');
obj.timestamp = Date.now();
}
/* (7) On enregistre les données dans le 'localStorage' */
lsi.set('fiches', obj.uid, obj);
}
};
@ -152,16 +160,12 @@ inputPhoneFiche.prototype.fieldsToStorage = function(){
inputPhoneFiche.prototype.add = function(objectData){
console.log('FICHE: ADD');
// Si pas d'UID, on retourne une erreur
if( objectData.uid == null )
// Si pas d'UID ou d'UID de contact, on retourne une erreur
if( objectData.uid == null || objectData.contact == null )
return false;
/* (0) Gestion du formattage des valeur */
// {1} Champs de texte //
objectData.firstname = (objectData.firstname != null) ? objectData.firstname : this.defaultData.firstname;
objectData.lastname = (objectData.lastname != null) ? objectData.lastname : this.defaultData.lastname;
objectData.username = (objectData.username != null) ? objectData.username : this.defaultData.username;
objectData.age = (objectData.age != null) ? objectData.age : this.defaultData.age;
objectData.city = (objectData.city != null) ? objectData.city : this.defaultData.city;
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];
@ -175,6 +179,7 @@ inputPhoneFiche.prototype.add = function(objectData){
// {2} Champs <select> //
objectData.job = (objectData.job != null) ? objectData.job : this.defaultData.job;
objectData.studies = (objectData.studies != null) ? objectData.studies : this.defaultData.studies;
objectData.age = (objectData.age != null) ? objectData.age : this.defaultData.age;
// {3} Champs <radio> //
objectData.sexe = (objectData.sexe != null) ? objectData.sexe : this.defaultData.sexe;
@ -186,13 +191,23 @@ inputPhoneFiche.prototype.add = function(objectData){
objectData.connect = (objectData.connect != null) ? objectData.connect : this.defaultData.connect;
// {1} Création physique //
// {4} On récupère username/firstname/lastname du contact associé //
var associatedContact = lsi.get('contacts', objectData.contact);
// Si on ne trouve pas le contact, on ne fais rien
if( associatedContact === false )
return false;
// {5} Création physique //
this.container.innerHTML += ficheBuilder.build({
firstname: objectData.firstname,
lastname: objectData.lastname,
username: objectData.username,
firstname: associatedContact.firstname,
lastname: associatedContact.lastname,
username: (associatedContact.username.length==0) ? '' : '('+associatedContact.username+')',
countcall: associatedContact.countcall,
countsms: associatedContact.countsms,
uid: objectData.uid,
age: objectData.age,
contact: objectData.contact, // uid du contact associé
city: objectData.city,
duration0: objectData.duration[0],
duration1: objectData.duration[1],
@ -205,53 +220,59 @@ inputPhoneFiche.prototype.add = function(objectData){
});
/* (2) On sélectionne la valeur dans le select (manuellement) de la PROFESSION */
/* {6} On sélectionne la valeur dans le select (manuellement) de la PROFESSION */
var selectedOption = $('article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="job"]>option[value="'+objectData.job+'"]');
if( selectedOption != null )
selectedOption.setAttribute('selected', 'selected');
/* (3) On sélectionne la valeur dans le select (manuellement) des ETUDES */
/* {7} On sélectionne la valeur dans le select (manuellement) des ETUDES */
selectedOption = $('article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+objectData.studies+'"]');
if( selectedOption != null )
selectedOption.setAttribute('selected', 'selected');
/* (4) On sélectionna la valeur des boutons <radio> pour le SEXE */
/* {8} On sélectionne la valeur dans le select (manuellement) de l'AGE */
selectedOption = $('article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+objectData.age+'"]');
if( selectedOption != null )
selectedOption.setAttribute('selected', 'selected');
/* {9} On sélectionna la valeur des boutons <radio> pour le SEXE */
var sexeCreated = $$('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');
else sexeCreated[i].removeAttribute('checked');
/* (5) On sélectionna la valeur des boutons <radio> pour la SITUATION FAMILIALE */
/* {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');
else famsitCreated[i].removeAttribute('checked');
/* (6) On sélectionna la valeur des boutons <radio> pour le TYPE DE RELATION */
/* {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');
else reltypeCreated[i].removeAttribute('checked');
/* (7) On sélectionna la valeur des boutons <radio> pour la LOCATION */
/* {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');
else locCreated[i].removeAttribute('checked');
/* (8) On sélectionna la valeur des boutons <radio> pour le CONTEXTE DE RENCONTRE */
/* {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');
else contextCreated[i].removeAttribute('checked');
else contextCreated[i].removeAttribute('checked');
/* (9) On sélectionna la valeur des boutons <radio> pour les FREQUENCES */
/* {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++ )
@ -259,7 +280,7 @@ inputPhoneFiche.prototype.add = function(objectData){
else freqCreated[i].removeAttribute('checked');
}
/* (10) On sélectionna la valeur des boutons <radio> pour les CONNECTIONS */
/* {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++ )
@ -291,21 +312,13 @@ inputPhoneFiche.prototype.storageToFields = function(){
// On réinitialise le HTML
this.container.innerHTML = '';
// On récupère les UIDS
var UIDs = [];
//
for( var key in ficheData ){
var uid = ficheData[key].uid;
if( uid == this.selected )
for( var key in ficheData )
if( ficheData[key].uid == this.selected )
this.add(ficheData[key]);
UIDs.push(uid);
}
// {4} On met à jour la navigation //
this.updateNavBar(UIDs);
this.updateNavBar();
};
@ -324,33 +337,167 @@ inputPhoneFiche.prototype.storageToFields = function(){
inputPhoneFiche.prototype.sync = function(){
console.log('FICHE: SYNC');
/* (1) On récupère les clés de tous les CONTACTS */
var contactUIDs = lsi.keys('contacts');
/* (1) Mise à jour en fonction des contacts APRÈS IMPORT
---------------------------------------------------------*/
/* (1) On récupère tous les CONTACTS */
var contacts = lsi.export('contacts');
var addedFicheUids = []; // Contiendra les uids des fiches qui seront crées
/* (2) Pour chaque CONTACT, on met à jour/crée la MINI fiche associée */
for( var i = 0 ; i < contactUIDs.length && i < 10; i++ ){
/* (2) Pour chaque CONTACT, on met à jour/crée la FICHE associée, si dans le TOP 10 des APPELS ou des SMS */
for( var uid in contacts ){
/* (3) On récupère les informations du CONTACT */
var contactData = lsi.get('contacts', contactUIDs[i]);
var inCallTop10 = false;
/* (4) On récupère les informations de la MINI (si elle existe) */
var ficheData = lsi.get('fiches', contactUIDs[i]);
/* (3) Indice de 0 à 9 si dans le TOP 10 des APPELS */
if( contacts[uid].call > -1 ){
// On calcule le rang de la fiche en fonction du classement
var ficheIndex = contacts[uid].call;
addedFicheUids.push(ficheIndex);
// On récupère les informations de la FICHE (si elle existe) */
var ficheData = lsi.get('fiches', ficheIndex);
// Si la fiche n'existe pas, on la crée avec les valeurs par défaut
if( ficheData == null )
ficheData = this.defaultData;
// On met à jour la fiche ET on l'enregistre
ficheData.uid = ficheIndex;
ficheData.contact = parseInt(uid);
lsi.set('fiches', ficheIndex, ficheData);
}
/* (5) Si la FICHE n'exise pas, on la crée avec les valeurs par défaut */
if( ficheData == null )
ficheData = this.defaultData;
/* (4) Indice de 10 à 19 si dans le TOP 10 des SMS */
if( contacts[uid].sms > -1 ){
// On calcule le rang de la fiche en fonction du classement
var ficheIndex = 10+contacts[uid].sms;
addedFicheUids.push(ficheIndex);
// On récupère les informations de la FICHE (si elle existe) */
var ficheData = lsi.get('fiches', ficheIndex);
// Si la fiche n'existe pas, on la crée avec les valeurs par défaut
if( ficheData == null )
ficheData = this.defaultData;
// On met à jour la fiche ET on l'enregistre
ficheData.uid = ficheIndex;
ficheData.contact = parseInt(uid);
lsi.set('fiches', ficheIndex, ficheData);
/* (6) On met à jour la fiche */
ficheData.uid = contactData.uid;
ficheData.firstname = contactData.firstname;
ficheData.lastname = contactData.lastname;
ficheData.username = contactData.username;
}
/* (7) On enregistre les modification */
lsi.set('fiches', contactUIDs[i], ficheData);
}
/* (2) Mise à jour en fonction des contacts APRÈS SAISIE MANUELLE
---------------------------------------------------------*/
// Si moins de 10+10 contacts crées, on les complètes en fonction des contacts séquentiellement
if( addedFicheUids.length < 20 ){
/* (1) Pour chaque CONTACT, on met à jour/crée la FICHE associée*/
for( var uid in contacts ){
/* (2) On cherche un uid de fiche non existant dans l'intervalle 0-19 */
var ficheUid = 0;
while( addedFicheUids.indexOf(ficheUid) > -1 && ficheUid < 20 )
ficheUid++;
// On enregistre le nouvel UID dans les uid crées
addedFicheUids.push(ficheUid);
/* (3) On récupère les informations de la FICHE (si elle existe) */
var ficheData = lsi.get('fiches', ficheUid);
// Si la fiche n'existe pas, on la crée avec les valeurs par défaut
if( ficheData == null )
ficheData = this.defaultData;
/* (4) On met à jour la fiche ET on l'enregistre */
ficheData.uid = ficheUid;
ficheData.contact = uid;
lsi.set('fiches', ficheUid, ficheData);
/* (5) Si on a déja crée 10+10 fiches, on arrête */
if( addedFicheUids.length >= 20 )
break;
}
}
/* (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
---------------------------------------------------------*/
for( var key in ficheData ){
/* (1) On récupère le contact associé */
var associatedContact = lsi.get('contacts', ficheData[key].contact);
// Si erreur, on passe au suivant
if( associatedContact == null )
continue;
/* (2) Si la fiche n'est pas dans les 2 top 10 (APPELS et SMS) */
if( associatedContact.sms == -1 || associatedContact.call == -1 )
continue; // On passe au suivant
/* (3) On récupère l'autre fiche (clone) */
var inCall = parseInt(key) < 10; // Si on est dans le top 10 des APPELS, sinon dans celui des SMS
var cloneIndex = inCall ? 10+associatedContact.sms : associatedContact.call; // Contient l'index du clone dans l'autre top (APPELS ou SMS)
var clone = ficheData[cloneIndex];
/* (4) Si le clone a été modifié en dernier, on ne fait rien */
if( clone.timestamp >= ficheData[key].timestamp )
continue;
/* (5) On copie les données de la FICHE dans le clone (cas ou la fiche est modifiée en dernier) */
var obj = ficheData[key];
obj.uid = clone.uid;
lsi.set('fiches', clone.uid, obj);
}
@ -366,10 +513,10 @@ inputPhoneFiche.prototype.sync = function(){
=========================================================*/
inputPhoneFiche.prototype.nav = function(element){
/* (1) On vérifie que l'élément contient un nombre et existe */
if( typeof element == 'undefined' )
if( element == null )
return false;
if( isNaN(element.innerHTML) )
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'nav-fiche' )
return false;
/* (2) On désactive tous les éléments actifs */
@ -379,7 +526,7 @@ inputPhoneFiche.prototype.nav = function(element){
/* (3) On active l'élément courant */
element.addClass('active');
this.selected = parseInt(element.innerHTML) - 1;
this.selected = parseInt(element.getData('n'));
};
@ -391,32 +538,53 @@ inputPhoneFiche.prototype.nav = function(element){
/* [7] Mise à jour de la navigation
=========================================================*/
inputPhoneFiche.prototype.updateNavBar = function(uid_list){
/* (1) On vide la nav bar */
this.nav_container.innerHTML = '';
inputPhoneFiche.prototype.updateNavBar = function(){
var ficheData = lsi.export('fiches');
var len = lsi.keys('fiches').length;
/* (2) On la re-remplit avec toutes les données */
for( var i = 0 ; i < uid_list.length ; i++ ){
// On rajoute 1 pour la lisibilité
var realIndex = parseInt(uid_list[i]) + 1;
this.nav_container.innerHTML += '<span>'+realIndex+'</span>';
/* (1) On vérifie si la barre de navigation est à jour */
var navBarUpToDate = $$('#nav-fiche [data-n]').length == len;
/* (2) On vide et remplit la barre de nav, si elle n'est pas à jour */
if( !navBarUpToDate ){
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;';
// Si début du top 10 des SMS, on met le label 'SMS' et un border-left
else if( i == 10 ){
this.nav_container.innerHTML += '<span class="fc">SMS</span>';
this.nav_container.innerHTML += '<span data-n="'+i+'">'+(i%10 + 1)+'</span>';
// Sinon, on ajoute juste le bouton
}else
this.nav_container.innerHTML += '<span data-n="'+i+'">'+(i%10 + 1)+'</span>';
}
/* (3) On montre les FICHES qui sont correctes */
var ficheData = lsi.export('fiches');
for( var key in ficheData ){
// Si la MINI fiche est valide
if( ficheData[key].valid === true ) this.nav_container.children[ficheData[key].uid].addClass('done');
var currentElement = $('#nav-fiche [data-n="'+ficheData[key].uid+'"]');
if( currentElement == null )
continue;
// Si on ne trouve pas le bouton
// Si la FICHE est valide
if( ficheData[key].valid === true ) currentElement.addClass('done');
// Si elle est invalide
else this.nav_container.children[ficheData[key].uid].remClass('done');
else currentElement.remClass('done');
}
/* (4) On séléctionne par défaut le dernier sélectionné */
this.nav( this.nav_container.children[this.selected] );
this.nav( $('#nav-fiche [data-n="'+this.selected+'"]') );
};
@ -427,29 +595,29 @@ inputPhoneFiche.prototype.updateNavBar = function(uid_list){
inputPhoneFiche.prototype.check = function(ficheData){
// {1} Vérification des <input> //
// 1. L'age est un nombre
if( isNaN(parseInt(ficheData.age)) )
return false;
// 2. La ville a au moins 2 caractères
// 1. La ville a au moins 2 caractères
if( ficheData.city.length < 2 )
return false;
// 3. La durée de la relation en mois est vide ou un nombre
// 2. La durée de la relation en mois est vide ou un nombre
if( isNaN(parseInt(ficheData.duration[0])) && ficheData.duration[0].length > 0 )
return false;
// 4. La durée de la relation en année est vide ou un nombre
// 3. La durée de la relation en année est vide ou un nombre
if( isNaN(parseInt(ficheData.duration[1])) && ficheData.duration[1].length > 0 )
return false;
// 5. Pour la durée de la relation, au moins un des 2 n'est pas vide
// 4. Pour la durée de la relation, au moins un des 2 n'est pas vide
if( ficheData.duration[0].length+ficheData.duration[1].length == 0 )
return false;
// {2} Vérification des <select> //
// 6. Le <select> pour la profession n'est pas indéfini
// 5. Le <select> pour la profession n'est pas indéfini
if( ficheData.job == '.' )
return false;
// 7. Le <select> pour les études n'est pas indéfini
// 6. 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
if( ficheData.age == '.' )
return false;
// {3} Vérification des <input> radio //
// 8. Le SEXE a un et un seul choix
@ -471,7 +639,6 @@ inputPhoneFiche.prototype.check = function(ficheData){
for( var i = 0 ; i < ficheData.freq.length ; i++ )
if( !checkRadioValue( ficheData.freq[i] ) )
return false;
// 14. 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] ) )
@ -525,7 +692,7 @@ inputPhoneFiche.prototype.attach = function(handler){
// 1. On gère la navigation
ptr.nav(e.target);
// 2. On gere le chargement dynamique
ptr.handler();
ptr.handler(e.target);
}, false);
};

View File

@ -0,0 +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)};

View File

@ -0,0 +1,176 @@
/* [0] Constructeur -> définit le conteneur et le bouton d'ajout
=========================================================*/
function inputPhoneMatrice(container){
this.container = container;
}
/* [1] Attributs
=========================================================*/
inputPhoneMatrice.prototype = {
container: this.container // Conteneur de la matrice
};
/* [2] Gestion de l'enregistrement de la matrice
=========================================================*/
inputPhoneMatrice.prototype.fieldsToStorage = function(){
console.log('MATRICE: FIELDS TO STORAGE');
// {1} On initialise notre deflater pour récupérer les valeurs //
var deflater = new FormDeflater(this.container, ['input'], ['data-name']);
// {2} On extrait les données //
var deflated = deflater.deflate();
// On crée le hash
var deflatedHash = crc32(JSON.stringify(deflated));
// console.log(deflated);
/* (3) On crée l'objet et on le remplit avec les relations */
var obj = {};
for( var i in deflated )
// {1} Si c'est un tableau de sujets //
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 ){
if( obj[i] == null )
obj[i] = [];
obj[i].push( parseInt(deflated[i][a].value) );
}
// {2} Si il n'y a qu'un sujet //
}else if( deflated[i].status === true ){
if( obj[i] == null )
obj[i] = [];
obj[i].push( parseInt(deflated[i].value) );
}
lsi.set( 'matrice', 0, obj );
// Objet de la forme
//
// idA: [idV, idW], # A connait V et W (et réciproquement)
// idB: [idX, idY], # B connait X et Y (et réciproquement)
// ...
//
};
/* [4] Gestion de l'affichage depuis le 'localStorage'
=========================================================*/
inputPhoneMatrice.prototype.storageToFields = function(){
console.log('MATRICE: STORAGE TO FIELDS');
/* (1) On récupère la liste des contacts à mettre dans la matrice */
// On récupère les fiches
var ficheData = lsi.export('fiches');
// On récupère les données de la matrice
var matriceData = lsi.get('matrice', 0);
// On récupère les contacts pour afficher les noms/prénoms
var contactData = lsi.export('contacts');
// Contiendra les UID des contacts à mettre dans la matrice
var contacts = [];
// Pour chaque fiche, on ajoute l'uid du contact s'il n'est pas déja ajouté
for( var f in ficheData )
if( contacts.indexOf( ficheData[f].contact ) == -1 )
contacts.push( ficheData[f].contact );
/* (2) On construit le HTML de la matrice */
// Contiendra le HTML
var matrice_html = "<table class='line'>";
// {1} Pour chaque ligne //
for( var A = 0 ; A < contacts.length ; A++ ){
var conA = contactData[A];
matrice_html += '<tr>';
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 += '</td>';
}else // Sinon,
matrice_html += '<td></td>';
// {2} Pour chaque case //
for( var B = 0 ; B < contacts.length ; B++ ){ if( B < contacts.length-1 ){
var conB = contactData[B];
// {3} Première colonne -> Intitulé des ordonnées //
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 += '</span>';
// {4} Valeurs des relations (boutons) //
}else if( B < A ){
matrice_html += "<td>";
matrice_html += "<input type='checkbox' name='matrice_"+conA.uid+"_"+conB.uid+"' data-name='"+conA.uid+"' value='"+conB.uid+"' id='matrice_"+conA.uid+"_"+conB.uid+"'";
// Si la relation existe, on active le bouton
if( matriceData[A] != null && matriceData[A].indexOf(B) > -1 )
matrice_html += " checked";
matrice_html += " >";
matrice_html += "<label for='matrice_"+conA.uid+"_"+conB.uid+"'></label>";
// {5} Cases vides (moitié supérieure droite) //
}else
matrice_html += "<td class='hidden'>";
matrice_html += '</td>';
}}
matrice_html += '</tr>';
}
matrice_html += '</table>';
/* (3) On affiche la matrice */
this.container.innerHTML = matrice_html;
};
/* [9] Point d'amorçage de la gestion des contacts
=========================================================*/
inputPhoneMatrice.prototype.attach = function(){
console.log('MATRICE: ATTACH');
/* (1) On initialise le jeu de données */
lsi.createDataset('matrice');
/* (2) On charge les mini fiches depuis la mémoire ('localStorage') */
this.storageToFields();
/* (3) On enregistre la matrice à chaque modification */
var ptr = this;
this.container.addEventListener('click', function(e){
ptr.fieldsToStorage();
ptr.storageToFields();
}, false);
};

View File

@ -1,10 +1,10 @@
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:{firstname:"",lastname:"",username:"",sexe:[{status:!0},{status:!1}],age:"",job:".",loc:[{status:!0},{status:!1},{status:!1},{status:!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();console.log(c);var d=lsi.get("mini-fiches","form"+c.uid.value);!1===d&&(d.username="inconnu",d.firstname="inconnu",d.lastname="inconnu");c={uid:c.uid.value,firstname:d.firstname,lastname:d.lastname,username:d.username,sexe:c.sexe,age:c.age.value,
job:c.job.value,loc:c.loc};c.valid=this.check(c);lsi.set("mini-fiches","form"+c.uid,c)}};
inputPhoneMini.prototype.add=function(a){console.log("MINI FICHE: ADD");if(null==a||null==a.uid)return!1;a.firstname=null!=a.firstname?a.firstname:this.defaultData.firstname;a.lastname=null!=a.lastname?a.lastname:this.defaultData.lastname;a.username=null!=a.username?a.username:this.defaultData.username;a.age=null!=a.age?a.age:this.defaultData.age;a.sexe=null!=a.sexe?a.sexe:this.defaultData.sexe;a.job=null!=a.job?a.job:this.defaultData.job;a.loc=null!=a.loc?a.loc:this.defaultData.loc;this.container.innerHTML+=
miniFicheBuilder.build({firstname:a.firstname,lastname:a.lastname,username:a.username,uid:a.uid,age:a.age,job:a.job});var b=$('article.mini-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");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="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["export"]("mini-fiches");this.container.innerHTML="";this.add(a["form"+this.selected]);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;c.firstname=a[b].firstname;c.lastname=a[b].lastname;c.username=a[b].username;lsi.set("mini-fiches",b,c)}};
inputPhoneMini.prototype.nav=function(a){if("undefined"==typeof a||isNaN(a.innerHTML))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.innerHTML)-1};
inputPhoneMini.prototype.updateNavBar=function(){var a=lsi["export"]("mini-fiches"),a=Object.keys(a).length;if(this.nav_container.children.length!=a){this.nav_container.innerHTML="";for(var b=0;b<a;b++)this.nav_container.innerHTML+="<span></span>"}var a=lsi["export"]("mini-fiches"),c;for(c in a)b=this.nav_container.children[a[c].uid],b.innerHTML=a[c].uid+1,!0===a[c].valid?b.addClass("done"):b.remClass("done");this.nav(this.nav_container.children[this.selected])};
inputPhoneMini.prototype.check=function(a){return!isNaN(parseInt(a.age))&&checkRadioValue(a.sexe)&&"."!=a.job&&checkRadioValue(a.loc)?!0:!1};inputPhoneMini.prototype.attach=function(a){console.log("MINI FICHE: ATTACH");lsi.createDataset("mini-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)};
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)}}};
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)};

View File

@ -9,17 +9,19 @@ function inputPhoneMini(container, navContainer){
=========================================================*/
inputPhoneMini.prototype = {
container: this.container, // Conteneur des mini fiches relation
nav_container: this.nav_container, // Conteneur de la navigation entre les fiches
nav_container: this.nav_container, // Conteneur de la navigation entre les MINI fiches
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
firstname: '',
lastname: '',
username: '',
sexe: [{status:true}, {status:false}],
age: '',
job: '.',
loc: [{status:true}, {status:false}, {status:false}, {status:false}]
sexe: [defTrue, defFalse],
age: '.',
studies: '.',
loc: [defTrue, defFalse, defFalse, defFalse],
reltype: [ defTrue, defFalse, defFalse, defFalse, defFalse,
defFalse, defFalse, defFalse, defFalse], // Choix 1 à 9
reltypeSpecial: '',
timestamp: 0,
valid: false
}
};
@ -37,40 +39,55 @@ inputPhoneMini.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();
// On crée le hash
var deflatedHash = crc32(JSON.stringify(deflated));
console.log(deflated);
// console.log(deflated);
// {4} On récupère les données du LSI si elles existent //
var existingData = lsi.get('mini-fiches', 'form'+deflated.uid.value);
var existingData = lsi.get('mini-fiches', deflated.uid.value);
// Si n'existe pas, on initialise
if( existingData === false ){
existingData.username = 'inconnu';
existingData.firstname = 'inconnu';
existingData.lastname = 'inconnu';
}
// Si n'existe pas, on passe à la suivante
if( existingData === false )
continue;
// {5} On récupère et met en forme les valeurs du deflater //
// Si le hash est le même, on ne fait rien
if( existingData.hash != null && existingData.hash == deflatedHash )
return;
console.warn('> MINI UPDATE');
var obj = {
uid: deflated.uid.value,
firstname: existingData.firstname,
lastname: existingData.lastname,
username: existingData.username,
sexe: deflated.sexe, // [0] Homme, [1] Femme
age: deflated.age.value,
job: deflated.job.value,
loc: deflated.loc // [0] Choix 1 -> [3] Choix 4
uid: parseInt(deflated.uid.value),
firstname: existingData.firstname,
lastname: existingData.lastname,
username: existingData.username,
sexe: deflated.sexe, // [0] Homme, [1] Femme
age: deflated.age.value,
studies: deflated.studies.value,
reltype: deflated.reltype, // [0] ...
reltypeSpecial: deflated.reltypeSpecial.value,
loc: deflated.loc, // [0] Choix 1 -> [3] Choix 4
hash: deflatedHash
};
/* (8) On vérifie la validité des données et on l'enregistre dans l'objet */
obj.valid = this.check(obj);
/* (8) On vérifie la validité des données et on l'enregistre dans l'objet avec la date de modification */
obj.valid = this.check(obj);
// On met à jour la date de modification, si on a pas qu'@uid de différent
if( diff(existingData, obj).length > 0 ){
console.warn('> FICHE UPDATE');
obj.timestamp = Date.now();
}
/* (9) On enregistre les données dans le 'localStorage' */
lsi.set('mini-fiches', 'form'+obj.uid, obj);
lsi.set('mini-fiches', obj.uid, obj);
}
};
@ -98,42 +115,61 @@ inputPhoneMini.prototype.add = function(objectData){
return false;
/* (0) Gestion du formattage des valeur */
objectData.firstname = (objectData.firstname != null) ? objectData.firstname : this.defaultData.firstname;
objectData.lastname = (objectData.lastname != null) ? objectData.lastname : this.defaultData.lastname;
objectData.username = (objectData.username != null) ? objectData.username : this.defaultData.username;
objectData.age = (objectData.age != null) ? objectData.age : this.defaultData.age;
objectData.sexe = (objectData.sexe != null) ? objectData.sexe : this.defaultData.sexe;
objectData.job = (objectData.job != null) ? objectData.job : this.defaultData.job;
objectData.loc = (objectData.loc != null) ? objectData.loc : this.defaultData.loc;
objectData.age = (objectData.age != null) ? objectData.age : this.defaultData.age;
objectData.sexe = (objectData.sexe != null) ? objectData.sexe : this.defaultData.sexe;
objectData.studies = (objectData.studies != null) ? objectData.studies : this.defaultData.studies;
objectData.reltype = (objectData.reltype != null) ? objectData.reltype : this.defaultData.reltype;
objectData.reltypeSpecial = (objectData.reltypeSpecial != null) ? objectData.reltypeSpecial : this.defaultData.reltypeSpecial;
objectData.loc = (objectData.loc != null) ? objectData.loc : this.defaultData.loc;
// {1} Création physique //
// {1} On récupère username/firstname/lastname du contact associé //
var associatedContact = lsi.get('contacts', objectData.uid);
// Si on ne trouve pas le contact, on ne fais rien
if( associatedContact === false )
return false;
// {2} Création physique //
this.container.innerHTML += miniFicheBuilder.build({
firstname: objectData.firstname,
lastname: objectData.lastname,
username: objectData.username,
uid: objectData.uid,
age: objectData.age,
job: objectData.job
firstname: associatedContact.firstname,
lastname: associatedContact.lastname,
username: (associatedContact.username.length==0) ? '' : '('+associatedContact.username+')',
countcall: associatedContact.countcall,
countsms: associatedContact.countsms,
uid: objectData.uid,
reltypespecial: objectData.reltypeSpecial
});
/* (2) On sélectionne la valeur dans le select (manuellement) de la PROFESSION */
var selectedOption = $('article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="job"]>option[value="'+objectData.job+'"]');
/* {3} On sélectionne la valeur dans le select (manuellement) de la PROFESSION */
var selectedOption = $('article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+objectData.studies+'"]');
if( selectedOption != null )
selectedOption.setAttribute('selected', 'selected');
/* (3) On sélectionna la valeur des boutons <radio> pour le SEXE */
/* {4} On sélectionne la valeur dans le select (manuellement) de l'AGE */
selectedOption = $('article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+objectData.age+'"]');
if( selectedOption != null )
selectedOption.setAttribute('selected', 'selected');
/* {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');
else sexeCreated[i].removeAttribute('checked');
/* (4) On sélectionna la valeur des boutons <radio> pour la LOCATION */
/* {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');
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');
else locCreated[i].removeAttribute('checked');
if( objectData.loc[i].status ) locCreated[i].setAttribute('checked', 'checked');
else locCreated[i].removeAttribute('checked');
};
@ -152,13 +188,13 @@ inputPhoneMini.prototype.storageToFields = function(){
console.log('MINI FICHE: STORAGE TO FIELDS');
// {1} Pour chaque contact du 'localStorage' //
var miniData = lsi.export('mini-fiches');
var miniData = lsi.get('mini-fiches', this.selected);
// On réinitialise le HTML
this.container.innerHTML = '';
// {2} On affiche la MINI fiche sélectionnée //
this.add(miniData['form'+this.selected]);
this.add(miniData);
// {3} On met à jour la navigation //
this.updateNavBar();
@ -197,10 +233,7 @@ inputPhoneMini.prototype.sync = function(){
}
/* (5) On met à jour la MINI fiche */
miniData.uid = contactData[key].uid;
miniData.firstname = contactData[key].firstname;
miniData.lastname = contactData[key].lastname;
miniData.username = contactData[key].username;
miniData.uid = contactData[key].uid;
/* (6) On enregistre les modification */
@ -220,10 +253,10 @@ inputPhoneMini.prototype.sync = function(){
=========================================================*/
inputPhoneMini.prototype.nav = function(element){
/* (1) On vérifie que l'élément contient un nombre et existe */
if( typeof element == 'undefined' )
if( element == null )
return false;
if( isNaN(element.innerHTML) )
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'nav-mini' )
return false;
/* (2) On désactive tous les éléments actifs */
@ -233,7 +266,7 @@ inputPhoneMini.prototype.nav = function(element){
/* (3) On active l'élément courant */
element.addClass('active');
this.selected = parseInt(element.innerHTML) - 1;
this.selected = parseInt(element.getData('n'));
};
@ -248,24 +281,30 @@ 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 = this.nav_container.children.length == len;
/* (1) On vide et remplit la barre de nav, si elle n'est pas à jour */
/* (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 ){
this.nav_container.innerHTML = '';
for( var i = 0 ; i < len ; i++ )
this.nav_container.innerHTML += '<span></span>';
this.nav_container.innerHTML += '<span data-n="'+i+'">'+(i+1)+'</span>';
}
/* (3) On montre les MINI fiches qui sont correctes dans la navbar */
var miniData = lsi.export('mini-fiches');
for( var key in miniData ){
var currentElement = this.nav_container.children[miniData[key].uid];
var currentElement = $('#nav-mini [data-n="'+miniData[key].uid+'"]');
currentElement.innerHTML = miniData[key].uid+1;
if( currentElement == null )
continue;
// On remplit avec le numéro de la MINI fiche
// currentElement.setAttribute('data-n', miniData[key].uid);
// currentElement.innerHTML = miniData[key].uid + 1;
// Si la MINI fiche est valide
if( miniData[key].valid === true ) currentElement.addClass('done');
@ -277,7 +316,7 @@ inputPhoneMini.prototype.updateNavBar = function(){
/* (4) On séléctionne par défaut la dernière MINI fiche sélectionnée */
this.nav( this.nav_container.children[this.selected] );
this.nav( $('#nav-mini [data-n="'+this.selected+'"]') );
};
@ -287,18 +326,24 @@ inputPhoneMini.prototype.updateNavBar = function(){
=========================================================*/
inputPhoneMini.prototype.check = function(miniData){
// 1. L'age est un nombre
if( isNaN(parseInt(miniData.age)) )
return false;
// 2. Le sexe est défini
// 1. Le sexe est défini
if( !checkRadioValue(miniData.sexe) )
return false;
// 3. Le métier est défini
if( miniData.job == '.' )
// 2. Le métier est défini
if( miniData.studies == '.' )
return false;
// 3. L'age est définie
if( miniData.age == '.' )
return false;
// 4. La distance de localisation est définie
if( !checkRadioValue(miniData.loc) )
return false;
// 5. Le TYPE DE RELATION a un et un seul choix
if( !checkRadioValue(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 )
return false;
// Si aucune erreur, tout est ok
@ -323,9 +368,8 @@ inputPhoneMini.prototype.attach = function(handler){
/* (3) On attache la barre de navigation à une fonction */
// On enregistre le handler
this.handler = handler;
var ptr = this;
/* (2) On attache l'évènement sur le bouton d'ajout de contact */
/* (2) On attache l'évènement sur le conteneur de navigation */
var ptr = this;
this.nav_container.addEventListener('click', function(e){
// 1. On gère la navigation

View File

@ -1,3 +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","form",{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","form");null!=a&&(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.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})};
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()};

View File

@ -43,7 +43,7 @@ inputPhoneSubject.prototype.fieldsToStorage = function(){
};
// {3} On enregistre les données dans le 'localStorage' //
lsi.set('subject', 'form', obj);
lsi.set('subject', 0, obj);
};
@ -58,9 +58,10 @@ inputPhoneSubject.prototype.storageToFields = function(){
console.log('SUBJECT: STORAGE TO FIELDS');
// {1} On récupère les informations du sujet //
var subjectData = lsi.get('subject', 'form');
var subjectData = lsi.get('subject', 0);
if( subjectData == null ) return;
if( subjectData == null )
subjectData = { number: '', username: '', firstname: '', lastname: '' };
// {2} On restore les valeurs //
this.number.value = subjectData.number;

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,c,f){b.hasOwnProperty("path")||c({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(-1<[0,200].indexOf(d.xhr[a].status))try{c(JSON.parse(d.xhr[a].responseText))}catch(b){c({ModuleError:1})}else c({ModuleError:3})};
var g=new FormData,e;for(e in b)g.append(e,b[e]);this.xhr[a].open("POST",this.target,!0);null!=f&&this.xhr[a].setRequestHeader("Authorization","Digest "+f);this.xhr[a].send(g)}};
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)}};

View File

@ -60,8 +60,8 @@ APIClass.prototype = {
/* si success de requête */
if( [0,200].indexOf(ptrAPI.xhr[i].status) > -1 ){ // si fichier existe et reçu
try{ pHandler( JSON.parse(ptrAPI.xhr[i].responseText) ); } // si on peut parser, on envoie
catch(e){ pHandler({ModuleError:1}); } // sinon on envoie obj.request = 'corrupted'
try{ pHandler( JSON.parse(ptrAPI.xhr[i].responseText) ); } // si on peut parser, on envoie
catch(e){ pHandler({ModuleError:-1, ErrorDescription:'Erreur au niveau de api.js'}); } // sinon on envoie obj.request = 'corrupted'
}
/* sinon retourne obj.request = 'unreachable' */
else
@ -75,8 +75,12 @@ APIClass.prototype = {
// On ajoute tous les attributs en POST
for( var key in pRequest )
form.append(key, pRequest[key]);
// On envoie le 'path' tel quel <String>
if( key == 'path' ) form.append(key, pRequest[key]);
// On envoie un fichier tel quel <File>
else if( pRequest[key] instanceof File ) form.append(key, pRequest[key]);
// On envoie le reste en JSON
else form.append(key, JSON.stringify(pRequest[key]));
this.xhr[i].open('POST', this.target, true);

View File

@ -1,3 +1,5 @@
function localStorageInterface(){}
localStorageInterface.prototype={dataset:[],dataset_keys:[],set:function(a,b,d){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){return-1==this.dataset.indexOf(a)?!1:JSON.parse(localStorage.getItem(a+"_"+b))},createDataset:function(a){if(null==a||"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}};var lsi=new 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;

View File

@ -16,9 +16,11 @@ localStorageInterface.prototype = {
*
*/
set: function(dataset_name, key, value){
var index = this.dataset.indexOf(dataset_name);
// On met la clé en <String>
key = key.toString();
/* (1) Si le 'dataset' n'existe pas */
var index = this.dataset.indexOf(dataset_name);
if( index == -1 ) return false; // erreur
/* (2) On enregistre la nouvelle clé, si elle est nouvelle */
@ -42,6 +44,9 @@ localStorageInterface.prototype = {
*
*/
get: function(dataset_name, key){
// On met la clé en <String>
key = key.toString();
/* (1) Si le 'dataset' n'existe pas */
if( this.dataset.indexOf(dataset_name) == -1 ) return false; // erreur
@ -49,6 +54,39 @@ localStorageInterface.prototype = {
return JSON.parse( localStorage.getItem(dataset_name+'_'+key) );
},
/* SUPPRIME UN ELEMENT D'UN DATASET DONNE
*
* @dataset<String> Nom du dataset en question
* @key<String> Clé de l'élément
*
* @return status<boolean> Retourne FALSE si erreur
*
*/
del: function(dataset, key){
// On met la clé en <String>
key = key.toString();
/* (1) Si le 'dataset' n'existe pas */
var index = this.dataset.indexOf(dataset);
if( index == -1 ) return false; // erreur
/* (2) On récupère la clé dans la liste des clés */
var keyIndex = this.dataset_keys[index].indexOf(key);
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);
/* (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]));
return true;
},
/* CREATION D'UN DATASET OU RECUPERATION DES DONNEES S'IL EXISTE DEJA
*
@ -59,11 +97,12 @@ localStorageInterface.prototype = {
*/
createDataset: function(name){
/* (1) On vérifie que le @name est correct */
if( name == null || typeof name != 'string' ) return false; // erreur
if( typeof name != 'string' ) return false; // erreur
/* (2) Si le dataset est déjà enregistré, on ne fais rien */
if( this.dataset.indexOf(name) > -1 ) return true;
var datasetIndex = this.dataset.indexOf(name);
if( datasetIndex > -1 ) return true;
/* (3) On charge le dataset s'il existe */
var storedDataset = localStorage.getItem(name);
@ -72,7 +111,7 @@ localStorageInterface.prototype = {
this.dataset.push(name);
this.dataset_keys.push( JSON.parse(storedDataset) );
/* (4) Sinon, on le crée 'dataset' */
/* (4) Sinon, on crée le 'dataset' */
}else{
this.dataset.push(name);
@ -84,9 +123,17 @@ localStorageInterface.prototype = {
return true;
},
keys: function(dataset_name){
/* RENVOIE UN TABLEAU CONTENANT LES CLÉS DU DATASET
*
* @dataset<String> Le nom du dataset en question
*
* @return keys<Array> Retourne la liste des clés du dataset
*
*/
keys: function(dataset){
/* (1) Si le 'dataset' n'existe pas */
var index = this.dataset.indexOf(dataset_name);
var index = this.dataset.indexOf(dataset);
if( index == -1 ) return false; // erreur
/* (2) On retourne la liste des clés pour ce dataset */
@ -95,6 +142,13 @@ localStorageInterface.prototype = {
},
/* RENVOIE UN OBJET CORRESPONDANT AUX DONNÉES D'UN DATASET
*
* @dataset<String> Nom du dataset en question
*
* @return object<Object> Object correspondant aux valeurs du dataset ({key1: value1, key2: value2})
*
*/
export: function(dataset){
/* (1) Si le 'dataset' n'existe pas */
var index = this.dataset.indexOf(dataset);
@ -107,6 +161,67 @@ localStorageInterface.prototype = {
/* (3) On retourne le résultat */
return obj;
},
/* REMPLIT UN DATASET AVEC LES DONNÉES D'UN OBJET SUR LE PRINCIPE {CLÉ: VALEUR}
*
* @dataset<String> Nom du dataset en question
* @data<Object> Objet contenant les données à mettre dan sle dataset, sur le modèle ({key1: value1, key2: value2})
*
* @return status<Boolean> Retourne TRUE si tout s'est bien passé, sinon FALSE
*
*/
import: function(dataset, data){
/* (1) On récupère l'indice du dataset s'il existe déjà */
var index = this.dataset.indexOf(dataset);
/* (2) Cas 1 : Le dataset n'existe pas -> on le crée */
if( index == -1 )
this.createDataset(dataset);
/* (3) Cas 2 : Le dataset existe -> on le vide */
else
this.clear(dataset);
/* (2) On remplit le dataset avec toutes les données de l'objet */
for( var key in data )
this.set(dataset, key, data[key]);
/* (3) On retourne le résultat */
return true;
},
/* EFFACE TOUTES LES DONNÉES D'UN DATASET
*
* @dataset<String> Nom du dataset en question
*
* @return status<Boolean> Retourne TRUE si tout s'est bien passé, sinon FALSE
*
*/
clear: function(dataset){
/* (1) On récupère l'indice du dataset s'il existe déjà */
var index = this.dataset.indexOf(dataset);
// Si le dataset n'existe pas, on retourne une erreur
if( index == -1 ) return false;
/* (2) On supprime toutes les valeurs du dataset */
var content = this.export(dataset);
// On supprime toutes les valeurs
for( var key in content )
this.del(dataset, key);
/* (3) Par précaution, on supprime les clés du dataset */
this.dataset_keys[index] = [];
localStorage.setItem(dataset, JSON.stringify(this.dataset_keys[index]));
/* (4) On retourne que tout s'est bien passé */
return true;
}

2
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}
var format_number=new formatChecker(null,"0i ii ii ii ii");
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");

View File

@ -148,6 +148,44 @@ function include(jsResource, callback, action){ // action=true -> EXCLUSION, SIN
/* RETOURNE LES CLÉS N'AYANT PAS UNE VALEUR EGALE POUR 2 OBJETS
*
* @A<Object> Premier Objet
* @B<Object> Second Objet
*
* @return diff<Array> Tableau contenant les clés des valeurs différentes (uniquement les clés communes et non NULLes)
*
*/
function diff(A, B){
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 )
continue;
/* (1) On vérifie le type */
if( typeof A[key] !== typeof B[key] )
dKeys.push(key);
/* (2) Vérification récursive si 2 objets */
else if( A[key] instanceof Object && B[key] instanceof Object ){
// Si au moins 1 différence profonde (récursive), on ajoute la clé
if( diff(A[key], B[key]).length > 0 )
dKeys.push(key);
/* (3) Vérification superficielle (types non composés) */
}else if( A[key] != B[key] )
dKeys.push(key);
}
return dKeys;
}
/* DEFINITION DES FORMATS UTILES POUR INPUT-CHECKER
*

View File

@ -122,7 +122,7 @@
for( $i = 0 ; $i < count($fetchData) ; $i++ ) // pour tout les utilisateurs
foreach($fetchData[$i] as $col => $val){ // pour toutes les entrées
if( !mb_detect_encoding($val, 'UTF-8') )
if( !\mb_detect_encoding($val, 'UTF-8') )
$fetchData[$i][$col] = utf8_encode($val);
if( is_int($col) ){ // Si indice numerique
@ -143,7 +143,7 @@
// on supprime les doublons des entrées (indice numérique)
foreach($fetchData as $i=>$val){ // pour toutes les entrées
if( !mb_detect_encoding($val, 'UTF-8') )
if( !\mb_detect_encoding($val, 'UTF-8') )
$fetchData[$i] = utf8_encode($val);
if( is_int($i) ){ // Si indice numerique
@ -245,13 +245,27 @@
case 'sha1':
return $checker && is_string($value) && preg_match('/^[\da-f]{40}$/i', $value);
break;
break;
// Numéro de téléphone
case 'phone_number':
case 'number':
return $checker && is_string($value) && preg_match('/^(?:0|\+33 ?|0?0?33 ?|)([1-9] ?(?:[0-9] ?){8})$/i', $value);
break;
// Tableau non vide
case 'array':
return $checker && is_array($value) && count($value) > 0;
break;
// Objet non vide
case 'object':
return $checker && is_object($value) && count((array) $value) > 0;
break;
// Chaine JSON (on vérifie via le parser)
case 'json':
return $checker && is_string($value) && json_decode($value, true) !== NULL;
break;
default:
return false;
break;

View File

@ -69,6 +69,12 @@
/* Erreur d'UPLOAD */
const UploadError = 17;
// Mauvais format de fichier
const FormatError = 18;
/* Erreur au niveau javascript */
//const JavascriptError = 19; // -> géré en js
/* EXPLICITE UN CODE D'ERREUR
*
@ -101,7 +107,8 @@
case self::TokenError: return "Le token de connection est absent, érroné ou expiré."; break;
case self::PermissionError: return "Vous n'avez pas la permission d'effectuer cette action."; break;
case self::UploadError: return "Une erreur d'upload est survenue."; break;
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;
}

View File

@ -123,10 +123,10 @@
/* [4] Gestion de la reponse
=========================================================*/
$answer = new ModuleResponse($this->error);
$answer->appendAll($returned);
$response = new ModuleResponse($this->error);
$response->appendAll($returned);
return $answer;
return $response;
}
@ -192,8 +192,16 @@
// On retire le @path de @params
unset($params['path']);
/* [3] On met les paramètres JSON en JSON (si ils décodent sans erreur)
=========================================================*/
foreach($params as $name=>$value){
$json = json_decode( $value, true );
// Si aucune erreur, on affecte la valeur
if( $json != null )
$params[$name] = $json;
}
/* [3] On retourne une instance de <ModuleRequest>
/* [4] On retourne une instance de <ModuleRequest>
=========================================================*/
// On cree notre requete avec le token
return new ModuleRequest($post['path'], $params, $token);

View File

@ -139,7 +139,7 @@
// On rajoute l'erreur au message
$returnData = array_merge(
array(
'ModuleError' => $this->error,
'ModuleError' => $this->error,
'ErrorDescription' => ManagerError::explicit($this->error)
),
$this->data

View File

@ -21,6 +21,7 @@
public static function unserialize($params){
extract($params);
// On formatte le numéro de téléphone
$phone_number = Database::formatNumber($phone_number);
@ -97,15 +98,12 @@
array_push($phone_logs, $phone_log);
}
/* [5] On trie les contacts par nombre d'apparition
/* [5] On trie les contacts par nombre d'apparition d'APPEL
=========================================================*/
// Système de poids -> 5 sms = 1 appel
// 0 -> {number, name, calls, sms} (closest contact)
// 1 -> {number, name, calls, sms} (2nd closest contact)
$tmp = $phone_directory; // Permet de ne pas efface $phone_directory
$maxNumber = -1; // Contiendra le numéro du plus gros
$maxVal = null; // Contiendra la valeur max (sms+5*cal ls)
$sorted_directory = array(); // Contiendra l'annuaire trié par nombre d'interraction
$tmp = $phone_directory; // Permet de ne pas efface $phone_directory
$maxNumber = -1; // Contiendra le numéro du plus gros
$maxVal = null; // Contiendra la valeur max (total calls)
$call_sorted = array(); // Contiendra l'annuaire trié par nombre d'interraction
/* (1) Tant qu'on a pas tout trié */
while( count($tmp) > 0 ){
@ -114,22 +112,51 @@
/* (2) On parcours toutes les entrées puor trouver le plus proche */
foreach($tmp as $number=>$data)
if( $data['sms']+5*$data['calls'] > $maxVal || is_null($maxVal) ){
if( $data['calls'] > $maxVal || is_null($maxVal) ){
// On met à jour la valeur max
$maxVal = $data['sms']+5*$data['calls'];
$maxVal = $data['calls'];
// On met à jour l'indice
$maxNumber = $number;
}
/* (3) On supprime le plus proche qu'on a trouvé et on l'ajoute au tableau trié */
array_push($sorted_directory, array(
array_push($call_sorted, array(
'number' => $maxNumber,
'name' => $tmp[$maxNumber]['name'],
'calls' => $tmp[$maxNumber]['calls'],
'sms' => $tmp[$maxNumber]['sms'],
'total' => $tmp[$maxNumber]['sms'] + 5*$tmp[$maxNumber]['calls']
'count' => $tmp[$maxNumber]['calls']
));
unset($tmp[$maxNumber]);
}
/* [6] On trie les contacts par nombre d'apparition de SMS/MMS
=========================================================*/
$tmp = $phone_directory; // Permet de ne pas efface $phone_directory
$maxNumber = -1; // Contiendra le numéro du plus gros
$maxVal = null; // Contiendra la valeur max (total calls)
$sms_sorted = array(); // Contiendra l'annuaire trié par nombre d'interraction
/* (1) Tant qu'on a pas tout trié */
while( count($tmp) > 0 ){
$maxNumber = -1;
$maxVal = null;
/* (2) On parcours toutes les entrées puor trouver le plus proche */
foreach($tmp as $number=>$data)
if( $data['sms'] > $maxVal || is_null($maxVal) ){
// On met à jour la valeur max
$maxVal = $data['sms'];
// On met à jour l'indice
$maxNumber = $number;
}
/* (3) On supprime le plus proche qu'on a trouvé et on l'ajoute au tableau trié */
array_push($sms_sorted, array(
'number' => $maxNumber,
'name' => $tmp[$maxNumber]['name'],
'count' => $tmp[$maxNumber]['sms']
));
unset($tmp[$maxNumber]);
}
@ -138,7 +165,9 @@
=========================================================*/
return array(
'ModuleError' => ManagerError::Success,
'directory' => $sorted_directory,
'directory' => $phone_directory,
'calls' => $call_sorted,
'sms' => $sms_sorted,
'logs' => $phone_logs
);
}

View File

@ -11,7 +11,7 @@
class charts{
class chart{
/* RETOURNE UN JEU DE DONNEES POUR GRAPHIQUE #NETWORK

68
manager/module/input.php Normal file
View File

@ -0,0 +1,68 @@
<?php
namespace manager\module;
use \manager\sessionManager;
use \manager\Database;
use \manager\ManagerError;
use \manager\ModuleRequest;
use \manager\Repo;
class input{
/* TRAITE LES DONNÉES D'UN FORMULAIRE DE TYPE TÉLÉPHONIQUE
*
* @subject<Array> Tableau contenant les données du sujet
* @contacts<Array> Tableau contenant les données des contacts
* @mini<Array> Tableau contenant les données des mini fiches relation
* @fiches<Array> Tableau contenant les données des fiches relation
*
* @return subject_id<int> Retourne l'id sujet de l'enquête
*
*/
public static function phone($params){
extract($params);
/* [1] On crée le sujet de l'enquête
=========================================================*/
/* (1) On rédige la requête */
$create_subject_request = new ModuleRequest('subject/create', array(
'username' => $subject['username'],
'firstname' => $subject['firstname'],
'lastname' => $subject['lastname'],
'number' => $subject['number']
));
/* (2) On exécute la requête (création) */
$create_subject_response = $create_subject_request->dispatch();
/* (3) Gestion de l'erreur, si erreur de création */
if( $create_subject_response->error != ManagerError::Success )
return array( 'ModuleError' => $create_subject_response->error );
/* (4) On récupère l'id du sujet */
$subject_id = $create_subject_response->get('id_subject');
/* [2] Pour chaque contact, on crée le sujet + les relations
=========================================================*/
// TODO : Here !!
/* [2] Gestion du retour
=========================================================*/
return array(
'ModuleError' => ManagerError::Success,
'subject_id' => $subject_id
);
}
}
?>

View File

@ -2,9 +2,13 @@
namespace manager\module;
use \manager\ManagerError;
use \manager\ResourceDispatcher;
class module{
/* PERMET DE TESTER L'API
*
*/
public static function method(){
return array(
@ -15,6 +19,9 @@
}
/* PERMET DE TESTER UNE L'ORDRE DES PARAMÈTRES
*
*/
public static function phpunitParams($params){
extract($params);
@ -25,10 +32,58 @@
);
}
/* RENVOIE UNE DESCRIPTION EN MARKDOWN DES MODULES DE L'API
*
* @return markdown<String> Description des modules
*
*/
public static function markdown(){
/* [1] Récupération de la configuration
=========================================================*/
// On récupère le fichier et on le parse
$modules = json_decode( ResourceDispatcher::getResource('f/json/modules/conf'), true );
// Gestion de l'erreur de parsage
if( $modules == null )
return array( 'ModuleError' => ManagerError::ParsingFailed );
/* [2] Mise en forme de la liste des modules
=========================================================*/
$markdown = "## Module List<br>";
foreach($modules as $moduleName=>$moduleData)
$markdown .= "- $moduleName<br>";
/* [3] Mise en forme des méthodes des modules
=========================================================*/
$markdown .= '----<br>## Method List & Description<br>';
$count = 1;
foreach($modules as $moduleName=>$moduleData){
$markdown .= "### $count - '$moduleName' methods<br>";
foreach($moduleData as $methodName=>$methodData)
$markdown .= "`$methodName` - ".$methodData['description']."<br>";
$markdown .= '----<br>';
$count++;
}
/* [n] Gestion du retour
=========================================================*/
return array(
'ModuleError' => ManagerError::Success,
'markdown' => $markdown
);
}
}
?>

View File

@ -4,56 +4,47 @@
use \manager\Database;
use \manager\ResourceDispatcher;
use \manager\sessionManager;
use \manager\ModuleRequest;
use \manager\ManagerError;
use \manager\Repo;
class upload{
/* EFFECTUE UN UPLOAD D'UN fichier
*
/* RENVOIE LE CHEMIN D'UN fichier
*
* @prefix<String> Préfixe (dossier parent) du fichier
* @extension<String> Extension du fichier
* @file<FILE> Pointeur vers $_FILES['']
*
* @return error<ManagerError> Retourne l'erreur attestant de l'état de l'upload
*
*/
private static function simpleFile($prefix, $extension, $file){
*
* @return response<Array> Renvoie le chemin du fichier, ainsi qu'une erreur de 'ManagerError'
*
*/
private static function getPath($prefix, $extension){
// Si on est pas connecté, on retourne une erreur -> impossible via token
if( !connected() ) return ManagerError::PermissionError;
if( !connected() ) return array( 'error' => ManagerError::PermissionError );
/* [0] On formatte les entrées
=========================================================*/
$prefix = htmlspecialchars($prefix);
// Si $prefix n'est pas au bon format
if( !preg_match('/^[a-z0-9_-]+$/', $prefix) )
return ManagerError::UploadError;
/* [1] Chargement du fichier de config
/* [1] Chargement du fichier de config
=========================================================*/
/* (1) On récupère le fichier */
$uploadAuth = ResourceDispatcher::getResource('f/json/upload-auth/conf');
/* (2) Si une erreur pour le fichier de conf */
if( $uploadAuth === false )
return ManagerError::UnreachableResource;
return array( 'error' => ManagerError::UnreachableResource );
/* (3) On récupère la config sous forme de tableau */
$uploadAuth = json_decode( $uploadAuth, true );
/* (4) Si erreur de PARSAGE */
if( !is_array($uploadAuth) )
return ManagerError::ParsingFailed;
return array( 'error' => ManagerError::ParsingFailed );
/* [2] Vérification du préfixe
=========================================================*/
// Si le préfixe n'est pas dans la config -> erreur
if( !in_array($prefix, $uploadAuth['directories']) )
returnManagerError::UploadError;
return array( 'error' => ManagerError::UploadError );
/* [3] Construction du chemin
=========================================================*/
@ -69,14 +60,62 @@
/* (4) On se place dans le dossier */
chdir( $path );
/* [4] Création du fichier (temporaire->permanent)
/* [4] Gestion du retour
=========================================================*/
return array(
'error' => ManagerError::Success,
'path' => $path.$fileName
);
}
/* EFFECTUE UN UPLOAD D'UN fichier
*
* @prefix<String> Préfixe (dossier parent) du fichier
* @extension<String> Extension du fichier
* @file<FILE> Pointeur vers $_FILES['']
* @tester<Function> Fonction qui renvoie TRUE si le format est correct (en prenant le contenu du fichier en paramètre)
*
* @return error<ManagerError> Retourne l'erreur attestant de l'état de l'upload
*
*/
private static function simpleFile($prefix, $extension, $file, $tester){
/* [1] On récupère le chemin du fichier à créer et vérifie le dossier
=========================================================*/
$pathResponse = self::getPath($prefix, $extension);
// Si une erreur est intervenue, on la retourne
if( $pathResponse['error'] != ManagerError::Success )
return $pathResponse['error'];
/* [2] Vérification du format (via la fonction $tester)
=========================================================*/
/* (1) Si $tester est une fonction, on effectue le test */
if( is_callable($tester) ){
/* (2) Sinon, on vérifie le format */
$file_content = file_get_contents($file['tmp_name']);
/* (3) On retourne 'FormatError' si erreur de format */
if( !$tester($file_content) ) return ManagerError::FormatError;
}
/* [3] Création du fichier (temporaire->permanent)
=========================================================*/
if( move_uploaded_file($file['tmp_name'], $path.$fileName) ){
/* (1) On déplace le fichier avec le nom formel */
if( move_uploaded_file($file['tmp_name'], $pathResponse['path']) ){
// on modifie les droits du fichier
chmod($path.$fileName, 0774);
return ManagerError::Success;
chmod($pathResponse['path'], 0774);
return ManagerError::Success;
/* (2) Si une erreur occure -> 'UploadError' */
}else
return ManagerError::UploadError;
}
@ -86,6 +125,13 @@
/* IMPORT D'UN JOURNAL D'APPEL
*
* @file<FILE> Pointeur vers $_FILES['']
@ -94,9 +140,228 @@
public static function call_log($params){
extract($params);
return array(
'ModuleError' => self::simpleFile('call_log', 'xml', $file)
);
/* [1] Gestion de l'upload du fichier et de la vžérification du format
=========================================================*/
$uploadError = self::simpleFile(
'call_log', // nom du dossier d'upload
'xml', // format du fichier
$file, // Fichier lui-même
function($content){ // Vérification du format du fichier
/* (1) Vérification du format XML */
$xml = simplexml_load_string($content);
if( $xml === false ) return false; // Si erreur de parsage, on retourne une erreur
/* (2) Vérification du contenu (balises) */
// Doit avoir des Item(s)
if( !isset($xml->Item) )
return false;
// Vérification de tous les champs
foreach($xml->Item as $log){
$checkAttributes = isset($log['Id']);
$checkAttributes = $checkAttributes && isset($log['Number']);
$checkAttributes = $checkAttributes && isset($log['Name']);
$checkAttributes = $checkAttributes && isset($log['Date']);
$checkAttributes = $checkAttributes && isset($log['Duration']);
$checkAttributes = $checkAttributes && isset($log['Direction']);
$checkAttributes = $checkAttributes && isset($log['Type']);
// Si on a pas tout les champs, on retourne une erreur
if( !$checkAttributes )
return false;
}
/* (3) Si tout s'est bien passé, le format est bon */
return true;
}
);
/* [2] Gestion du retour (unserialize)
=========================================================*/
/* (1) Si erreur d'upload, on la renvoie */
if( $uploadError != ManagerError::Success )
return array( 'ModuleError' => $uploadError );
/* (2) Gestion du parsage (unserialize) du journal d'appel */
$request = new ModuleRequest('call_log/unserialize', array( 'phone_number' => $phone_number ) );
$response = $request->dispatch();
/* (3) Restitution du retour de `unserialize` */
return array_merge(
array( 'ModuleError' => $response->error ),
$response->getAll()
);
}
/* IMPORT D'UNE SAUVEGARDE DE FORMULAIRE LOCAL
*
* @file<FILE> Pointeur vers $_FILES['']
*
*/
public static function local_data($params){
extract($params);
/* [1] Upload et vérifiaction du format du fichier
=========================================================*/
$uploadError = self::simpleFile(
'local_data', // nom du dossier d'upload
'json', // format du fichier
$file, // Fichier lui-même
function($content){ // Vérification du format du fichier
/* (1) Vérification du format JSON */
$json = json_decode($content, true);
if( $json == null )
return false; // Si erreur de parsage, on retourne une erreur
/* (2) Vérification du contenu de premier niveau */
$checkLevel0 = isset($json['subject']) && is_array($json['subject']);
$checkLevel0 = $checkLevel0 && isset($json['contacts']) && is_array($json['contacts']);
$checkLevel0 = $checkLevel0 && isset($json['mini']) && is_array($json['mini']);
$checkLevel0 = $checkLevel0 && isset($json['fiches']) && is_array($json['fiches']);
$checkLevel0 = $checkLevel0 && isset($json['matrice']) && is_array($json['matrice']);
// Erreur si level 0 incorrect
if( !$checkLevel0 )
return false;
/* (3) Vérification du sujet */
$checkSubject = isset($json['subject']['username']) && is_string($json['subject']['username']);
$checkSubject = $checkSubject && isset($json['subject']['firstname']) && is_string($json['subject']['firstname']);
$checkSubject = $checkSubject && isset($json['subject']['lastname']) && is_string($json['subject']['lastname']);
$checkSubject = $checkSubject && isset($json['subject']['number']) && is_string($json['subject']['number']);
// Erreur des attributs du sujet incorrects ou manquants
if( !$checkSubject )
return false;
/* (4) Vérification des contacts */
foreach($json['contacts'] as $contact){
$checkContact = isset($contact['uid']) && is_numeric($contact['uid']);
$checkContact = $checkContact && isset($contact['username']) && is_string($contact['username']);
$checkContact = $checkContact && isset($contact['firstname']) && is_string($contact['firstname']);
$checkContact = $checkContact && isset($contact['lastname']) && is_string($contact['lastname']);
$checkContact = $checkContact && isset($contact['number']) && ( is_numeric($contact['number']) || is_string($contact['number']) );
$checkContact = $checkContact && isset($contact['sms']) && is_numeric($contact['sms']);
$checkContact = $checkContact && isset($contact['call']) && is_numeric($contact['call']);
$checkContact = $checkContact && isset($contact['countsms']) && is_numeric($contact['countsms']);
$checkContact = $checkContact && isset($contact['countcall']) && is_numeric($contact['countcall']);
// Si erreur des attributs du contact incorrects ou manquants
if( !$checkContact )
return false;
}
/* (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['age']) && is_string($mini['age']);
$checkMini = $checkMini && isset($mini['studies']) && is_string($mini['studies']);
$checkMini = $checkMini && isset($mini['loc']) && is_array($mini['loc']);
// Si erreur des attributs des mini-fiches incorrects ou manquants
if( !$checkMini )
return false;
}
/* (6) Vérification des fiches */
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['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['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['reltypeSpecial']) && is_string($fiches['reltypeSpecial']);
$checkFiche = $checkFiche && isset($fiches['city']) && is_string($fiches['city']);
$checkFiche = $checkFiche && isset($fiches['duration']) && is_array($fiches['duration']);
$checkFiche = $checkFiche && isset($fiches['context']) && is_array($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']);
$checkFiche = $checkFiche && isset($fiches['connectSpecial']) && is_array($fiches['connectSpecial']);
// Si erreur des attributs des fiches incorrects ou manquants
if( !$checkFiche )
return false;
}
/* (7) Vérification de la matrice */
foreach($json['matrice'] as $idA=>$Bs){
$checkMatrice = is_numeric($idA);
if( !is_array($Bs) )
return false;
// Pour chaque relation entre le sujet d'id @idA et le sujet d'id $B
foreach($Bs as $B)
$checkMatrice = $checkMatrice && is_numeric($B);
if( !$checkMatrice )
return false;
}
return true;
}
);
/* [2] Renvoi du contenu du fichier
=========================================================*/
/* (1) Si erreur d'upload, on la renvoie */
if( $uploadError != ManagerError::Success )
return array( 'ModuleError' => $uploadError );
/* (2) On récupère le fichier */
$responsePath = self::getPath('local_data', 'json');
// Si erreur, on la renvoie
if( $responsePath['error'] != ManagerError::Success )
return array( 'ModuleError' => $responsePath['error'] );
// On lit le fichier
$json = json_decode( file_get_contents($responsePath['path']), true );
// Si erreur de parsage, on le retourne
if( $json === false )
return ManagerError::ParsingFailed;
/* (3) On renvoie le contenu du fichier */
return array(
'ModuleError' => ManagerError::Success,
'local_data' => $json
);
}

View File

@ -90,77 +90,58 @@
$checkInput = $checkInput && Database::check('varchar(0,30)', $lastname);
$checkInput = $checkInput && !!strlen($username.$firstname.$lastname); // Pseudo, prénom, ou nom, au moins un n'est pas vide
$checkInput = $checkInput && ( Database::check('id', $id_facebook) || is_null($id_facebook) );
$checkInput = $checkInput && ( Database::check('number', $number) || is_null($number) );
$checkInput = $checkInput && ( Database::check('number', $number) || is_null($number) );
// Si erreur en entree, on retourne FAUX
if( !$checkInput ) return false;
/* [1] On écrit la requête
=========================================================*/
$request_create = 'INSERT INTO sujets(idSujet, pseudo, nom, prenom, id_facebook, telephone) ';
$request_create .= 'VALUES (';
$request_create .= 'DEFAULT, '; // idPersone
$request_create .= strlen($username) ? ':pseudo, ' : 'NULL, '; // pseudo
$request_create .= strlen($lastname) ? ':nom, ' : 'NULL, '; // nom
$request_create .= strlen($firstname) ? ':prenom, ' : 'NULL, '; // prenom
$request_create .= !is_null($id_facebook) ? ':id_facebook, ' : 'NULL, '; // Id facebook
$request_create .= !is_null($number) ? ':number, ' : 'NULL, '; // Numéro de tél
$request_create .= ')';
$request_create_string = 'INSERT INTO sujets(idSujet, pseudo, nom, prenom, id_facebook, telephone) ';
$request_create_string .= 'VALUES (';
$request_create_string .= 'DEFAULT, '; // idPersone
$request_create_string .= strlen($username) ? ':pseudo, ' : 'NULL, '; // pseudo
$request_create_string .= strlen($lastname) ? ':nom, ' : 'NULL, '; // nom
$request_create_string .= strlen($firstname) ? ':prenom, ' : 'NULL, '; // prenom
$request_create_string .= !is_null($id_facebook) ? ':id_facebook, ' : 'NULL, '; // Id facebook
$request_create_string .= !is_null($number) ? ':number, ' : 'NULL, '; // Numéro de tél
// On retire la dernière virgule
$request_create_string = preg_replace('/, ?$/', '', $request_create_string);
$request_create_string .= ')';
/* (1) Si id_facebook NULL */
if( $reference == null ){
// On crée la requête
$request_create = Database::getPDO()->prepare($request_create_string);
// TODO: Finir l'implémentation
$create = Database::getPDO()->prepare("INSERT INTO subjects(id_subject, login, password, mail, reference, permission)
VALUES(DEFAULT, :login, :password, :mail, NULL, :permission)");
$create->execute(array(
':login' => $login,
':password' => $password,
':mail' => $mail,
':permission' => $permission
));
/* (2) Si reference est defini */
}else{
/* [2] On exécute la requête avec les valeurs
=========================================================*/
/* (1) On ajoute les paramètres à ajouter */
$variables = array();
if( strlen($username) ) $variables[':pseudo'] = $username;
if( strlen($lastname) ) $variables[':nom'] = $lastname;
if( strlen($firstname) ) $variables[':prenom'] = $firstname;
if( !is_null($id_facebook) ) $variables[':id_facebook'] = $id_facebook;
if( !is_null($number) ) $variables[':number'] = $number;
$create = Database::getPDO()->prepare("INSERT INTO subjects(id_subject, login, password, mail, reference, permission)
VALUES(DEFAULT, :login, :password, :mail, :reference, :permission)");
$create->execute(array(
':login' => $login,
':password' => $password,
':mail' => $mail,
':reference' => (int) $reference,
':permission' => $permission
));
/* (2) On exécute la requête avec leurs variables utiles uniquement */
$status_created = $request_create->execute($variables);
}
/* [3] Verification de la creation + recuperation id
=========================================================*/
$checkCreate = Database::getPDO()->prepare("SELECT id_subject
FROM subjects
WHERE login = :login
AND password = :password
AND mail = :mail
AND ( reference = :reference OR reference is NULL )
AND permission = :permission");
$checkCreate->execute(array(
':login' => $login,
':password' => $password,
':mail' => $mail,
':reference' => (int) $reference,
':permission' => $permission
));
// Si erreur de création
if( $status_created === false ) return false;
// On recupere l'id du sujet
$id_subject = $checkCreate->fetch();
$id_subject = Database::getPDO()->lastInsertId();
// Si erreur, on retourne FALSE
if( $id_subject === false ) return false;
if( $id_subject == null ) return false;
/* [4] Gestion du retour
=========================================================*/
return $id_subject['id_subject'];
return $id_subject;
}

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 231 KiB

After

Width:  |  Height:  |  Size: 241 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -13,7 +13,7 @@
/* [1] Gestion du cercle des relations
=======================================*/
/* (1) On recupere les donnees */
$getData = new ModuleRequest('charts/network_data');
$getData = new ModuleRequest('chart/network_data');
$answer = $getData->dispatch();
// Si pas d'erreur
@ -25,7 +25,7 @@ $data = $answer->get('data');
/* (2) On recupere le rendu */
$getRender = new ModuleRequest('charts/network_render', array('dataset' => $data));
$getRender = new ModuleRequest('chart/network_render', array('dataset' => $data));
$answer = $getRender->dispatch();
// Si pas d'erreur

View File

@ -38,7 +38,17 @@
<h3 data-n='0' class='color4'>Effacer les données de la dernière enquête</h3>
<span data-space></span>
<h4 class='self color2' data-icon='e'>
<h4 class='self color2' data-icon=''>
<a style='display:none' id='download-target'></a>
<input type='submit' class='primary' id='export-all' value="Sauvegarder l'enquête"><br>
</h4>
<h4 class='self color2' data-icon='u'>
<input type='file' id='local-upload' style='display: none;'>
<input type='submit' class='primary' id='import-all' value='Récupérer une sauvegarde'><br>
</h4>
<h4 class='self color2' data-icon='w'>
<input type='submit' class='primary' id='clear-all' value='Tout effacer'>
</h4>
<span data-space></span>
@ -64,22 +74,28 @@
<span data-space></span>
<h5 data-text="Seuls les fichiers au format XML et spécifiques sont pris en compte."></h5>
<h4 data-icon='u' class='color2'>
<input type='file' id='call_log-import' value='test'>
<input type='file' id='call_log-import'>
<span class='file-input'>Importer un journal d'appels</span>
</h4>
<span data-space></span>
<!-- <span data-tag='OU'></span> -->
<h3 data-n='2' class='color4'>Saisir manuellement les contacts</h3>
<!-- GESTION DE L'AJOUT DES CONTACTS -->
<span data-space></span>
<h5 data-text="Renseigner au moins un des nominatifs pour chaque contact. (pseudo, prénom et/ou nom)"></h5>
<span data-space></span>
<div class='arrow-container line' id='nav-contact'></div>
<article class='contact-panel'>
</article>
<span data-space></span>
<span data-space></span>
<span data-space></span>
@ -94,21 +110,85 @@
</article>
<span data-space></span>
<span data-space></span>
<span data-space></span>
<!-- GESTION DES FICHES RELATIONS -->
<h3 data-n='4' class='color4'>Remplir les fiches relations complètes des contacts les plus contactés</h3>
<!-- NAVIGATION ENTRE LES FICHES -->
<div class='arrow-container line' id='nav-fiche'></div>
<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>
<!-- BOUTON D'ENVOI DU FORMULAIRE -->
<h3 data-n='6' class='color4'>Envoi des données</h3>
<article class='submit-panel'>
<h4>
<input type='submit' class='line' value='Envoyer le formulaire' id='submit-all'>
</h4>
</article>
<article class='relation-panel'>
</article>
</section>
<span data-space></span>

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

@ -1,7 +1,13 @@
var clearAllButton=$("#clear-all"),importCallLog=$('input#call_log-import[type="file"]'),subjectManager,contactManager,miniManager,ficheManager;
function dynamicUpdate(a){var c=a instanceof Element,b=c&&"SPAN"==a.tagName&&"switch-left"==a.className,d=c&&"SPAN"==a.tagName&&"switch-both"==a.className,e=c&&"INPUT"==a.tagName&&"submit"==a.type,c=c&&"SPAN"==a.tagName&&("nav-mini"==a.parentNode.id||"nav-fiche"==a.parentNode.id);if(!(d||b||e||c)&&!0!==a)return!1;d?(console.log("> switch firstname <-> lastname"),b=a.parentNode,a=b.children[3],b=b.children[5],d=a.value,a.value=b.value,b.value=d):b?(console.log("> switch firstname+lastname -> username"),
b=a.parentNode,d=b.children[1],a=b.children[3],b=b.children[5],d.value=a.value+" "+b.value,a.value="",b.value=""):(console.log("> dynamic update"),miniManager.fieldsToStorage(),ficheManager.fieldsToStorage(),contactManager.fieldsToStorage(),miniManager.sync(),ficheManager.sync(),miniManager.storageToFields(),ficheManager.storageToFields(),e&&contactManager.storageToFields())}function checkRadioValue(a){for(var c=0,b=0;b<a.length;b++)!0===a[b].status&&c++;return 1!=c?!1:!0}
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(){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"),$("h4.add-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);importCallLog.addEventListener("change",function(a){api.send({path:"upload/call_log",file:importCallLog.files[0]},function(a){console.log(a);
0==a.ModuleError&&(importCallLog.addClass("active"),a={path:"call_log/unserialize",phone_number:$("#subject_phone_number").value},api.send(a,function(a){console.log(a);if(0==a.ModuleError){for(var d=0;d<a.directory.length;d++){var c=(null===a.directory[d].name?"":a.directory[d].name).split(" ");lsi.set("contacts","form"+d,{uid:d,number:a.directory[d].number,username:1==c.length?c[0]:"",firstname:1<c.length?c[0]:"",lastname:1<c.length?c.splice(1).join(" "):""})}contactManager.storageToFields();dynamicUpdate(!0)}}))})},
!1);clearAllButton.addEventListener("click",function(a){localStorage.clear();reload()},!1)})})})});
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}
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)})})})})});

View File

@ -3,36 +3,38 @@
// contacts -> contient les données de tous les contacts
// mini-fiches -> contient les données de toutes les mini fiches
// fiches -> contient les données de toutes les fiches
// matrice -> contient les relations de la matrice
/* [1] Initialisation des utilitaires et variables
=========================================================*/
/* (1) Bouton pour effacer toutes les données */
var clearAllButton = $('#clear-all');
/* (2) Input de type fichier pour l'import */
var importCallLog = $('input#call_log-import[type="file"]');
/* (3) Initialisation des managers */
=========================================================*
/* (1) Initialisation des managers */
var subjectManager;
var contactManager;
var miniManager;
var ficheManager;
var matriceManager;
/* (4) Fonctions utiles */
// CONSTANTES
var defTrue = {status: true, value: 'on'};
var defFalse = {status: false, value: 'on'};
/* (2) Fonctions utiles */
function dynamicUpdate(target){
/* (0) Vérification de la cohérence de la @target
---------------------------------------------------------*/
var isElement = target instanceof Element;
var isSwitchLeft = isElement && target.tagName == 'SPAN' && target.className == 'switch-left';
var isSwitchBoth = isElement && target.tagName == 'SPAN' && target.className == 'switch-both';
var isSaveButton = isElement && target.tagName == 'INPUT' && target.type == 'submit';
var isSwitchLeft = isElement && target.tagName == 'SPAN' && target.className == 'switch-left';
var isSwitchBoth = isElement && target.tagName == 'SPAN' && target.className == 'switch-both';
var isSaveButton = isElement && target.tagName == 'INPUT' && target.type == 'submit';
var isNavButton = isElement && target.tagName == 'SPAN' && (target.parentNode.id == 'nav-mini' || target.parentNode.id == 'nav-fiche');
var isNavContact = isElement && target.tagName == 'SPAN' && target.parentNode.id == 'nav-contact';
// Si erreur, on retourne une erreur
if( !isSwitchBoth && !isSwitchLeft && !isSaveButton && !isNavButton && target !== true )
if( !isSwitchBoth && !isSwitchLeft && !isSaveButton && !isNavButton && !isNavContact && target !== true )
return false;
/* (1) Gestion de l'échange de nom/prénom
@ -44,8 +46,8 @@ function dynamicUpdate(target){
var currentForm = target.parentNode;
/* (2) On récupère Nom et Prénom */
var firstname = currentForm.children[3];
var lastname = currentForm.children[5];
var firstname = currentForm.children[8];
var lastname = currentForm.children[10];
/* (3) On échange leurs valeurs */
var tmp = firstname.value;
@ -61,11 +63,16 @@ function dynamicUpdate(target){
var currentForm = target.parentNode;
/* (2) On récupère Pseudo, Nom et Prénom */
var username = currentForm.children[1];
var firstname = currentForm.children[3];
var lastname = currentForm.children[5];
var username = currentForm.children[6];
var firstname = currentForm.children[8];
var lastname = currentForm.children[10];
/* (3) On attribue à Pseudo, la valeur de Prénom+Nom */
/* (3) Vérification de la validité */
// Si pseudo pas vide, ou nom et prenom vide -> on ne fais rien
if( username.value.length > 0 || firstname.value.length == 0 && lastname.value.length == 0 )
return false;
/* (4) On attribue à Pseudo, la valeur de Prénom+Nom */
username.value = firstname.value +' '+ lastname.value;
firstname.value = '';
lastname.value = '';
@ -85,23 +92,30 @@ function dynamicUpdate(target){
/* (3) On enregistre les CONTACTS */
contactManager.fieldsToStorage();
/* (4) On synchronise les MINI avec les CONTACTS */
/* (4) On enregistre la MATRICE */
matriceManager.fieldsToStorage();
/* (5) On synchronise les MINI avec les CONTACTS */
miniManager.sync();
/* (5) On synchronise les FICHE avec les CONTACTS */
/* (6) 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 affiche le tout */
/* (7) On affiche le tout */
miniManager.storageToFields();
ficheManager.storageToFields();
matriceManager.storageToFields();
/* (7) On met à jour les contacts si on les a modifié */
if( isSaveButton )
/* (8) On met à jour les contacts si on les a modifié on si on navigue dans les contacts */
if( isSaveButton || isNavContact )
contactManager.storageToFields();
}
}
// Vérifie qu'une seule valeur vaut TRUE et les autres false
// 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++ )
@ -136,8 +150,9 @@ function checkRadioValue(selectData){
=========================================================*/
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-mini.js', function(){
include('/js/includes/input-phone-fiche.js', function(){
include('/js/includes/input-phone-matrice.js', function(){
/* (1) Gestion du formulaire du sujet
@ -163,7 +178,7 @@ include('/js/includes/input-phone-fiche.js', function(){
/* (1) On crée une instance du gestionnaire des CONTACTS */
contactManager = new inputPhoneContact(
$('article.contact-panel'),
$('h4.add-contact')
$('#nav-contact')
);
/* (2) On le démarre */
@ -195,119 +210,283 @@ include('/js/includes/input-phone-fiche.js', function(){
ficheManager.attach(dynamicUpdate);
/* (5) Gestion de l'import du fichier
/* (5) Gestion de la matrice de relations
---------------------------------------------------------*/
importCallLog.addEventListener('change', function(e){
/* (1) On crée une instance du gestionnaire de la matrice */
matriceManager = new inputPhoneMatrice(
$('article.matrice-panel')
);
/* (2) On le démarre */
matriceManager.attach(dynamicUpdate);
/* (6) Gestion de l'import du fichier
---------------------------------------------------------*/
// On vide l'input de type 'file' quand on clique
$('input#call_log-import[type="file"]').addEventListener('click', function(e){
e.target.value = null;
}, false);
// Gestion de l'upload
$('input#call_log-import[type="file"]').addEventListener('change', function(e){
/* (1) On rédige la requête */
var uploadRequest = {
path: 'upload/call_log',
file: importCallLog.files[0]
var request = {
path: 'upload/call_log',
phone_number: $('#subject_phone_number').value,
file: e.target.files[0]
};
/* (2) On effectue l'upload (import) */
api.send(uploadRequest, function(uploadResponse){
console.log(uploadResponse);
api.send(request, function(response){
console.log(response);
// Si tout est bon, on met l'input en bleu
if( uploadResponse.ModuleError == 0 ){
importCallLog.addClass('active');
/* (3) On rédige la requête pour récupérer les données du fichier */
var callLogRequest = {
path: 'call_log/unserialize',
phone_number: $('#subject_phone_number').value
};
/* (4) On effectue la récupération d'informations */
api.send(callLogRequest, function(dataResponse){
console.log(dataResponse);
// Si erreur, on quitte
if( dataResponse.ModuleError != 0 )
return;
// Si erreur, on quitte
if( response.ModuleError != 0 )
return;
/* (5) Pour chaque contact de l'annuaire, on ajoute un contact */
for( var i = 0 ; i < dataResponse.directory.length ; i++ ){
var uid = 0; // Contiendra l'uid des contacts
// On découpe le nom par espaces
var name = dataResponse.directory[i].name===null ? '' : dataResponse.directory[i].name;
var splitted = name.split(' ');
/* (3) On récupère les contacts les plus APPELLÉS */
var most_called = [];
for( var i = 0 ; i < response.calls.length && i < 10 ; i++ )
most_called.push( response.calls[i].number );
lsi.set('contacts', 'form'+i, {
uid: i,
number: dataResponse.directory[i].number,
username: splitted.length == 1 ? splitted[0] : '', // Si un seul mot -> pseudo
firstname: splitted.length > 1 ? splitted[0] : '', // Si plusieurs mots -> le 1er est le prénom
lastname: splitted.length > 1 ? splitted.splice(1).join(' ') : '' // et les autres sont le nom
});
}
/* (4) On crée les 10 contacts les plus APPELÉS */
for( var i = 0 ; i < most_called.length ; i++ ){
var splittedName = response.directory[most_called[i]].name.split(' ');
/* (6) On met à jour l'affichage */
contactManager.storageToFields();
dynamicUpdate(true);
lsi.set('contacts', uid, {
uid: uid,
number: most_called[i],
username: splittedName.length == 1 ? splittedName[0] : '', // Si un seul mot -> pseudo
firstname: splittedName.length > 1 ? splittedName[0] : '', // Si plusieurs mots -> le 1er est le prénom
lastname: splittedName.length > 1 ? splittedName.splice(1).join(' ') : '', // et les autres sont le nom
countsms: response.directory[most_called[i]].sms, // Nombre de sms
countcall: response.directory[most_called[i]].calls, // Nombre d'appels
call: i, // classement dans le top 10 des APPELS
sms: -1 // classement dans le top 10 des SMS
});
uid++;
}
/* (5) On récupère les contacts les plus SMSÉS */
var most_sms = [];
for( var i = 0 ; i < response.sms.length && i < 10 ; i++ )
most_sms.push( response.sms[i].number );
/* (6) On crée les 10 contacts les plus SMSÉS */
for( var i = 0 ; i < most_sms.length ; i++ ){
// Si le contact est déja dans le top 10 des appels, on lui ajoute juste le classement dans le top 10 des SMS
var callIndex = most_called.indexOf(most_sms[i]);
if( callIndex > -1 ){
var created = lsi.get('contacts', callIndex);
created.sms = i;
lsi.set('contacts', callIndex, created);
continue;
}
var splittedName = response.directory[most_sms[i]].name.split(' ');
lsi.set('contacts', uid, {
uid: uid,
number: most_sms[i],
username: splittedName.length == 1 ? splittedName[0] : '', // Si un seul mot -> pseudo
firstname: splittedName.length > 1 ? splittedName[0] : '', // Si plusieurs mots -> le 1er est le prénom
lastname: splittedName.length > 1 ? splittedName.splice(1).join(' ') : '', // et les autres sont le nom
countsms: response.directory[most_sms[i]].sms, // Nombre de sms
countcall: response.directory[most_sms[i]].calls, // Nombre d'appels
call: -1, // classement dans le top 10 des APPELS
sms: i // classement dans le top 10 des SMS
});
uid++;
}
/* (7) Pour chaque contact qui n'est pas dans le top 10, on l'ajoute */
for( var number in response.directory ){
// Si dans top 10 des APPELS, on ne l'ajoute pas
if( most_called.indexOf(number) > -1 )
continue;
// Si dans top 10 des SMS, on ne l'ajoute pas
if( most_sms.indexOf(number) > -1 )
continue;
// On découpe le nom par espaces
var name = response.directory[number].name===null ? '' : response.directory[number].name;
var splittedName = name.split(' ');
lsi.set('contacts', uid, {
uid: uid,
number: number,
username: splittedName.length == 1 ? splittedName[0] : '', // Si un seul mot -> pseudo
firstname: splittedName.length > 1 ? splittedName[0] : '', // Si plusieurs mots -> le 1er est le prénom
lastname: splittedName.length > 1 ? splittedName.splice(1).join(' ') : '', // et les autres sont le nom
countsms: response.directory[number].sms, // Nombre de sms
countcall: response.directory[number].calls, // Nombre d'appels
call: -1,
sms: -1
});
uid++;
}
/* (8) On met à jour l'affichage */
contactManager.storageToFields();
dynamicUpdate(true);
});
}, false);
/* (6) Gestion de l'effacement des données locales
/* (7) Gestion de l'effacement des données locales
---------------------------------------------------------*/
clearAllButton.addEventListener('click', function(e){
localStorage.clear();
reload();
$('#clear-all').addEventListener('click', function(e){
/* (1) On vide tous les dataset de données */
lsi.clear('subject');
lsi.clear('contacts');
lsi.clear('mini-fiches');
lsi.clear('fiches');
lsi.clear('matrice');
/* (2) On met à jour l'affichage */
subjectManager.storageToFields();
contactManager.storageToFields();
miniManager.storageToFields();
ficheManager.storageToFields();
matriceManager.storageToFields();
}, false);
}) }) }) });
/* (8) Gestion de l'export des données locales
---------------------------------------------------------*/
$('#export-all').addEventListener('click', function(e){
/* (1) On construit les données */
var data = {
subject: lsi.export('subject')[0],
contacts: lsi.export('contacts'),
mini: lsi.export('mini-fiches'),
fiches: lsi.export('fiches'),
matrice: lsi.export('matrice')[0]
};
/* (2) On lance le téléchargement */
var downloadTarget = $('#download-target'); // On récupère le lien (<a>) caché qui fera le téléchargement
downloadTarget.download = 'local-data.json'; // Nom du fichier qui sera téléchargé
downloadTarget.href = 'data:application/octet-stream,' + encodeURIComponent(JSON.stringify(data)); // Contenu
downloadTarget.click(); // On lance le téléchargement
}, false);
// ETAPE 1 : INITIALISATION (ON RESTAURE LES DONNEES)
// 1. contact.storageToFields();
// 2. contact.add();
// 3. mini.storageToFields();
// 4. fiche.storageToFields();
/* (9) Gestion de l'import des données locales
---------------------------------------------------------*/
// Le bouton lance l'<input> file
$('#import-all').addEventListener('click', function(e){
$('#local-upload').click();
}, false);
// ETAPE 2 : ENREGISTREMENT + MISE À JOUR
// 1. mini.fieldsToStorage();
// 2. fiche.fieldsToStorage();
// 3. contact.fieldsToStorage();
// 4. mini.sync();
// 5. fiche.sync();
// On vide l'input de type 'file' quand on clique
$('#local-upload').addEventListener('click', function(e){
e.target.value = null;
}, false);
// Gestion de l'upload d'une sauvegarde de formulaire local
$('#local-upload').addEventListener('change', function(e){
/* (1) Rédaction de la requête d'upload */
var request = {
path: 'upload/local_data',
file: $('#local-upload').files[0]
};
/* (2) Upload et réponse */
api.send(request, function(response){
console.log(response);
// Si erreur, on quitte
if( response.ModuleError != 0 )
return false;
console.log(response.local_data.matrice);
/* (3) On enregistre les données dans le 'localStorage' */
lsi.set('subject', 0, response.local_data.subject);
lsi.import('contacts', response.local_data.contacts);
lsi.import('mini-fiches', response.local_data.mini);
lsi.import('fiches', response.local_data.fiches);
lsi.set('matrice', 0, response.local_data.matrice);
/* (3) On met à jour l'affichage */
subjectManager.storageToFields();
contactManager.storageToFields();
matriceManager.storageToFields();
dynamicUpdate(true);
});
}, false);
/* (10) Gestion de la validation et de l'envoi des données
---------------------------------------------------------*/
$('#submit-all').addEventListener('click', function(e){
console.log('> GATHERING ALL DATA');
/* (1) On met dans la mémoire tout les champs non enregistrés */
subjectManager.fieldsToStorage();
contactManager.fieldsToStorage();
miniManager.fieldsToStorage();
ficheManager.fieldsToStorage();
/* (2) On prépare la requête avec toutes les données */
var request = {
path: 'input/phone',
subject: lsi.export('subject')[0],
contacts: lsi.export('contacts'),
mini: lsi.export('mini-fiches'),
fiches: lsi.export('fiches')
};
/* (3) On envoie la requête et traite la réponse */
api.send(request, function(response){
console.log(response);
}, false);
}, false);
// var number = $('input.number[type="text"]');
// ic.append(number, format_number, '06 06 06 06 06');
// // format_number -> format pour les numéros de téléphones
//
// number.addEventListener('keyup', function(e){
// ic.correct(number, false);
// }, false);
}); }); }); }); });