orbital_base_components/tree/
edit.rs1use 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
29pub 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}