Commit 2146d35af4dd1119bd2fb6dc22c625d65257cc96

Authored by Geoffrey PREUD'HOMME
1 parent cbd06cbb

Vue interactive

Showing 3 changed files with 90 additions and 46 deletions   Show diff stats
@@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
17 ], 17 ],
18 "dependencies": { 18 "dependencies": {
19 "Materialize": "materialize#^0.97.6", 19 "Materialize": "materialize#^0.97.6",
20 - "material-design-icons": "^2.2.3" 20 + "material-design-icons": "^2.2.3",
  21 + "vue": "^1.0.21"
21 } 22 }
22 } 23 }
@@ -14,12 +14,25 @@ @@ -14,12 +14,25 @@
14 14
15 <body> 15 <body>
16 <!-- Réutilisable --> 16 <!-- Réutilisable -->
  17 + <div id="modalErreur" class="modal">
  18 + <div class="modal-content">
  19 + <h4>{{ erreurTitre }}</h4>
  20 + <p v-if="modalGeneriqueContenu">{{ erreurMessage }}</p>
  21 + </div>
  22 + <div class="modal-footer">
  23 + <a class="modal-action modal-close waves-effect btn-flat">Ça marche</a>
  24 + </div>
  25 + </div>
17 <!-- Page --> 26 <!-- Page -->
18 <nav class="red" role="navigation"> 27 <nav class="red" role="navigation">
19 <div class="nav-wrapper container"> 28 <div class="nav-wrapper container">
20 - <a id="logo-container" href="#" class="brand-logo">10⁵</a> 29 + <a id="logo-container" href="#" class="brand-logo">{{ nomApplication }}</a>
21 <ul class="right hide-on-med-and-down"> 30 <ul class="right hide-on-med-and-down">
22 - <li><a class="dropdown-button" href="#!" data-activates="menuUtilisateur"><i class="material-icons">perm_identity</i> vigou (<i class="material-icons">timer</i> 3:12)</a></li> 31 + <li v-if="connecte">
  32 + <a class="dropdown-button" href="#!" data-activates="menuUtilisateur">
  33 + <i class="material-icons">perm_identity</i> {{ login }} (<i class="material-icons">timer</i> {{ timer }})
  34 + </a>
  35 + </li>
23 </ul> 36 </ul>
24 <ul id="nav-mobile" class="side-nav"> 37 <ul id="nav-mobile" class="side-nav">
25 <li><a href="#">TODO</a></li> 38 <li><a href="#">TODO</a></li>
@@ -31,28 +44,30 @@ @@ -31,28 +44,30 @@
31 <div class="container"> 44 <div class="container">
32 <br><br><br> 45 <br><br><br>
33 <h4>Se connecter</h4> 46 <h4>Se connecter</h4>
34 - <h4>Avec votre identifiant et votre mot de passe</h4> 47 + <h5>Avec votre identifiant et votre mot de passe</h5>
35 <div class="row"> 48 <div class="row">
36 <form class="col s12"> 49 <form class="col s12">
37 <div class="row"> 50 <div class="row">
38 <div class="input-field col s12"> 51 <div class="input-field col s12">
39 - <input type="text" id="login"> 52 + <input type="text" name="login" v-model="login">
40 <label for="login">Identifiant</label> 53 <label for="login">Identifiant</label>
41 </div> 54 </div>
42 </div> 55 </div>
43 <div class="row"> 56 <div class="row">
44 <div class="input-field col s12"> 57 <div class="input-field col s12">
45 - <input type="password" id="mdp"> 58 + <input type="password" name="mdp" v-model="mdp">
46 <label for="mdp">Mot de passe</label> 59 <label for="mdp">Mot de passe</label>
47 </div> 60 </div>
48 </div> 61 </div>
49 <div class="row"> 62 <div class="row">
50 - <a href="#!" id="connecter" class="btn-large waves-effect waves-light">Se connecter</a> 63 + <a href="#!" class="btn-large waves-effect waves-light disabled" @click="connecter" :class="{'disabled': !peutConnecter}">Se connecter</a>
51 </div> 64 </div>
52 </form> 65 </form>
53 </div> 66 </div>
54 - <h5>Avec votre carte étudiant</h5>  
55 - <p>Passez-la simplement devant le lecteur</p> 67 + <div v-if="peutNFC">
  68 + <h5>Avec votre carte étudiant</h5>
  69 + <p>Passez-la simplement devant le lecteur</p>
  70 + </div>
