Email blocklisting #718
							
								
								
									
										1
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							
							
						
						|  | @ -2221,6 +2221,7 @@ dependencies = [ | |||
|  "diesel 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||
|  "diesel-derive-newtype 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||
|  "diesel_migrations 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||
|  "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||
|  "guid-create 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", | ||||
|  "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", | ||||
|  "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||
|  |  | |||
|  | @ -0,0 +1,3 @@ | |||
| -- This file should undo anything in `up.sql` | ||||
| 
 | ||||
| drop table email_blocklist; | ||||
|  | @ -0,0 +1,6 @@ | |||
|   Might as well follow the conventions :) Might as well follow the conventions :)   Maybe make this column unique, to avoid duplicated blocks? Maybe make this column unique, to avoid duplicated blocks?   Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps. Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps.   Might as well follow the conventions :) Might as well follow the conventions :) | ||||
| -- Your SQL goes here | ||||
|   Maybe make this column unique, to avoid duplicated blocks? Maybe make this column unique, to avoid duplicated blocks?   Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps. Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps.   Might as well follow the conventions :) Might as well follow the conventions :) | ||||
| CREATE TABLE email_blocklist(id SERIAL PRIMARY KEY, | ||||
|   Maybe make this column unique, to avoid duplicated blocks? Maybe make this column unique, to avoid duplicated blocks?   Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps. Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps.   Might as well follow the conventions :) Might as well follow the conventions :) | ||||
|                              email_address TEXT UNIQUE, | ||||
|   Maybe make this column unique, to avoid duplicated blocks? Maybe make this column unique, to avoid duplicated blocks?   Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps. Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps.   Might as well follow the conventions :) Might as well follow the conventions :) | ||||
|                              note TEXT, | ||||
|   Maybe make this column unique, to avoid duplicated blocks? Maybe make this column unique, to avoid duplicated blocks?   Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps. Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps.   Might as well follow the conventions :) Might as well follow the conventions :) | ||||
|                              notify_user BOOLEAN DEFAULT FALSE, | ||||
|   Maybe make this column unique, to avoid duplicated blocks? Maybe make this column unique, to avoid duplicated blocks?   Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps. Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps.   Might as well follow the conventions :) Might as well follow the conventions :) | ||||
|                              notification_text TEXT); | ||||
|   Maybe make this column unique, to avoid duplicated blocks? Maybe make this column unique, to avoid duplicated blocks?   Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps. Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps.   Might as well follow the conventions :) Might as well follow the conventions :) | ||||
|  | @ -0,0 +1,3 @@ | |||
| -- This file should undo anything in `up.sql` | ||||
| 
 | ||||
| drop table email_blocklist; | ||||
							
								
								
									
										6
									
								
								migrations/sqlite/2020-01-05-232816_add_blocklist/up.sql
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,6 @@ | |||
| -- Your SQL goes here | ||||
| CREATE TABLE email_blocklist(id INTEGER PRIMARY KEY, | ||||
|                              email_address TEXT UNIQUE, | ||||
|                              note TEXT, | ||||
|                              notify_user BOOLEAN DEFAULT FALSE, | ||||
|                              notification_text TEXT); | ||||
|  | @ -28,6 +28,7 @@ webfinger = "0.4.1" | |||
| whatlang = "0.7.1" | ||||
| shrinkwraprs = "0.2.1" | ||||
| diesel-derive-newtype = "0.1.2" | ||||
| glob = "0.3.0" | ||||
| 
 | ||||
