Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions definy-client/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ impl narumincho_vdom_client::App<AppState> for DefinyApp {
created_account_events: ssr_events.unwrap_or_default(),
current_key: None,
part_name_input: String::new(),
part_description_input: String::new(),
composing_expression: definy_event::event::Expression::Number(definy_event::event::NumberExpression { value: 0 }),
part_definition_eval_result: None,
event_detail_eval_result: None,
Expand Down
2 changes: 2 additions & 0 deletions definy-event/src/event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ pub enum EventContent {
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PartDefinitionEvent {
pub part_name: Box<str>,
#[serde(default)]
pub description: Box<str>,
pub expression: Expression,
}

Expand Down
1 change: 1 addition & 0 deletions definy-server/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@ async fn handle_html(
},
current_key: None,
part_name_input: String::new(),
part_description_input: String::new(),
composing_expression: definy_event::event::Expression::Number(definy_event::event::NumberExpression { value: 0 }),
part_definition_eval_result: None,
event_detail_eval_result: None,
Expand Down
1 change: 1 addition & 0 deletions definy-ui/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ web-sys = { version = "0.3.85", features = [
"Event",
"HtmlDialogElement",
"HtmlInputElement",
"HtmlTextAreaElement",
"Navigator",
"Clipboard",
"Request",
Expand Down
9 changes: 7 additions & 2 deletions definy-ui/src/account_detail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,14 @@ fn event_summary(event: &definy_event::event::Event) -> String {
format!("Profile changed: {}", change_profile_event.account_name)
}
EventContent::PartDefinition(part_definition_event) => format!(
"{} = {}",
"{} = {}{}",
part_definition_event.part_name,
expression_to_source(&part_definition_event.expression)
expression_to_source(&part_definition_event.expression),
if part_definition_event.description.is_empty() {
String::new()
} else {
format!(" - {}", part_definition_event.description)
}
),
}
}
1 change: 1 addition & 0 deletions definy-ui/src/app_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ pub struct AppState {
)>,
pub current_key: Option<ed25519_dalek::SigningKey>,
pub part_name_input: String,
pub part_description_input: String,
pub composing_expression: definy_event::event::Expression,
pub part_definition_eval_result: Option<String>,
pub event_detail_eval_result: Option<String>,
Expand Down
13 changes: 13 additions & 0 deletions definy-ui/src/event_detail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,19 @@ fn render_event_detail(
part_definition_event.part_name,
expression_to_source(&part_definition_event.expression)
)),
if part_definition_event.description.is_empty() {
Div::new().children([]).into_node()
} else {
Div::new()
.style(
Style::new()
.set("font-size", "1rem")
.set("color", "var(--text-secondary)")
.set("white-space", "pre-wrap"),
)
.children([text(part_definition_event.description.as_ref())])
.into_node()
},
{
let expression = part_definition_event.expression.clone();
Button::new()
Expand Down
47 changes: 47 additions & 0 deletions definy-ui/src/event_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ pub fn event_list_view(state: &AppState) -> Node<AppState> {
)
.children([
part_name_input(state),
part_description_input(state),
Div::new()
.style(Style::new().set("color", "var(--text-secondary)").set("font-size", "0.9rem"))
.children([text("Expression Builder")])
Expand Down Expand Up @@ -87,6 +88,7 @@ pub fn event_list_view(state: &AppState) -> Node<AppState> {
};

let part_name = state.part_name_input.trim().to_string();
let description = state.part_description_input.clone();
if part_name.is_empty() {
return AppState {
part_definition_eval_result: Some(
Expand All @@ -109,6 +111,7 @@ pub fn event_list_view(state: &AppState) -> Node<AppState> {
definy_event::event::EventContent::PartDefinition(
definy_event::event::PartDefinitionEvent {
part_name: part_name.into(),
description: description.into(),
expression,
},
),
Expand Down Expand Up @@ -137,6 +140,7 @@ pub fn event_list_view(state: &AppState) -> Node<AppState> {
});
AppState {
part_name_input: String::new(),
part_description_input: String::new(),
part_definition_eval_result: None,
composing_expression:
definy_event::event::Expression::Number(
Expand Down Expand Up @@ -495,6 +499,19 @@ fn event_view(
part_definition_event.part_name,
expression_to_source(&part_definition_event.expression)
)),
if part_definition_event.description.is_empty() {
Div::new().children([]).into_node()
} else {
Div::new()
.style(
Style::new()
.set("font-size", "0.9rem")
.set("color", "var(--text-secondary)")
.set("white-space", "pre-wrap"),
)
.children([text(part_definition_event.description.as_ref())])
.into_node()
},
])
.into_node(),
},
Expand Down Expand Up @@ -542,6 +559,36 @@ fn part_name_input(state: &AppState) -> Node<AppState> {
input.into_node()
}

fn part_description_input(state: &AppState) -> Node<AppState> {
let mut textarea = Textarea::new()
.name("part-description")
.value(&state.part_description_input)
.style(Style::new().set("min-height", "6rem"));
textarea.attributes.push((
"placeholder".to_string(),
"description (supports multiple lines)".to_string(),
));
textarea.events.push((
"input".to_string(),
EventHandler::new(move |set_state| async move {
let value = web_sys::window()
.and_then(|window| window.document())
.and_then(|document| document.query_selector("textarea[name='part-description']").ok())
.flatten()
.and_then(|element| {
wasm_bindgen::JsCast::dyn_into::<web_sys::HtmlTextAreaElement>(element).ok()
})
.map(|textarea| textarea.value())
.unwrap_or_default();
set_state(Box::new(move |state: AppState| AppState {
part_description_input: value,
..state.clone()
}));
}),
));
textarea.into_node()
}

#[cfg(test)]
mod tests {
use super::{set_node_kind, set_number_value, NodeKind, PathStep};
Expand Down
1 change: 1 addition & 0 deletions definy-ui/tests/browser_e2e.rs
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ fn render_html_response(path: &str) -> Response<Full<Bytes>> {
created_account_events: vec![],
current_key: None,
part_name_input: String::new(),
part_description_input: String::new(),
composing_expression: definy_event::event::Expression::Number(definy_event::event::NumberExpression { value: 0 }),
part_definition_eval_result: None,
event_detail_eval_result: None,
Expand Down
2 changes: 1 addition & 1 deletion narumincho-vdom-client/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ pub fn start<State: Clone + 'static, A: App<State>>() {
Reflect::get(&event, &JsValue::from_str("canIntercept"))
{
if can_intercept.is_truthy() {
if let Ok(user_initiated) =
if let Ok(_user_initiated) =
Reflect::get(&event, &JsValue::from_str("userInitiated"))
{
// Only intercept if it was a user click (not script navigation, etc) if we want
Expand Down
16 changes: 16 additions & 0 deletions narumincho-vdom/src/elements.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,11 @@ define_element!(
"input",
"https://developer.mozilla.org/docs/Web/HTML/Reference/Elements/input"
);
define_element!(
Textarea,
"textarea",
"https://developer.mozilla.org/docs/Web/HTML/Reference/Elements/textarea"
);
define_element!(
Label,
"label",
Expand Down Expand Up @@ -195,6 +200,17 @@ impl<State> Input<State> {
}
}

// Textarea specific
impl<State> Textarea<State> {
pub fn name(self, name: &str) -> Self {
self.attribute("name", name)
}

pub fn value(self, value: &str) -> Self {
self.attribute("value", value)
}
}

impl<State> Form<State> {
/// https://developer.mozilla.org/docs/Web/API/HTMLFormElement/submit_event
pub fn on_submit(mut self, msg: EventHandler<State>) -> Self {
Expand Down