Skip to main content

orbital_base_components/tree/
edit.rs

1use leptos::{html, prelude::*};
2
3#[derive(Clone)]
4pub struct TreeEditCommit {
5    pub item_id: String,
6    pub label: String,
7}
8
9impl TreeEditCommit {
10    pub fn commit(
11        item_id: String,
12        draft: RwSignal<String>,
13        editing: RwSignal<bool>,
14    ) -> Option<Self> {
15        if !editing.get_untracked() {
16            return None;
17        }
18        let label = draft.get_untracked();
19        editing.set(false);
20        Some(Self { item_id, label })
21    }
22
23    pub fn cancel(draft: RwSignal<String>, editing: RwSignal<bool>, original: &str) {
24        draft.set(original.to_string());
25        editing.set(false);
26    }
27}
28
29/// Read the rendered label text when config/registry labels are empty.
30pub fn label_from_row(row_ref: &NodeRef<html::Div>) -> Option<String> {
31    row_ref.get_untracked().and_then(|row| {
32        row.query_selector(".orbital-tree-item-layout__label")
33            .ok()
34            .flatten()
35            .and_then(|element| element.text_content())
36            .map(|text| text.trim().to_string())
37            .filter(|text| !text.is_empty())
38    })
39}
40
41pub fn resolve_edit_label(
42    _item_id: &str,
43    item_label: &StoredValue<String>,
44    label_override: &RwSignal<Option<String>>,
45    registry_label: Option<String>,
46    row_ref: &NodeRef<html::Div>,
47) -> String {
48    if let Some(label) = label_override.get_untracked() {
49        return label;
50    }
51    let stored = item_label.get_value();
52    if !stored.is_empty() {
53        return stored;
54    }
55    if let Some(label) = registry_label.filter(|label| !label.is_empty()) {
56        return label;
57    }
58    label_from_row(row_ref).unwrap_or_default()
59}