script.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. $(document).ready(function() {
  2. // Si vous vous demandez pourquoi on fait ça...
  3. // https://stackoverflow.com/questions/16284724/what-does-var-app-app-do
  4. window.MyApp = window.MyApp || {};
  5. function markInputAsValid( input ) {
  6. // Utiliser les classes Bootstrap .is-valid et .is-invalid
  7. input
  8. .addClass('is-valid')
  9. .removeClass('is-invalid');
  10. // On va se servir de l'id pour le sélecteur suivant
  11. // (balise small adjacente au champ input)
  12. var inputId = input.attr( 'id' );
  13. $( '#' + inputId + ' + small' )
  14. .removeClass( 'show' );
  15. }
  16. function markInputAsInvalid( input, message ) {
  17. input
  18. .addClass('is-invalid')
  19. .removeClass('is-valid');
  20. var inputId = input.attr( 'id' );
  21. console.log( inputId, $( '#' + inputId + ' + small' ), message );
  22. $( '#' + inputId + ' + small' )
  23. .addClass( 'show' )
  24. .html( message );
  25. }
  26. // Paramètres pour les envois par AJAX
  27. $.ajaxSetup({
  28. headers: {
  29. 'content-type': 'application/json'
  30. }
  31. });
  32. // Gestion des erreurs
  33. $( document ).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
  34. var data = JSON.parse(jqXHR.responseText);
  35. window.MyApp.alert( 'danger', data.message );
  36. });
  37. $('#register-username')
  38. .change(function(e) {
  39. var inputUsername = $(this);
  40. var username = inputUsername.val();
  41. var re = /^[A-Za-z][A-Za-z0-9_]+$/;
  42. var isUsernameValid = username.match(re);
  43. if(! isUsernameValid) {
  44. markInputAsInvalid( inputUsername,
  45. "L'identifiant doit commencer par une lettre, et être suivi par " +
  46. "au moins une lettre OU un chiffre OU un tiret bas _"
  47. );
  48. return;
  49. }
  50. // Envoi d'une requête AJAX vers une URL qui va nous renvoyer un
  51. // objet JSON avec un booléen "success" qui va nous dire si le username
  52. // est disponible (true) ou non (false)
  53. $.get(
  54. 'http://localhost:3000/jquery/ajax/username-check?username=' + username,
  55. function(response) {
  56. console.log(response.success)
  57. if(response.success) {
  58. markInputAsValid( inputUsername );
  59. }
  60. else {
  61. markInputAsInvalid( inputUsername, "Cet identifiant est déjà pris" );
  62. }
  63. }
  64. );
  65. });
  66. $('#register-email')
  67. .change(function(e) {
  68. var inputEmail = $(this);
  69. var email = inputEmail.val();
  70. var re = /^[A-Za-z][A-Za-z0-9_\.]+@[A-Za-z][A-Za-z0-9_\.]+\.[a-z]{2,}$/;
  71. var isEmailValid = email.match(re);
  72. if(! isEmailValid) {
  73. markInputAsInvalid( inputEmail );
  74. return;
  75. }
  76. // Même chose que pour le username, cette fois avec l'email
  77. $.get(
  78. 'http://localhost:3000/jquery/ajax/email-check?email=' + email,
  79. function(response) {
  80. console.log(response.success)
  81. if(response.success) {
  82. markInputAsValid( inputEmail );
  83. }
  84. else {
  85. markInputAsInvalid( inputEmail, "Cet e-mail est déjà pris" );
  86. }
  87. }
  88. );
  89. });
  90. $('#register-password')
  91. .change(function(e) {
  92. var inputPassword = $(this);
  93. var password = inputPassword.val();
  94. if(password.length < 4) {
  95. markInputAsInvalid( inputPassword, "Mot de passe trop court (4 caractères minimum" );
  96. return;
  97. }
  98. markInputAsValid( inputPassword );
  99. });
  100. // Soumission du formulaire d'inscription vers le serveur
  101. $('#form-register').submit(function(e) {
  102. var inputs = $(this).find('input');
  103. var emptyOrInvalid = [];
  104. inputs.each( function( index, elem ) {
  105. var input = $( this );
  106. if( ! input.val() || ! input.hasClass( 'is-valid' ) ) {
  107. emptyOrInvalid.push( input.siblings( 'label' ).html() );
  108. }
  109. } );
  110. // Si au moins un champ est vide ou n'a pas is-valid
  111. // on notifie et on interrompt par return
  112. if( emptyOrInvalid.length ) {
  113. var message = emptyOrInvalid.length + ' champs vides ou ' +
  114. 'invalides :<br>' + emptyOrInvalid.join(', ');
  115. MyApp.alert( 'danger', message );
  116. return false;
  117. }
  118. // Dans chaque itération input[i] est un élément DOM
  119. var username = $('#register-username').val();
  120. var email = $('#register-email').val();
  121. var password = $('#register-password').val();
  122. var user = {
  123. username: username,
  124. email: email,
  125. password: password
  126. };
  127. var userJSON = JSON.stringify(user);
  128. console.log(user);
  129. console.log(userJSON);
  130. e.preventDefault();
  131. inputs.val('').removeClass('is-valid');
  132. $.post(
  133. '/jquery/ajax/register',
  134. userJSON,
  135. function(data) {
  136. window.MyApp.alert( 'success', 'Bienvenue, ' + data.user.username );
  137. },
  138. 'json'
  139. );
  140. })
  141. $('#form-login').submit(function(e) {
  142. var identifier = $('#login-identifier').val();
  143. var password = $('#login-password').val();
  144. var user = {
  145. identifier: identifier,
  146. password: password
  147. };
  148. var userJSON = JSON.stringify(user);
  149. e.preventDefault();
  150. $(this).find('input').val('');
  151. $.post(
  152. '/jquery/ajax/login',
  153. userJSON,
  154. function(data) {
  155. MyApp.alert('success', "Vous êtes identifié, " + data.user.username);
  156. },
  157. 'json'
  158. );
  159. })
  160. var onglets = $('#onglets li a');
  161. onglets.click(function(e) {
  162. var link = $(this);
  163. onglets.removeClass('active');
  164. link.addClass('active');
  165. var idPanneau = link.data('tab-id');
  166. $('.tab').hide();
  167. $('#' + idPanneau).show();
  168. });
  169. });