"#, section_class, section.id, section.name, global_current, total_steps, section_class, status_text, section_class));
for child in §ion.children {
log::info!(" Child '{}': items={}, item_groups={}",
child.name, child.items.len(), child.item_groups.len());
let child_class = match child.status {
crate::auto_task::SectionStatus::Completed => "completed expanded",
crate::auto_task::SectionStatus::Running => "running expanded",
crate::auto_task::SectionStatus::Failed => "failed",
crate::auto_task::SectionStatus::Skipped => "skipped",
_ => "pending",
};
let child_status = match child.status {
crate::auto_task::SectionStatus::Completed => "Completed",
crate::auto_task::SectionStatus::Running => "Running",
crate::auto_task::SectionStatus::Failed => "Failed",
crate::auto_task::SectionStatus::Skipped => "Skipped",
_ => "Pending",
};
html.push_str(&format!(r#"
{}
Step {}/{}
{}
"#, child_class, child.id, child.name, child.current_step, child.total_steps, child_class, child_status));
// Render item groups first (grouped fields like "email, password_hash, email_verified")
for group in &child.item_groups {
let group_class = match group.status {
crate::auto_task::ItemStatus::Completed => "completed",
crate::auto_task::ItemStatus::Running => "running",
_ => "pending",
};
let check_mark = if group.status == crate::auto_task::ItemStatus::Completed { "✓" } else { "" };
let group_duration = group.duration_seconds
.map(|s| if s >= 60 { format!("Duration: {} min", s / 60) } else { format!("Duration: {} sec", s) })
.unwrap_or_default();
let group_name = group.display_name();
html.push_str(&format!(r#"
{}
{}
{}
"#, group_class, group.id, group_class, group_name, group_duration, group_class, check_mark));
}
// Then individual items
for item in &child.items {
let item_class = match item.status {
crate::auto_task::ItemStatus::Completed => "completed",
crate::auto_task::ItemStatus::Running => "running",
_ => "pending",
};
let check_mark = if item.status == crate::auto_task::ItemStatus::Completed { "✓" } else { "" };
let item_duration = item.duration_seconds
.map(|s| if s >= 60 { format!("Duration: {} min", s / 60) } else { format!("Duration: {} sec", s) })
.unwrap_or_default();
html.push_str(&format!(r#"
{}
{}
{}
"#, item_class, item.id, item_class, item.name, item_duration, item_class, check_mark));
}
html.push_str("
");
}
// Render section-level item groups
for group in §ion.item_groups {
let group_class = match group.status {
crate::auto_task::ItemStatus::Completed => "completed",
crate::auto_task::ItemStatus::Running => "running",
_ => "pending",
};
let check_mark = if group.status == crate::auto_task::ItemStatus::Completed { "✓" } else { "" };
let group_duration = group.duration_seconds
.map(|s| if s >= 60 { format!("Duration: {} min", s / 60) } else { format!("Duration: {} sec", s) })
.unwrap_or_default();
let group_name = group.display_name();
html.push_str(&format!(r#"
{}
{}
{}
"#, group_class, group.id, group_class, group_name, group_duration, group_class, check_mark));
}
// Render section-level items
for item in §ion.items {
let item_class = match item.status {
crate::auto_task::ItemStatus::Completed => "completed",
crate::auto_task::ItemStatus::Running => "running",
_ => "pending",
};
let check_mark = if item.status == crate::auto_task::ItemStatus::Completed { "✓" } else { "" };
let item_duration = item.duration_seconds
.map(|s| if s >= 60 { format!("Duration: {} min", s / 60) } else { format!("Duration: {} sec", s) })
.unwrap_or_default();
html.push_str(&format!(r#"
{}
{}
{}
"#, item_class, item.id, item_class, item.name, item_duration, item_class, check_mark));
}
html.push_str("