56 </div> 71 </div>
57 </div> 72 </div>
58 </div> 73 </div>
@@ -68,6 +83,7 @@ @@ -68,6 +83,7 @@
68 <!-- Scripts--> 83 <!-- Scripts-->
69 <script src="lib/jquery/dist/jquery.min.js"></script> 84 <script src="lib/jquery/dist/jquery.min.js"></script>
70 <script src="lib/Materialize/dist/js/materialize.min.js"></script> 85 <script src="lib/Materialize/dist/js/materialize.min.js"></script>
  86 + <script src="lib/vue/dist/vue.min.js"></script>
71 <script src="js/init.js"></script> 87 <script src="js/init.js"></script>
72 88
73 </body> 89 </body>
@@ -9,53 +9,80 @@ var TRANSACTION_VIDANGE = 4 @@ -9,53 +9,80 @@ var TRANSACTION_VIDANGE = 4
9 9
10 var TRANSACTION_DUREE = 60 10 var TRANSACTION_DUREE = 60
11 11
12 -// Informations de connexion  
13 -  
14 -var login, droit, jeton, debut;  
15 -  
16 // Fonctions pour Materialize 12 // Fonctions pour Materialize
17 $(function(){ 13 $(function(){
18 $('.button-collapse').sideNav(); 14 $('.button-collapse').sideNav();
19 $('.modal-trigger').leanModal() 15 $('.modal-trigger').leanModal()
20 -}); // end of document ready 16 +});
21 17
22 -// Fonctions communes 18 +// Application
23 19
24 -function APIbrute(chemin, donnees, cb) {  
25 - var url = "api/" + chemin;  
26 - $.post(url, donnees, function(data) {  
27 - cb(data['status'], data);  
28 - }) 20 +var app = new Vue({
  21 + el: 'body',
  22 + data: {
  23 + nomApplication: "10⁵",
  24 + connecte: false,
  25 + erreurTitre: '',
  26 + erreurMessage: '',
  27 + date: 1,
  28 + },
  29 + methods: {
  30 + // API
  31 + apiBrute: function(chemin, donnees, cb) {
  32 + $.post('api/' + chemin, donnees, function(data) {
  33 + cb(data['status'], data);
  34 + })
  35 + },
  36 + // Affichage
  37 + toast: function(texte) {
  38 + Materialize.toast(texte, 4000);
  39 + },
  40 + erreur: function(retour, donnees) {
  41 + this.erreurTitre = retour
  42 + this.erreurMessage = donnees['message']
  43 + $("#modalErreur").openModal();
  44 + },
  45 + // Fonctionnement
  46 + connecter: function() {
  47 + if (!this.peutConnecter) return
  48 + var that = this;
  49 + this.apiBrute("utilisateur/connexion", {login: this.login , mdp: this.mdp} , function(retour, donnees) {
  50 + that.mdp = ''
  51 + switch(retour) {
  52 + case "ok":
  53 + that.login = donnees.login
  54 + that.droit = donnees.droit
  55 + that.jeton = donnees.jeton
  56 + that.connecte = that.date
  57 + that.toast("Correctement identifié en tant que " + that.login + " pour 10 minutes")
  58 + break;
29 59
30 -} 60 + case "identifiants_invalides":
  61 + that.toast("Identifiants invalides")
  62 + break;
31 63
32 -function toast(texte) {  
33 - Materialize.toast(texte, 4000);  
34 -}  
35 -  
36 -// Connexion  
37 -$("#connecter").click(function() {  
38 - var login = $("#login").val();  
39 - var mdp = $("#mdp").val();  
40 - APIbrute("utilisateur/connexion", {login: login , mdp: mdp} , function(retour, donnees) {  
41 - switch(retour) {  
42 - case "identifiants_invalides":  
43 - toast("Identifiants invalides")  
44 - break; 64 + default:
  65 + that.erreur(retour, donnees);
  66 + break;
  67 + }
  68 + })
  69 + },
  70 + },
  71 + computed: {
  72 + peutConnecter: function() {
  73 + return this.login && this.mdp;
  74 + },
  75 + timer: function() {
  76 + var secondes = this.connecte + JETON_DUREE - this.date
  77 + return Math.floor(secondes/60) + ':' + (secondes % 60)
  78 + }
  79 + },
  80 +})
45 81
46 - case "ok":  
47 - login = donnees.login;  
48 - droit = donnees.droit;  
49 - jeton = donnees.jeton;  
50 - toast("Correctement identifié en tant que " + login + " pour 10 minutes")  
51 - break; 82 +setInterval(function actualiserDate() {
  83 + app.$data.date = Math.floor(Date.now()/1000)
  84 +}, 1000);
52 85
53 - default:  
54 - toast("Erreur interne");  
55 - break;  
56 - }  
57 - });  
58 -});  
59 86
60 // Placeholder 87 // Placeholder
61 function vendu() { 88 function vendu() {