//! Prop detail page component.
use leptos::prelude::*;
use leptos_router::hooks::use_params_map;
use crate::components::{Card, DetailGrid, DetailItem, PageHeader};
use crate::hooks::use_fetch_if;
use crate::models::PropDetail;
/// Prop detail page component.
#[component]
pub fn PropsDetailPage() -> impl IntoView {
let params = use_params_map();
let prop_id = move || params.get().get("prop_id").unwrap_or_default();
let initial_prop_id = params.get_untracked().get("prop_id").unwrap_or_default();
let prop = use_fetch_if::(
move || !prop_id().is_empty(),
move || format!("/api/admin/props/{}", prop_id()),
);
view! {
"Back to Props"
"Loading prop..."
}>
{move || {
prop.get().map(|maybe_prop| {
match maybe_prop {
Some(p) => view! {
}.into_any(),
None => view! {
"Prop not found or you don't have permission to view."
}.into_any()
}
})
}}
}
}
#[component]
fn PropDetailView(prop: PropDetail) -> impl IntoView {
let asset_url = format!("/assets/{}", prop.asset_path);
let tags_display = if prop.tags.is_empty() {
"None".to_string()
} else {
prop.tags.join(", ")
};
view! {
{prop.id.clone()}
{tags_display}
{prop.default_layer.clone().unwrap_or_else(|| "Not set".to_string())}
{match prop.default_position {
Some(pos) => {
let labels = ["Top-Left", "Top-Center", "Top-Right",
"Middle-Left", "Center", "Middle-Right",
"Bottom-Left", "Bottom-Center", "Bottom-Right"];
labels.get(pos as usize).map(|s| s.to_string())
.unwrap_or_else(|| format!("{}", pos))
},
None => "Not set".to_string(),
}}
{format!("{}%", (prop.default_scale * 100.0) as i32)}
{if prop.is_active {
view! { "Active" }.into_any()
} else {
view! { "Inactive" }.into_any()
}}
{if prop.is_unique { "Yes" } else { "No" }}
{if prop.is_transferable { "Yes" } else { "No" }}
{if prop.is_portable { "Yes" } else { "No" }}
{prop.available_from.clone().unwrap_or_else(|| "Always".to_string())}
{prop.available_until.clone().unwrap_or_else(|| "No end date".to_string())}
{prop.created_at.clone()}
{prop.updated_at.clone()}
}
}