1// --------------------------------------------------------------------- 2// Helper: Debounce 3// --------------------------------------------------------------------- 4function debounce(func, delay) { 5 var timeoutId; 6 return function () { 7 var context = this; 8 var args = arguments; 9 clearTimeout(timeoutId); 10 timeoutId = setTimeout(function () { 11 func.apply(context, args); 12 }, delay); 13 }; 14} 15 16// --------------------------------------------------------------------- 17// Helper: PUT-Request per fetch() mit Abbruch-Unterstützung 18// --------------------------------------------------------------------- 19function putJson(url, data, signal) { 20 return fetch(url, { 21 method: 'PUT', 22 headers: { 'Content-Type': 'application/json' }, 23 body: JSON.stringify(data), 24 signal: signal 25 }).then(function (response) { 26 if (!response.ok) { 27 throw new Error('HTTP error ' + response.status); 28 } 29 return response.json(); 30 }); 31} 32 33// --------------------------------------------------------------------- 34// Username-Check 35// --------------------------------------------------------------------- 36var userNameCheckController = null; 37 38function checkUserName() { 39 var userNameField = document.getElementById('newUserName'); 40 var resultField = document.getElementById('userNameValidationResult'); 41 var userName = userNameField.value; 42 43 // Vorherigen, noch offenen Request abbrechen 44 if (userNameCheckController) { 45 userNameCheckController.abort(); 46 } 47 userNameCheckController = new AbortController(); 48 49 var dataObject = { userdata: [{ username: userName }] }; 50 51 putJson('api/v5/checkforavailableusername', dataObject, userNameCheckController.signal) 52 .then(function (resultObj) { 53 if (resultObj.result === 'nok') { 54 resultField.innerHTML = '<span style="color: red;">' + i18n.gettext('Please choose a different username!') + '</span>'; 55 } else { 56 resultField.innerHTML = '<span style="color: green;">' + i18n.gettext('Username is ok!') + '</span>'; 57 } 58 }) 59 .catch(function (err) { 60 if (err.name === 'AbortError') return; // abgebrochener Request, kein Fehler 61 console.error('checkUserName failed:', err); 62 }); 63} 64 65function debouncedCheckUserNameHandler() { 66 var userName = document.getElementById('newUserName').value; 67 var resultField = document.getElementById('userNameValidationResult'); 68 if (userName.length < 3) { 69 resultField.innerHTML = ''; 70 return; 71 } 72 checkUserName(); 73} 74 75// --------------------------------------------------------------------- 76// Passwort-Check (rein lokal, kein Debounce nötig) 77// --------------------------------------------------------------------- 78function checkPassword() { 79 var password = document.getElementById('newUserPass').value; 80 var resultField = document.getElementById('passwordValidationResult'); 81 if (password.length < 10) { 82 var message = i18n.gettext('Password must have at least a length of 10 characters.'); 83 resultField.innerHTML = '<span style="color: red;">' + message + '</span>'; 84 } else { 85 resultField.innerHTML = '<span style="color: green;">' + i18n.gettext('Password is ok!') + '</span>'; 86 } 87} 88 89function checkPasswordRepetition() { 90 var password = document.getElementById('newUserPass').value; 91 var passwordRepetition = document.getElementById('newUserPassControl').value; 92 var resultField = document.getElementById('passwordRepetitionValidationResult'); 93 if (password !== passwordRepetition) { 94 var message = i18n.gettext('Password and repetition are not the same.'); 95 resultField.innerHTML = '<span style="color: red;">' + message + '</span>'; 96 } else { 97 resultField.innerHTML = '<span style="color: green;">' + i18n.gettext('Password repetition is ok!') + '</span>'; 98 } 99} 100 101// --------------------------------------------------------------------- 102// E-Mail-Check 103// --------------------------------------------------------------------- 104var userMailCheckController = null; 105 106function checkUserMail() { 107 var emailField = document.getElementById('newUserMail'); 108 var resultField = document.getElementById('userMailValidationResult'); 109 var email = emailField.value; 110 111 if (userMailCheckController) { 112 userMailCheckController.abort(); 113 } 114 userMailCheckController = new AbortController(); 115 116 var dataObject = { userdata: [{ email: email }] }; 117 118 putJson('api/v5/checkforavailableemail', dataObject, userMailCheckController.signal) 119 .then(function (resultObj) { 120 if (resultObj.result === 'nok') { 121 resultField.innerHTML = '<span style="color: red;">' + i18n.gettext('Please choose a different mail address!') + '</span>'; 122 } else { 123 resultField.innerHTML = '<span style="color: green;">' + i18n.gettext('Mail address is ok!') + '</span>'; 124 } 125 }) 126 .catch(function (err) { 127 if (err.name === 'AbortError') return; 128 console.error('checkUserMail failed:', err); 129 }); 130} 131 132function debouncedCheckUserMailHandler() { 133 var email = document.getElementById('newUserMail').value; 134 var resultField = document.getElementById('userMailValidationResult'); 135 if (email.length < 5) { // kürzeste denkbare gültige Mail: [email protected] 136 resultField.innerHTML = ''; 137 return; 138 } 139 checkUserMail(); 140} 141 142// --------------------------------------------------------------------- 143// Event-Bindings (ersetzt die alten onkeyup="..."-Attribute im HTML) 144// --------------------------------------------------------------------- 145document.addEventListener('DOMContentLoaded', function () { 146 var userNameField = document.getElementById('newUserName'); 147 var passwordField = document.getElementById('newUserPass'); 148 var passwordRepeatField = document.getElementById('newUserPassControl'); 149 var emailField = document.getElementById('newUserMail'); 150 151 if (userNameField) { 152 userNameField.addEventListener('keyup', debounce(debouncedCheckUserNameHandler, 500)); 153 } 154 if (passwordField) { 155 passwordField.addEventListener('keyup', checkPassword); 156 } 157 if (passwordRepeatField) { 158 passwordRepeatField.addEventListener('keyup', checkPasswordRepetition); 159 } 160 if (emailField) { 161 emailField.addEventListener('keyup', debounce(debouncedCheckUserMailHandler, 500)); 162 } 163});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.