things3_cloud/ui/components/
checklist.rs1use crate::ids::matching::longest_shortest_unique_prefix_len;
2use crate::store::ChecklistItem;
3use crate::ui::components::checklist_item::CheckListRow;
4use iocraft::prelude::*;
5
6#[derive(Default, Props)]
7pub struct CheckListProps<'a> {
8 pub items: Option<&'a [ChecklistItem]>,
9 pub show_ids: bool,
10 pub shift_left: bool,
11}
12
13#[component]
14pub fn CheckList<'a>(props: &CheckListProps<'a>) -> impl Into<AnyElement<'a>> {
15 let Some(items) = props.items else {
16 return element!(Fragment).into_any();
17 };
18
19 let prefix_len = prefix_len(items, props.show_ids);
20
21 let margin_left = if props.shift_left && prefix_len > 0 {
22 -(prefix_len as i32 + 3)
23 } else {
24 0
25 };
26
27 let items = items.iter().enumerate().map(move |(i, item)| {
28 let is_last = i == items.len() - 1;
29 element!(CheckListRow(item, id_prefix_len: prefix_len, is_last))
30 });
31
32 element! {
33 View(flex_direction: FlexDirection::Column, margin_left) {
34 #(items)
35 }
36 }
37 .into_any()
38}
39
40fn prefix_len(items: &[ChecklistItem], show_ids: bool) -> usize {
41 if !show_ids || items.is_empty() {
42 return 0;
43 }
44
45 let ids = items.iter().map(|i| i.uuid.clone()).collect::<Vec<_>>();
46 longest_shortest_unique_prefix_len(&ids)
47}