use crate::*;
#[component]
pub fn euv_vconsole_panel(node: VirtualNode<EuvVconsolePanelProps>) -> VirtualNode {
let EuvVconsolePanelProps { panel_open }: EuvVconsolePanelProps =
node.try_get_props().unwrap_or_default();
let console_signal: Signal<Vec<ConsoleEntry>> = Console::get_signal();
html! {
euv_vconsole_fab {
panel_open: panel_open
console_signal: console_signal
}
euv_vconsole_drawer {
console_signal: console_signal
panel_open: panel_open
}
}
}
#[component]
pub fn euv_vconsole_fab(node: VirtualNode<EuvVconsoleFabProps>) -> VirtualNode {
let EuvVconsoleFabProps {
panel_open,
console_signal,
}: EuvVconsoleFabProps = node.try_get_props().unwrap_or_default();
html! {
div {
class: c_vconsole_fab()
euv_logo {
variant: LogoButtonVariant::Fab
on_click: Console::fab_on_click(panel_open)
span {
class: if { !console_signal.get().is_empty() } {
c_vconsole_badge()
}
if { console_signal.get().len() > 99 } {
"99+"
} else if { !console_signal.get().is_empty() } {
console_signal.get().len().to_string()
}
}
}
}
}
}
#[component]
pub fn euv_vconsole_drawer(node: VirtualNode<EuvVconsoleDrawerProps>) -> VirtualNode {
let EuvVconsoleDrawerProps {
console_signal,
panel_open,
}: EuvVconsoleDrawerProps = node.try_get_props().unwrap_or_default();
let filter_signal: Signal<LogFilter> = App::use_signal(|| LogFilter::All);
let on_overlay_click = move |_: Event| {
Router::overlay_stack_close();
panel_open.set(false);
};
let on_clear_click = move |_: Event| {
Console::clear();
};
let on_close_click = move |_: Event| {
Router::overlay_stack_close();
panel_open.set(false);
};
html! {
div {
div {
class: if { panel_open.get() } {
c_vconsole_overlay().to_string()
} else {
format!("{} {}", c_vconsole_overlay().get_name(), c_vconsole_overlay_hidden().get_name())
}
onclick: on_overlay_click
}
div {
class: if { panel_open.get() } {
c_vconsole_panel().to_string()
} else {
format!("{} {}", c_vconsole_panel().get_name(), c_vconsole_panel_closed().get_name())
}
div {
class: c_vconsole_header()
h3 {
class: c_vconsole_title()
span {
class: c_vconsole_title_dot()
}
"Console"
span {
class: c_vconsole_count()
format!(" ({})", console_signal.get().len())
}
}
div {
class: c_vconsole_header_actions()
button {
class: c_vconsole_close_button()
onclick: on_close_click
"×"
}
}
}
div {
class: c_vconsole_filter_bar()
span {
class: if { filter_signal.get() == LogFilter::All } {
c_vconsole_filter_badge()
} else {
c_vconsole_filter_badge_outline()
}
onclick: LogFilter::on_filter_all(filter_signal)
"All"
}
span {
class: if { filter_signal.get() == LogFilter::Log } {
c_vconsole_filter_badge()
} else {
c_vconsole_filter_badge_outline()
}
onclick: LogFilter::on_filter_log(filter_signal)
"Log"
}
span {
class: if { filter_signal.get() == LogFilter::Warn } {
c_vconsole_filter_badge()
} else {
c_vconsole_filter_badge_outline()
}
onclick: LogFilter::on_filter_warn(filter_signal)
"Warn"
}
span {
class: if { filter_signal.get() == LogFilter::Error } {
c_vconsole_filter_badge()
} else {
c_vconsole_filter_badge_outline()
}
onclick: LogFilter::on_filter_error(filter_signal)
"Error"
}
span {
class: c_vconsole_clear_button()
onclick: on_clear_click
"Clear"
}
}
div {
class: c_vconsole_body()
build_vconsole_log_nodes(console_signal, filter_signal)
}
}
}
}
}
fn build_vconsole_log_nodes(
logs: Signal<Vec<ConsoleEntry>>,
filter: Signal<LogFilter>,
) -> VirtualNode {
html! {
div {
class: if { Console::filter_entries(logs, filter).is_empty() } {
c_vconsole_empty()
} else {
c_vconsole_empty_hidden()
}
"No logs yet."
}
div {
class: if { Console::filter_entries(logs, filter).is_empty() } {
c_vconsole_log_list_hidden()
} else {
c_vconsole_log_list()
}
for (index, entry) in { &Console::filter_entries(logs, filter) } {
div {
key: index.to_string()
class: c_vconsole_log_item()
span {
class: c_vconsole_level_badge()
entry.get_level().badge()
}
entry.get_message().clone()
}
}
}
}
}