cloudflare-dns 0.1.5

A TUI for managing Cloudflare DNS records programmatically
Documentation
use crate::api::DnsRecord;
use crate::ui::colors::*;
use crate::ui::components::app_layout::{AppLayoutConfig, render_app_layout};
use iocraft::prelude::*;

#[derive(Default, Props)]
pub struct RecordListProps {
    pub records: Vec<DnsRecord>,
    pub selected_idx: i32,
    pub status: String,
    pub zone_name: String,
}

#[component]
pub fn RecordList(props: &RecordListProps, mut hooks: Hooks) -> impl Into<AnyElement<'static>> {
    let sel = props.selected_idx as usize;
    let title = format!(" ☁ Cloudflare DNS — {} ", props.zone_name);
    let rec_text = if props.records.is_empty() {
        "No DNS records found\n\n↑↓: navigate | [D]elete | [C]reate".to_string()
    } else {
        let mut t = format!(
            "{} DNS Records  (↑↓: navigate, d: delete, r: refresh)\n\n",
            props.records.len()
        );
        for (i, r) in props.records.iter().enumerate() {
            let marker = if i == sel { "" } else { "  " };
            t.push_str(&format!(
                "{}{:<6} │ {:<30} │ {:<20} │ TTL: {:<6} │ Proxy: {}\n",
                marker,
                r.record_type,
                r.name,
                r.content,
                r.ttl.unwrap_or(0),
                if r.proxied.unwrap_or(false) {
                    "Yes"
                } else {
                    "No"
                }
            ));
        }
        t
    };

    let content = element! {
        View(flex_grow: 1.0, padding_left: 2, padding_right: 2, padding_top: 1, padding_bottom: 1) {
            Text(content: rec_text, color: TEXT)
        }
    }
    .into_any();

    render_app_layout(
        AppLayoutConfig {
            border_color: BLUE,
            title,
            title_bg: ORANGE,
            title_color: CRUST,
            menu: " [R]efresh  [C]reate  [E]dit  [D]elete  [Q]uit".to_string(),
            menu_bg: SURFACE1,
            menu_color: SUBTEXT1,
            status: props.status.clone(),
        },
        content,
        &mut hooks,
    )
}