| [dependencies.chrono] | ||||
| features = ["serde"] | ||||
|  |  | |||
							
								
								
									
										142
									
								
								plume-models/src/blocklisted_emails.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,142 @@ | |||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :)   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl, TextExpressionMethods}; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| use glob::Pattern; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| 
 | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| use schema::email_blocklist; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| use {Connection, Error, Result}; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| 
 | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| #[derive(Clone, Queryable, Identifiable)] | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| #[table_name = "email_blocklist"] | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| pub struct BlocklistedEmail { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub id: i32, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub email_address: String, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub note: String, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub notify_user: bool, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub notification_text: String, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| 
 | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| #[derive(Insertable, FromForm)] | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| #[table_name = "email_blocklist"] | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| pub struct NewBlocklistedEmail { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub email_address: String, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub note: String, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub notify_user: bool, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub notification_text: String, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| 
 | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| impl BlocklistedEmail { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     insert!(email_blocklist, NewBlocklistedEmail); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     get!(email_blocklist); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     find_by!(email_blocklist, find_by_id, id as i32); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub fn delete_entries(conn: &Connection, ids: Vec<i32>) -> Result<bool> { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         use diesel::delete; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         for i in ids { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             let be: BlocklistedEmail = BlocklistedEmail::find_by_id(&conn, i)?; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             delete(&be).execute(conn)?; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         Ok(true) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub fn find_for_domain(conn: &Connection, domain: &str) -> Result<Vec<BlocklistedEmail>> { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         let effective = format!("%@{}", domain); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         email_blocklist::table | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             .filter(email_blocklist::email_address.like(effective)) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             .load::<BlocklistedEmail>(conn) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             .map_err(Error::from) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub fn matches_blocklist(conn: &Connection, email: &str) -> Result<Option<BlocklistedEmail>> { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         let mut result = email_blocklist::table.load::<BlocklistedEmail>(conn)?; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         for i in result.drain(..) { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             if let Ok(x) = Pattern::new(&i.email_address) { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                 if x.matches(email) { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                     return Ok(Some(i)); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                 } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         Ok(None) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub fn page(conn: &Connection, (min, max): (i32, i32)) -> Result<Vec<BlocklistedEmail>> { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         email_blocklist::table | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             .offset(min.into()) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             .limit((max - min).into()) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             .load::<BlocklistedEmail>(conn) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             .map_err(Error::from) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub fn count(conn: &Connection) -> Result<i64> { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         email_blocklist::table | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             .count() | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             .get_result(conn) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             .map_err(Error::from) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub fn pattern_errors(pat: &str) -> Option<glob::PatternError> { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         let c = Pattern::new(pat); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         c.err() | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub fn new( | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         conn: &Connection, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         pattern: &str, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         note: &str, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         show_notification: bool, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         notification_text: &str, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     ) -> Result<BlocklistedEmail> { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         let c = NewBlocklistedEmail { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             email_address: pattern.to_owned(), | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             note: note.to_owned(), | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             notify_user: show_notification, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             notification_text: notification_text.to_owned(), | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         }; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         BlocklistedEmail::insert(conn, c) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| #[cfg(test)] | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| pub(crate) mod tests { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     use super::*; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     use diesel::Connection; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     use instance::tests as instance_tests; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     use tests::rockets; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     use Connection as Conn; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     pub(crate) fn fill_database(conn: &Conn) -> Vec<BlocklistedEmail> { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         instance_tests::fill_database(conn); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         let domainblock = | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             BlocklistedEmail::new(conn, "*@bad-actor.com", "Mean spammers", false, "").unwrap(); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         let userblock = BlocklistedEmail::new( | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             conn, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             "spammer@lax-administration.com", | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             "Decent enough domain, but this user is a problem.", | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             true, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             "Stop it please", | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         ) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         .unwrap(); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         vec![domainblock, userblock] | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     #[test] | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     fn test_match() { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         let r = rockets(); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         let conn = &*r.conn; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         conn.test_transaction::<_, (), _>(|| { | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             let various = fill_database(conn); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             let match1 = "user1@bad-actor.com"; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             let match2 = "spammer@lax-administration.com"; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             let no_match = "happy-user@lax-administration.com"; | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             assert_eq!( | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                 BlocklistedEmail::matches_blocklist(conn, match1) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                     .unwrap() | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                     .unwrap() | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                     .id, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                 various[0].id | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             ); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             assert_eq!( | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                 BlocklistedEmail::matches_blocklist(conn, match2) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                     .unwrap() | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                     .unwrap() | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                     .id, | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                 various[1].id | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             ); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             assert_eq!( | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                 BlocklistedEmail::matches_blocklist(conn, no_match) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                     .unwrap() | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                     .is_none(), | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|                 true | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             ); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|             Ok(()) | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|         }); | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|     } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
| } | ||||
|   You could use https://doc.rust-lang.org/std/result/enum.Result.html#method.err   Maybe add a  Maybe add a `@` so that in only matches one domain, and not all domains with the same ending (I doubt this case will ever be encountered actually, be just to be sure).   That's much nicer :) That's much nicer :) | ||||
|  | @ -22,6 +22,7 @@ extern crate plume_common; | |||
| #[macro_use] | ||||
| extern crate plume_macro; | ||||
| extern crate reqwest; | ||||
| #[macro_use] | ||||
| extern crate rocket; | ||||
| extern crate rocket_i18n; | ||||
| extern crate scheduled_thread_pool; | ||||
|  | @ -32,6 +33,7 @@ extern crate serde_derive; | |||
| extern crate serde_json; | ||||
| #[macro_use] | ||||
| extern crate tantivy; | ||||
| extern crate glob; | ||||
| extern crate url; | ||||
| extern crate walkdir; | ||||
| extern crate webfinger; | ||||
|  | @ -53,6 +55,7 @@ pub type Connection = diesel::PgConnection; | |||
| /// All the possible errors that can be encoutered in this crate
 | ||||
| #[derive(Debug)] | ||||
| pub enum Error { | ||||
|     Blocklisted(bool, String), | ||||
|     Db(diesel::result::Error), | ||||
|     Inbox(Box<InboxError<Error>>), | ||||
|     InvalidValue, | ||||
|  | @ -351,6 +354,7 @@ mod tests { | |||
| pub mod admin; | ||||
| pub mod api_tokens; | ||||
| pub mod apps; | ||||
| pub mod blocklisted_emails; | ||||
| pub mod blog_authors; | ||||
| pub mod blogs; | ||||
| pub mod comment_seers; | ||||
|  |  | |||
|  | @ -73,6 +73,15 @@ table! { | |||
|         user_id -> Int4, | ||||
|     } | ||||
| } | ||||
| table! { | ||||
|     email_blocklist(id){ | ||||
|         id -> Int4, | ||||
|         email_address -> VarChar, | ||||
|         note -> Text, | ||||
|         notify_user -> Bool, | ||||
|         notification_text -> Text, | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| table! { | ||||
|     follows (id) { | ||||
|  |  | |||
|  | @ -49,7 +49,10 @@ use safe_string::SafeString; | |||
| use schema::users; | ||||
| use search::Searcher; | ||||
| use timeline::Timeline; | ||||
| use {ap_url, Connection, Error, PlumeRocket, Result, ITEMS_PER_PAGE}; | ||||
| use { | ||||
|     ap_url, blocklisted_emails::BlocklistedEmail, Connection, Error, PlumeRocket, Result, | ||||
|     ITEMS_PER_PAGE, | ||||
| }; | ||||
| 
 | ||||
| pub type CustomPerson = CustomObject<ApSignature, Person>; | ||||
| 
 | ||||
|  | @ -992,6 +995,10 @@ impl NewUser { | |||
|     ) -> Result<User> { | ||||
|         let (pub_key, priv_key) = gen_keypair(); | ||||
|         let instance = Instance::get_local()?; | ||||
|         let blocklisted = BlocklistedEmail::matches_blocklist(conn, &email)?; | ||||
|         if let Some(x) = blocklisted { | ||||
|             return Err(Error::Blocklisted(x.notify_user, x.notification_text)); | ||||
|         } | ||||
| 
 | ||||
|         let res = User::insert( | ||||
|             conn, | ||||
|  |  | |||
|  | @ -198,6 +198,9 @@ Then try to restart Plume | |||
|                 routes::instance::admin_mod, | ||||
|                 routes::instance::admin_instances, | ||||
|                 routes::instance::admin_users, | ||||
|                 routes::instance::admin_email_blocklist, | ||||
|                 routes::instance::add_email_blocklist, | ||||
|                 routes::instance::delete_email_blocklist, | ||||
|                 routes::instance::edit_users, | ||||
|                 routes::instance::toggle_block, | ||||
|                 routes::instance::update_settings, | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| use rocket::{ | ||||
|     request::{FormItems, FromForm, LenientForm}, | ||||
|     request::{Form, FormItems, FromForm, LenientForm}, | ||||
|     response::{status, Flash, Redirect}, | ||||
| }; | ||||
| use rocket_contrib::json::Json; | ||||
|  | @ -13,6 +13,7 @@ use inbox; | |||
| use plume_common::activity_pub::{broadcast, inbox::FromId}; | ||||
| use plume_models::{ | ||||
|     admin::*, | ||||
|     blocklisted_emails::*, | ||||
|     comments::Comment, | ||||
|     db_conn::DbConn, | ||||
|     headers::Headers, | ||||
|  | @ -174,6 +175,61 @@ pub fn admin_users( | |||
|         Page::total(User::count_local(&*rockets.conn)? as i32) | ||||
|     ))) | ||||
| } | ||||
| pub struct BlocklistEmailDeletion { | ||||
|     ids: Vec<i32>, | ||||
| } | ||||
| impl<'f> FromForm<'f> for BlocklistEmailDeletion { | ||||
|     type Error = (); | ||||
|     fn from_form(items: &mut FormItems<'f>, _strict: bool) -> Result<BlocklistEmailDeletion, ()> { | ||||
|         let mut c: BlocklistEmailDeletion = BlocklistEmailDeletion { ids: Vec::new() }; | ||||
|         for item in items { | ||||
|             let key = item.key.parse::<i32>(); | ||||
|             if let Ok(i) = key { | ||||
|                 c.ids.push(i); | ||||
|             } | ||||
|         } | ||||
|         Ok(c) | ||||
|     } | ||||
| } | ||||
| #[post("/admin/emails/delete", data = "<form>")] | ||||
| pub fn delete_email_blocklist( | ||||
|     _mod: Moderator, | ||||
|     form: Form<BlocklistEmailDeletion>, | ||||
|     rockets: PlumeRocket, | ||||
| ) -> Result<Flash<Redirect>, ErrorPage> { | ||||
|     BlocklistedEmail::delete_entries(&*rockets.conn, form.0.ids)?; | ||||
|     Ok(Flash::success( | ||||
|         Redirect::to(uri!(admin_email_blocklist: page = None)), | ||||
|         i18n!(rockets.intl.catalog, "Blocks deleted"), | ||||
|     )) | ||||
| } | ||||
| 
 | ||||
| #[post("/admin/emails/new", data = "<form>")] | ||||
| pub fn add_email_blocklist( | ||||
|   I'm almost sure I did something similar for user management, couldn't the code be shared between the two? I'm almost sure I did something similar for user management, couldn't the code be shared between the two?   We couldn't see how to do that cleanly, since that's significantly more complicated. We couldn't see how to do that cleanly, since that's significantly more complicated.   OK, let's do it this way then, we can always refactor later if needed. OK, let's do it this way then, we can always refactor later if needed. | ||||
|     _mod: Moderator, | ||||
|     form: LenientForm<NewBlocklistedEmail>, | ||||
|     rockets: PlumeRocket, | ||||
| ) -> Result<Flash<Redirect>, ErrorPage> { | ||||
|     BlocklistedEmail::insert(&*rockets.conn, form.0)?; | ||||
|     Ok(Flash::success( | ||||
|         Redirect::to(uri!(admin_email_blocklist: page = None)), | ||||
|         i18n!(rockets.intl.catalog, "Email Blocked"), | ||||
|     )) | ||||
| } | ||||
| #[get("/admin/emails?<page>")] | ||||
| pub fn admin_email_blocklist( | ||||
|     _mod: Moderator, | ||||
|     page: Option<Page>, | ||||
|     rockets: PlumeRocket, | ||||
| ) -> Result<Ructe, ErrorPage> { | ||||
|     let page = page.unwrap_or_default(); | ||||
|     Ok(render!(instance::emailblocklist( | ||||
|         &rockets.to_context(), | ||||
|         BlocklistedEmail::page(&*rockets.conn, page.limits())?, | ||||
|         page.0, | ||||
|         Page::total(BlocklistedEmail::count(&*rockets.conn)? as i32) | ||||
|     ))) | ||||
| } | ||||
| 
 | ||||
| /// A structure to handle forms that are a list of items on which actions are applied.
 | ||||
| ///
 | ||||
|  | @ -307,11 +363,20 @@ fn ban( | |||
| ) -> Result<(), ErrorPage> { | ||||
|     let u = User::get(&*conn, id)?; | ||||
|     u.delete(&*conn, searcher)?; | ||||
| 
 | ||||
|     if Instance::get_local() | ||||
|         .map(|i| u.instance_id == i.id) | ||||
|         .unwrap_or(false) | ||||
|     { | ||||
|         BlocklistedEmail::insert( | ||||
|             &conn, | ||||
|             NewBlocklistedEmail { | ||||
|                 email_address: u.email.clone().unwrap(), | ||||
|                 note: "Banned".to_string(), | ||||
|                 notify_user: false, | ||||
|                 notification_text: "".to_owned(), | ||||
|             }, | ||||
|         ) | ||||
|         .unwrap(); | ||||
|         let target = User::one_by_instance(&*conn)?; | ||||
|         let delete_act = u.delete_activity(&*conn)?; | ||||
|         let u_clone = u.clone(); | ||||
|  |  | |||
|  | @ -484,8 +484,20 @@ pub fn validate_username(username: &str) -> Result<(), ValidationError> { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| fn to_validation(_: Error) -> ValidationErrors { | ||||
| fn to_validation(x: Error) -> ValidationErrors { | ||||
|     let mut errors = ValidationErrors::new(); | ||||
|     if let Error::Blocklisted(show, msg) = x { | ||||
|         if show { | ||||
|             errors.add( | ||||
|                 "email", | ||||
|                 ValidationError { | ||||
|                     code: Cow::from("blocklisted"), | ||||
|                     message: Some(Cow::from(msg)), | ||||
|                     params: HashMap::new(), | ||||
|                 }, | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
|     errors.add( | ||||
|         "", | ||||
|         ValidationError { | ||||
|  | @ -529,8 +541,7 @@ pub fn create( | |||
|                 "", | ||||
|                 form.email.to_string(), | ||||
|                 User::hash_pass(&form.password).map_err(to_validation)?, | ||||
|             ) | ||||
|             .map_err(to_validation)?; | ||||
|             ).map_err(to_validation)?; | ||||
|             Ok(Flash::success( | ||||
|                 Redirect::to(uri!(super::session::new: m = _)), | ||||
|                 i18n!( | ||||
|  |  | |||
|  | @ -14,6 +14,7 @@ | |||
|     (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), true), | ||||
|     (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), false), | ||||
|     (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), false), | ||||
|     (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), false) | ||||
|   This link is absent from the "Instances" page. This link is absent from the "Instances" page. | ||||
|   ]) | ||||
| 
 | ||||
|   <form method="post" action="@uri!(instance::update_settings)"> | ||||
|  |  | |||
							
								
								
									
										71
									
								
								templates/instance/emailblocklist.rs.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,71 @@ | |||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
| @use templates::base; | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
| @use plume_models::blocklisted_emails::BlocklistedEmail; | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
| @use template_utils::*; | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
| @use routes::*; | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
| 
 | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
| @(ctx:BaseContext, emails: Vec<BlocklistedEmail>, page:i32, n_pages:i32) | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|     @:base(ctx, i18n!(ctx.1, "Blocklisted Emails"), {}, {}, { | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|     <h1>@i18n!(ctx.1,"Blocklisted Emails")</h1> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|     @tabs(&[ | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense   There should probably be a  There should probably be a `<h1>` here, like on other administration pages. | ||||
|         (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), false), | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), false), | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), false), | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         (&uri!(instance::admin_email_blocklist:page=_).to_string(), i18n!(ctx.1, "Email blocklist"), true), | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|     ]) | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|     <form method="post" action="@uri!(instance::add_email_blocklist)"> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         @(Input::new("email_address", i18n!(ctx.1, "Email address")) | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         .details(i18n!(ctx.1, "The email address you wish to block. In order to block domains, you can use globbing syntax, for example '*@example.com' blocks all addresses from example.com")) | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         .set_prop("minlength", 1) | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         .html(ctx.1)) | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         @(Input::new("note", i18n!(ctx.1, "Note")).optional().html(ctx.1)) | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         <label for="notify_user">@i18n!(ctx.1, "Notify the user?") | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             <input id="notify_user" type="checkbox" name="notify_user"> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             <small> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 @i18n!(ctx.1, "Optional, shows a message to the user when they attempt to create an account with that address") | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             </small> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         </label> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         @(Input::new("notification_text", i18n!(ctx.1, "Blocklisting notification")) | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             .optional() | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         .details(i18n!(ctx.1, "The message to be shown when the user attempts to create an account with this email address")).html(ctx.1)) | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         <input type="submit"  value='@i18n!(ctx.1, "Add blocklisted address")'> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|     </form> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|     <form method="post" action="@uri!(instance::delete_email_blocklist)"> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         <header> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             @if emails.is_empty() { | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                <input type="submit" class="destructive" value='@i18n!(ctx.1, "Delete selected emails")'> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             } else { | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                <p class="center" >@i18n!(ctx.1, "There are no blocked emails on your instance")</p> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             } | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         </header> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|     <div class="list"> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         @for email in emails { | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         <div class="card flex compact"> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             <input type="checkbox" name="@email.id"> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             <p class="grow"> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 <strong> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                     @i18n!(ctx.1, "Email address:") | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 </strong> @email.email_address | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             </p> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             <p class="grow"> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 <strong> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                     @i18n!(ctx.1, "Blocklisted for:") | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 </strong> @email.note | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             </p> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
| 
 | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             <p class="grow"> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 @if email.notify_user { | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 <strong> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                     @i18n!(ctx.1, "Will notify them on account creation with this message:") | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 </strong> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 @email.notification_text | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 } else { | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 @i18n!(ctx.1, "The user will be silently prevented from making an account") | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|                 } | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|             </p> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
| 
 | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         </div> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|         } | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|     </div> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|     </form> | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|     @paginate(ctx.1, page, n_pages) | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
| }) | ||||
|   I'm a bit confused as to why there are no spaces after  I'm a bit confused as to why there are no spaces after `, `s in function calls, starting here   Oh, that's because rustfmt can't touch the templates :) Fixed. Oh, that's because rustfmt can't touch the templates :)
Fixed.   This button should probably be red ( This button should probably be red (`class="destructive"` IIRC), and explicitly say that it deletes all blocklisted emails if it is what it does.   This  This `<input>` should be before the label IMO, as it is usually done with checkboxes.   It deletes only the ones selected. But yeah, that's a good idea It deletes only the ones selected.
But yeah, that's a good idea   Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown ( Actually, this button should probably be hidden if there is currently no blocked addresses, and a placeholder message should be shown (`<p class="center">` is made for that).   Moving it inside of the  Moving it inside of the `<label>` tag would be better, otherwise they are not on the same line, and it is hard to understand they are linked.   There is a  There is a `i` missing in `i18n` here, it doesn't show correctly (it shouldn't even compile, but for some reason, it does).   What an odd mystery What an odd mystery   That makes sense That makes sense | ||||
|  | @ -12,6 +12,7 @@ | |||
|     (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), false), | ||||
|     (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), true), | ||||
|     (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), false), | ||||
|     (&uri!(instance::admin_email_blocklist:page=_).to_string(), i18n!(ctx.1, "Email blocklist"), false), | ||||
|     ]) | ||||
| 
 | ||||
|     <div class="list"> | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ | |||
|         (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), false), | ||||
|         (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), false), | ||||
|         (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), true), | ||||
|         (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), false) | ||||
|     ]) | ||||
| 
 | ||||
|     <form method="post" action="@uri!(instance::edit_users)"> | ||||
|  |  | |||
Maybe make this column unique, to avoid duplicated blocks?
Little detail, so if you don't feel like doing it, don't change, but: keywords in SQL usually are in all caps.