]>
Commit | Line | Data |
---|---|---|
f32dd17f MT |
1 | {% extends "../base.html" %} |
2 | ||
3 | {% block title %}{{ _("Register") }}{% end block %} | |
4 | ||
5 | {% block content %} | |
8ffccddc RH |
6 | <section class="section"> |
7 | <div class="container"> | |
8 | <div class="columns is-centered"> | |
9 | <div class="column is-one-third"> | |
10 | <h1 class="title is-1"> | |
11 | IPFire<span class="has-text-primary">_</span> | |
12 | </h1> | |
13 | <h4 class="subtitle is-4">{{ _("Register A New Account") }}</h4> | |
14 | ||
15 | <div class="block"> | |
16 | <p class="is-size-5"> | |
17 | {{ _("Become a part of our community by registering an account!") }} | |
18 | </p> | |
19 | </div> | |
20 | ||
21 | <form id="form-register" action="" method="POST"> | |
22 | {% raw xsrf_form_html() %} | |
23 | ||
24 | <input type="hidden" name="next" value="{{ next or "" }}"> | |
25 | ||
26 | <div class="block"> | |
27 | <div class="field"> | |
28 | <div class="field-body"> | |
29 | <div class="field"> | |
30 | <p class="control has-icons-left"> | |
31 | <span class="icon is-small is-left"> | |
32 | <i class="fas fa-at"></i> | |
33 | </span> | |
34 | <input class="input" type="text" placeholder="{{ _("Username") }}" required autofocus | |
35 | pattern="[a-z_][a-z0-9_-]{3,31}"> | |
36 | </p> | |
37 | </div> | |
38 | </div> | |
39 | </div> | |
40 | ||
41 | <div id="uid-invalid" class="invalid-feedback invalid-feedback-uid"> | |
42 | {{ _("Please choose a username in UNIX format with at least four characters, starting with a lowercase letter, followed by only lowercase letters, digits, dash and underscore") }} | |
43 | </div> | |
44 | <div id="uid-taken" class="invalid-feedback invalid-feedback-uid"> | |
45 | {{ _("This username is not available") }} | |
46 | </div> | |
47 | </div> | |
48 | ||
49 | <div class="block"> | |
50 | <div class="field"> | |
51 | <div class="field-body"> | |
52 | <div class="field"> | |
53 | <p class="control has-icons-left"> | |
54 | <span class="icon is-small is-left"> | |
55 | <i class="fas fa-person"></i> | |
56 | </span> | |
57 | <input class="input" type="text" name="first_name" placeholder="{{ _("First Name") }}" required autofocus> | |
58 | </p> | |
59 | <p class="control has-icons-left"> | |
60 | <span class="icon is-small is-left"> | |
61 | <i class="fas fa-person"></i> | |
62 | </span> | |
63 | <input class="input" type="text" name="last_name" placeholder="{{ _("Last Name") }}" required autofocus> | |
64 | </p> | |
65 | </div> | |
66 | </div> | |
67 | </div> | |
68 | </div> | |
69 | ||
62bf81fb RH |
70 | <div class="block"> |
71 | <div class="field"> | |
72 | <div class="field-body"> | |
73 | <div class="field"> | |
74 | <p class="control has-icons-left"> | |
75 | <span class="icon is-small is-left"> | |
76 | <i class="fas fa-envelope"></i> | |
77 | </span> | |
78 | <input class="input" type="email" | |
79 | name="email" placeholder="{{ _("Email Address") }}" required> | |
80 | <div id="email-invalid" class="invalid-feedback invalid-feedback-email"> | |
81 | {{ _("This email address is invalid") }} | |
82 | </div> | |
83 | <div id="email-blacklisted" class="invalid-feedback invalid-feedback-email"> | |
84 | {{ _("This email address cannot be used") }} | |
85 | </div> | |
86 | <div id="email-taken" class="invalid-feedback invalid-feedback-email"> | |
87 | {{ _("This email address is already in use") }} | |
88 | </div> | |
89 | </p> | |
90 | </div> | |
91 | </div> | |
92 | </div> | |
93 | </div> | |
94 | ||
8ffccddc RH |
95 | <div class="field"> |
96 | <div class="control"> | |
97 | <button class="button is-primary is-medium is-fullwidth"> | |
98 | {{ _("Register") }} | |
99 | </button> | |
100 | </div> | |
101 | </div> | |
102 | </form> | |
103 | </div> | |
104 | </div> | |
105 | </div> | |
106 | </div> | |
107 | </section> | |
f32dd17f | 108 | {% end block %} |
689effd0 MT |
109 | |
110 | {% block javascript %} | |
111 | <script> | |
838a3e09 MT |
112 | var form = $("#form-register"); |
113 | var submit = form.find(":submit"); | |
114 | ||
115 | // Store the valid status | |
116 | var valid = { | |
117 | uid: false, | |
118 | email: false, | |
119 | }; | |
120 | ||
689effd0 | 121 | var check_uid; |
66181c96 | 122 | var check_email; |
689effd0 | 123 | |
838a3e09 | 124 | form.find("input[name=uid]").on("keyup", function(e) { |
689effd0 MT |
125 | if (check_uid) |
126 | clearTimeout(check_uid); | |
127 | ||
128 | var uid = $(this); | |
129 | ||
130 | check_uid = setTimeout(function() { | |
8ffccddc | 131 | $.get("/api/check/uid", { uid : uid.val() }, |
689effd0 MT |
132 | function(data) { |
133 | // Reset all classes | |
8ffccddc | 134 | uid.removeClass("is-success is-danger"); |
838a3e09 | 135 | valid.uid = false; |
689effd0 MT |
136 | |
137 | // Hide all feedback | |
6a79a85e | 138 | $(".invalid-feedback-uid").hide(); |
689effd0 MT |
139 | |
140 | switch (data.result) { | |
141 | case "ok": | |
8ffccddc | 142 | uid.addClass("is-success"); |
838a3e09 | 143 | valid.uid = true; |
689effd0 MT |
144 | break; |
145 | ||
146 | case "invalid": | |
8ffccddc | 147 | uid.addClass("is-danger"); |
689effd0 MT |
148 | $("#uid-invalid").show(); |
149 | break; | |
150 | ||
151 | case "taken": | |
8ffccddc | 152 | uid.addClass("is-danger"); |
689effd0 MT |
153 | $("#uid-taken").show(); |
154 | break; | |
155 | } | |
838a3e09 MT |
156 | |
157 | form.trigger("change"); | |
689effd0 MT |
158 | } |
159 | ); | |
160 | }, 250); | |
161 | }); | |
66181c96 | 162 | |
838a3e09 | 163 | form.find("input[name=email]").on("keyup", function(e) { |
66181c96 MT |
164 | if (check_email) |
165 | clearTimeout(check_email); | |
166 | ||
167 | var email = $(this); | |
168 | ||
169 | check_email = setTimeout(function() { | |
170 | $.get("/api/check/email", { email : email.val() }, | |
171 | function(data) { | |
172 | // Reset all classes | |
8ffccddc | 173 | email.removeClass("is-success is-danger"); |
838a3e09 | 174 | valid.email = false; |
66181c96 MT |
175 | |
176 | // Hide all feedback | |
6a79a85e | 177 | $(".invalid-feedback-email").hide(); |
66181c96 MT |
178 | |
179 | switch (data.result) { | |
180 | case "ok": | |
8ffccddc | 181 | email.addClass("is-success"); |
838a3e09 | 182 | valid.email = true; |
66181c96 MT |
183 | break; |
184 | ||
185 | case "invalid": | |
8ffccddc | 186 | email.addClass("is-danger"); |
66181c96 MT |
187 | $("#email-invalid").show(); |
188 | break; | |
189 | ||
3095c017 | 190 | case "blacklisted": |
8ffccddc | 191 | email.addClass("is-danger"); |
3095c017 MT |
192 | $("#email-blacklisted").show(); |
193 | break; | |
194 | ||
66181c96 | 195 | case "taken": |
8ffccddc | 196 | email.addClass("is-danger"); |
66181c96 MT |
197 | $("#email-taken").show(); |
198 | break; | |
199 | } | |
838a3e09 MT |
200 | |
201 | form.trigger("change"); | |
66181c96 MT |
202 | } |
203 | ); | |
204 | }, 250); | |
205 | }); | |
838a3e09 MT |
206 | |
207 | form.on("change", function() { | |
208 | var disabled = false; | |
209 | ||
210 | $.each(valid, function(field, status) { | |
211 | if (!status) { | |
212 | disabled = true; | |
213 | return false; | |
214 | } | |
215 | }); | |
216 | ||
217 | submit.prop("disabled", disabled); | |
218 | }); | |
689effd0 | 219 | </script> |
2dadab0a | 220 | {% end block %} |