Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 

89 rader
3.4 KiB

  1. // assets/scripts/registration.js
  2. import { esc, createTranslator } from './utils.js';
  3. const t = createTranslator('Register');
  4. document.addEventListener('DOMContentLoaded', () => {
  5. const form = document.getElementById('register-form');
  6. const companyInput = document.getElementById('companyName');
  7. const slugPreview = document.getElementById('slug-preview');
  8. const submitBtn = document.getElementById('submit-btn');
  9. const errorBox = document.getElementById('register-errors');
  10. const appDomain = window.Register?.appDomain ?? '';
  11. // ── Slug-Vorschau ─────────────────────────────────────────────────────────
  12. let debounceTimer = null;
  13. companyInput?.addEventListener('input', () => {
  14. clearTimeout(debounceTimer);
  15. debounceTimer = setTimeout(async () => {
  16. const value = companyInput.value.trim();
  17. if (!value) { slugPreview.textContent = ''; return; }
  18. try {
  19. const res = await fetch('/api/register/preview-slug', {
  20. method: 'POST',
  21. headers: { 'Content-Type': 'application/json' },
  22. body: JSON.stringify({ companyName: value }),
  23. });
  24. const data = await res.json();
  25. slugPreview.textContent = data.slug ? data.slug + '.' + appDomain : '–';
  26. } catch {
  27. slugPreview.textContent = '';
  28. }
  29. }, 350);
  30. });
  31. // ── Formular absenden ─────────────────────────────────────────────────────
  32. form?.addEventListener('submit', async (e) => {
  33. e.preventDefault();
  34. errorBox.innerHTML = '';
  35. submitBtn.disabled = true;
  36. submitBtn.textContent = t('sending');
  37. const payload = {
  38. companyName: document.getElementById('companyName').value,
  39. email: document.getElementById('email').value,
  40. firstName: document.getElementById('firstName').value,
  41. lastName: document.getElementById('lastName').value,
  42. password: document.getElementById('password').value,
  43. passwordRepeat: document.getElementById('passwordRepeat').value,
  44. };
  45. try {
  46. const res = await fetch('/api/register', {
  47. method: 'POST',
  48. headers: { 'Content-Type': 'application/json' },
  49. body: JSON.stringify(payload),
  50. });
  51. const data = await res.json();
  52. if (res.ok) {
  53. const text = t('successText').replace('%email%', `<strong>${esc(payload.email)}</strong>`);
  54. document.querySelector('.register-page').innerHTML = `
  55. <div class="register-success">
  56. <div class="register-success__icon">✓</div>
  57. <h2 class="register-success__title">${t('successTitle')}</h2>
  58. <p class="register-success__text">${text}</p>
  59. <p class="register-success__hint">${t('successHint')}</p>
  60. </div>
  61. `;
  62. } else {
  63. (data.errors ?? [t('errorUnknown')]).forEach(msg => {
  64. const p = document.createElement('p');
  65. p.textContent = msg;
  66. errorBox.appendChild(p);
  67. });
  68. submitBtn.disabled = false;
  69. submitBtn.textContent = t('btnSubmit');
  70. }
  71. } catch {
  72. errorBox.innerHTML = `<p>${esc(t('errorConnection'))}</p>`;
  73. submitBtn.disabled = false;
  74. submitBtn.textContent = t('btnSubmit');
  75. }
  76. });
  77. });