a mini social media app for small communities
1@include 'partial/header.html' 2 3<h1>register</h1> 4 5<div> 6 @if ctx.form_error != '' 7 <p>error: @ctx.form_error</p> 8 @end 9 10 @if ctx.is_logged_in() 11 <p>you are already logged in as @{user.get_name()}!</p> 12 <a href="/api/user/logout">log out</a> 13 @else 14 <form action="/api/user/register" method="post"> 15 <label for="username">username:</label> 16 <input 17 type="text" 18 name="username" 19 id="username" 20 pattern="@app.config.user.username_pattern" 21 minlength="@app.config.user.username_min_len" 22 maxlength="@app.config.user.username_max_len" 23 required 24 > 25 <br> 26 <label for="password">password: <a href="#" id="view-password" style="display: inline;">view</a></label> 27 <input 28 type="password" 29 name="password" 30 id="password" 31 pattern="@app.config.user.password_pattern" 32 minlength="@app.config.user.password_min_len" 33 maxlength="@app.config.user.password_max_len" 34 required 35 > 36 <br> 37 <label for="confirm-password">confirm password: <a href="#" id="view-confirm-password" style="display: inline;">view</a></label> 38 <input 39 type="password" 40 name="confirm-password" 41 id="confirm-password" 42 pattern="@app.config.user.password_pattern" 43 minlength="@app.config.user.password_min_len" 44 maxlength="@app.config.user.password_max_len" 45 required 46 > 47 <br> 48 <p>passwords match: <span id="passwords-match">yes</span></p> 49 <br> 50 @if app.config.instance.invite_only 51 <label for="invite-code">invite code:</label> 52 <input type="text" name="invite-code" id="invite-code" required> 53 <br> 54 @end 55 @if app.config.hcaptcha.enabled 56 <div class="h-captcha" data-sitekey="@{app.config.hcaptcha.site_key}"></div> 57 <script src="https://js.hcaptcha.com/1/api.js" async defer></script> 58 <br> 59 @end 60 <input type="submit" value="register"> 61 </form> 62 @end 63</div> 64 65<script> 66 const password = document.getElementById('password'); 67 const confirm_password = document.getElementById('confirm-password'); 68 const matches = document.getElementById('passwords-match'); 69 70 const a = () => { 71 matches.innerText = password.value==confirm_password.value ? "yes" : "no"; 72 }; 73 password.addEventListener('input', a); 74 confirm_password.addEventListener('input', a); 75 76 const view_password = document.getElementById('view-password'); 77 const view_confirm_password = document.getElementById('view-confirm-password'); 78 79 const b = (elm, btn) => { 80 return event => { 81 if (elm.getAttribute('type') == 'password') 82 { 83 elm.setAttribute('type', 'text'); 84 btn.innerText = 'hide'; 85 } 86 else 87 { 88 elm.setAttribute('type', 'password') 89 btn.innerText = 'show'; 90 } 91 }; 92 }; 93 view_password.addEventListener('click', b(password, view_password)); 94 view_confirm_password.addEventListener('click', b(confirm_password, view_confirm_password)); 95</script> 96 97@include 'partial/footer.html'