| 162 | let (page, offset) = pager.resolve(); | 162 | let (page, offset) = pager.resolve(); |
| 163 | let total = state.store.admin_counts().await?.users; | 163 | let total = state.store.admin_counts().await?.users; |
| 164 | let all = state.store.list_users_paged(PAGE_SIZE, offset).await?; | 164 | let all = state.store.list_users_paged(PAGE_SIZE, offset).await?; |
| | 165 | |
| | 166 | |
| | 167 | let mut verified: std::collections::HashSet<String> = std::collections::HashSet::new(); |
| | 168 | for u in &all { |
| | 169 | if state |
| | 170 | .store |
| | 171 | .primary_email_verified(&u.id) |
| | 172 | .await |
| | 173 | .unwrap_or(false) |
| | 174 | { |
| | 175 | verified.insert(u.id.clone()); |
| | 176 | } |
| | 177 | } |
| 165 | | 178 | |
| 166 | let everyone = state.store.list_users().await?; | 179 | let everyone = state.store.list_users().await?; |
| 167 | let (_, chrome) = build_chrome( | 180 | let (_, chrome) = build_chrome( |
| 182 | span class="entry-row-title" { | 195 | span class="entry-row-title" { |
| 183 | a href={ "/" (u.username) } { (u.username) } | 196 | a href={ "/" (u.username) } { (u.username) } |
| 184 | @if u.is_admin { " " span class="badge" { "admin" } } | 197 | @if u.is_admin { " " span class="badge" { "admin" } } |
| | 198 | @if verified.contains(&u.id) { " " span class="badge badge-verified" { "verified" } } |
| 185 | @if u.disabled_at.is_some() { " " span class="badge badge-private" { "disabled" } } | 199 | @if u.disabled_at.is_some() { " " span class="badge badge-private" { "disabled" } } |
| 186 | } | 200 | } |
| 187 | div class="entry-row-meta muted" { (u.email) } | 201 | div class="entry-row-meta muted" { (u.email) } |
| 188 | } | 202 | } |
| 189 | div class="entry-row-actions admin-actions" { | 203 | div class="entry-row-actions admin-actions" { |
| 190 | (post_button(&format!("/admin/users/{}/verify", u.id), &csrf, "Verify", "btn")) | 204 | @if !verified.contains(&u.id) { |
| | 205 | (post_button(&format!("/admin/users/{}/verify", u.id), &csrf, "Verify", "btn")) |
| | 206 | } |
| 191 | (toggle_button(&format!("/admin/users/{}/admin", u.id), &csrf, "admin", !u.is_admin, | 207 | (toggle_button(&format!("/admin/users/{}/admin", u.id), &csrf, "admin", !u.is_admin, |
| 192 | if u.is_admin { "Revoke admin" } else { "Make admin" })) | 208 | if u.is_admin { "Revoke admin" } else { "Make admin" })) |
| 193 | (toggle_button(&format!("/admin/users/{}/disable", u.id), &csrf, "disabled", u.disabled_at.is_none(), | 209 | (toggle_button(&format!("/admin/users/{}/disable", u.id), &csrf, "disabled", u.disabled_at.is_none(), |
| 214 | } | 230 | } |
| 215 | p class="muted field-hint" { "Leaving the password blank creates an account that must be activated by the user (they'll need an invite/reset)." } | 231 | p class="muted field-hint" { "Leaving the password blank creates an account that must be activated by the user (they'll need an invite/reset)." } |
| 216 | div class="admin-form-actions" { | 232 | div class="admin-form-actions" { |
| 217 | label class="checkbox" { input type="checkbox" name="admin" value="1"; " Administrator" } | | |
| 218 | button class="btn btn-primary inline-btn" type="submit" { "Create user" } | 233 | button class="btn btn-primary inline-btn" type="submit" { "Create user" } |
| | 234 | label class="checkbox" { input type="checkbox" name="admin" value="1"; " Administrator" } |
| 219 | } | 235 | } |
| 220 | } | 236 | } |
| 221 | } | 237 | } |