laterite_web/theme/
maintenance.rs1use laterite_admin::form::FormField;
6use laterite_admin::settings::{SettingsItem, SettingsModel};
7use laterite_admin::{Permission, ROLE_ADMIN};
8use laterite_core::t;
9use serde::{Deserialize, Serialize};
10
11pub const PERMISSION: &str = "web.manage_site";
13
14#[derive(Debug, Clone, Default, Serialize, Deserialize)]
16#[serde(default)]
17pub struct MaintenanceSettings {
18 pub enabled: bool,
19 pub message: String,
21}
22
23impl SettingsModel for MaintenanceSettings {
24 const CODE: &'static str = "web.maintenance";
25}
26
27pub fn permission() -> Permission {
29 Permission::new(PERMISSION, t!("Manage the site"), t!("Website")).roles([ROLE_ADMIN])
30}
31
32pub fn settings_item() -> SettingsItem {
34 SettingsItem::new(
35 MaintenanceSettings::CODE,
36 t!("Maintenance mode"),
37 vec![
38 FormField::switch("enabled", t!("Show visitors the maintenance page")),
39 FormField::textarea("message", t!("Message")).help(t!(
40 "Shown when the theme has no page at /maintenance. Operators who may manage themes still see the site."
41 )),
42 ],
43 )
44 .description(t!("Take the site down for visitors while you work on it."))
45 .category(t!("Website"))
46 .order(20)
47 .icon("wrench")
48 .permission(PERMISSION)
49}
50
51pub fn notice(message: &str) -> String {
53 let text = if message.trim().is_empty() {
54 "This site is down for maintenance. Please come back soon."
55 } else {
56 message.trim()
57 };
58 format!(
59 "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"robots\" content=\"noindex\"><title>Maintenance</title></head><body><main><p>{}</p></main></body></html>",
60 crate::escape(text)
61 )
62}