Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 

116 Zeilen
5.1 KiB

  1. // account.js
  2. document.addEventListener('DOMContentLoaded', () => {
  3. const toast = document.getElementById('account-toast');
  4. function showToast(msg, isError = false) {
  5. toast.textContent = msg;
  6. toast.classList.toggle('account-toast--error', isError);
  7. toast.classList.add('account-toast--visible');
  8. setTimeout(() => toast.classList.remove('account-toast--visible'), 3000);
  9. }
  10. async function patchJson(url, data) {
  11. const res = await fetch(url, {
  12. method: 'PATCH',
  13. headers: { 'Content-Type': 'application/json' },
  14. body: JSON.stringify(data),
  15. });
  16. const json = await res.json();
  17. if (!res.ok) throw new Error(json.error ?? 'Fehler');
  18. return json;
  19. }
  20. // ── Account-Formular ──────────────────────────────────────────────────────
  21. const btnAccountSave = document.getElementById('btn-account-save');
  22. if (btnAccountSave) {
  23. btnAccountSave.addEventListener('click', async () => {
  24. try {
  25. await patchJson('/api/account', {
  26. name: document.getElementById('account-name').value.trim(),
  27. trackingInterval: parseInt(document.getElementById('account-interval').value, 10),
  28. });
  29. showToast('Gespeichert.');
  30. } catch (e) {
  31. showToast(e.message, true);
  32. }
  33. });
  34. }
  35. // ── Besitzer des Accounts ─────────────────────────────────────────────────
  36. const superadminSelect = document.getElementById('superadmin-select');
  37. if (superadminSelect && !superadminSelect.disabled) {
  38. superadminSelect.addEventListener('change', async () => {
  39. const selectedName = superadminSelect.options[superadminSelect.selectedIndex].text;
  40. if (!confirm(`${selectedName} zum neuen Kontoinhaber machen?`)) {
  41. // Auswahl zurücksetzen
  42. superadminSelect.value = superadminSelect.dataset.original;
  43. return;
  44. }
  45. try {
  46. await patchJson('/api/account/superadmin', {
  47. userId: parseInt(superadminSelect.value, 10),
  48. });
  49. showToast('Kontoinhaber geändert. Seite wird neu geladen…');
  50. setTimeout(() => window.location.reload(), 1500);
  51. } catch (e) {
  52. showToast(e.message, true);
  53. superadminSelect.value = superadminSelect.dataset.original;
  54. }
  55. });
  56. // Original-Wert merken für Rollback
  57. superadminSelect.dataset.original = superadminSelect.value;
  58. }
  59. // ── Passwort-Toggle ───────────────────────────────────────────────────────
  60. const btnPwToggle = document.getElementById('btn-pw-toggle');
  61. const pwSection = document.getElementById('pw-section');
  62. if (btnPwToggle && pwSection) {
  63. btnPwToggle.addEventListener('click', (e) => {
  64. e.preventDefault();
  65. const open = !pwSection.hidden;
  66. pwSection.hidden = open;
  67. btnPwToggle.textContent = open ? 'ändern' : 'abbrechen';
  68. });
  69. }
  70. // ── Benutzer-Formular ─────────────────────────────────────────────────────
  71. const btnUserSave = document.getElementById('btn-user-save');
  72. if (btnUserSave) {
  73. btnUserSave.addEventListener('click', async () => {
  74. const data = {
  75. firstName: document.getElementById('user-firstname').value.trim(),
  76. lastName: document.getElementById('user-lastname').value.trim(),
  77. email: document.getElementById('user-email').value.trim(),
  78. };
  79. if (pwSection && !pwSection.hidden) {
  80. const pwNew = document.getElementById('user-pw-new').value;
  81. const pwRepeat = document.getElementById('user-pw-repeat').value;
  82. if (pwNew !== pwRepeat) {
  83. showToast('Die Passwörter stimmen nicht überein.', true);
  84. return;
  85. }
  86. data.currentPassword = document.getElementById('user-pw-current').value;
  87. data.newPassword = pwNew;
  88. }
  89. try {
  90. await patchJson('/api/account/user', data);
  91. showToast('Gespeichert.');
  92. if (pwSection) {
  93. pwSection.hidden = true;
  94. document.getElementById('btn-pw-toggle').textContent = 'ändern';
  95. ['user-pw-current', 'user-pw-new', 'user-pw-repeat'].forEach(id => {
  96. document.getElementById(id).value = '';
  97. });
  98. }
  99. } catch (e) {
  100. showToast(e.message, true);
  101. }
  102. });
  103. }
  104. });