Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

96 lignes
3.3 KiB

  1. {# templates/registration/find_account.html.twig #}
  2. <!DOCTYPE html>
  3. <html lang="de">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>{{ 'app.find_account.page_title'|trans }}</title>
  8. {{ encore_entry_link_tags('app') }}
  9. </head>
  10. <body class="register-body">
  11. {% embed '_components/register-card.html.twig' %}
  12. {% block content %}
  13. <div class="register-card__brand">
  14. <a href="{{ path('app_home') }}">spawntree Timetracker</a>
  15. </div>
  16. <h1 class="register-card__title">{{ 'app.find_account.title'|trans }}</h1>
  17. <p class="register-card__sub">{{ 'app.find_account.subtitle'|trans }}</p>
  18. <div id="find-account-error" class="register-errors" role="alert"></div>
  19. <form id="find-account-form" novalidate>
  20. <div class="register-field">
  21. <label class="register-field__label" for="account-slug">{{ 'app.find_account.label_slug'|trans }}</label>
  22. <div class="find-account-input">
  23. <input class="input find-account-input__field"
  24. type="text"
  25. id="account-slug"
  26. name="slug"
  27. placeholder="{{ 'app.find_account.placeholder_slug'|trans }}"
  28. autocomplete="off"
  29. autocapitalize="none"
  30. spellcheck="false"
  31. autofocus
  32. required />
  33. <span class="find-account-input__suffix">.{{ appDomain }}</span>
  34. </div>
  35. </div>
  36. <div class="register-actions">
  37. <button type="submit" class="btn btn-primary register-actions__submit">
  38. {{ 'app.find_account.btn_submit'|trans }}
  39. </button>
  40. <p class="register-actions__login">
  41. {{ 'app.find_account.no_account'|trans }} <a href="{{ path('app_register') }}">{{ 'app.find_account.link_register'|trans }}</a>
  42. </p>
  43. </div>
  44. </form>
  45. {% endblock %}
  46. {% endembed %}
  47. <script>
  48. document.getElementById('find-account-form').addEventListener('submit', function(e) {
  49. e.preventDefault();
  50. var slug = document.getElementById('account-slug').value.trim().toLowerCase();
  51. var errorEl = document.getElementById('find-account-error');
  52. var btn = document.querySelector('.register-actions__submit');
  53. errorEl.textContent = '';
  54. if (!slug) {
  55. errorEl.innerHTML = '<p>{{ 'app.find_account.error_empty'|trans }}</p>';
  56. return;
  57. }
  58. if (!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(slug)) {
  59. errorEl.innerHTML = '<p>{{ 'app.find_account.error_invalid'|trans }}</p>';
  60. return;
  61. }
  62. btn.disabled = true;
  63. fetch('/api/check-slug', {
  64. method: 'POST',
  65. headers: { 'Content-Type': 'application/json' },
  66. body: JSON.stringify({ slug: slug }),
  67. })
  68. .then(function(r) { return r.json(); })
  69. .then(function(data) {
  70. if (data.exists) {
  71. window.location.href = 'https://' + slug + '.{{ appDomain }}/login';
  72. } else {
  73. errorEl.innerHTML = '<p>{{ 'app.find_account.error_not_found'|trans }}</p>';
  74. btn.disabled = false;
  75. }
  76. })
  77. .catch(function() {
  78. errorEl.innerHTML = '<p>{{ 'app.find_account.error_not_found'|trans }}</p>';
  79. btn.disabled = false;
  80. });
  81. });
  82. </script>
  83. </body>
  84. </html>