const LIVE_LOG_COLUMNS: &[&str] = &[ "time", "request", "host", "source_ip", "vhost", "backend", "status", "duration", "cache", "outcome", "transport", "websocket", "upstream_error", ]; const FILE_LOG_COLUMN_MAX: usize = 64; const BACKEND_TABLE_COLUMNS: &[&str] = &[ "vhost", "backend", "status", "active", "requests", "errors", "latency", "traffic", "generation", "generationRequests", "generationAge", "rotations", "lastFailure", "lastRecovery", ]; const VHOST_LIST_SORT_COLUMNS: &[&str] = &[ "id", "hostname", "status", "listeners", "certificate", "backends", ]; const DOCKER_VHOST_SORT_COLUMNS: &[&str] = &[ "service", "hostname", "status", "backend", "scheme", "published", ]; const REDIRECT_LIST_SORT_COLUMNS: &[&str] = &[ "id", "name", "hostname", "status", "target", "rules", "listeners", "certificate", ]; const NOTFOUND_LIST_SORT_COLUMNS: &[&str] = &[ "id", "name", "hostname", "status", "mode", "listeners", "certificate", ]; const STREAM_LIST_SORT_COLUMNS: &[&str] = &[ "name", "id", "protocol", "listen", "upstream", "status", "maxConnections", "idleTimeout", ]; // The same JSON registry is embedded into the authenticated admin JS bundle. // No independent allowlist is maintained by the browser or backend. #[derive(serde::Deserialize)] struct DashboardWidgetDefinition { id: String, default_hidden: bool, } static DASHBOARD_WIDGETS: std::sync::LazyLock> = std::sync::LazyLock::new(|| { serde_json::from_str(include_str!("web/dashboard-widgets.json")) .expect("invalid bundled Overview Cards registry") });