use crate::wrapper_render_fn;
use crate::{ColumnSort, DragStateRwSignal, HeadDragHandler, TableHeadEvent};
use leptos::prelude::*;
wrapper_render_fn!(
DefaultTableHeadRenderer,
thead,
);
wrapper_render_fn!(
DefaultTableHeadRowRenderer,
tr,
);
#[component]
pub fn DefaultTableHeaderCellRenderer<F, Column>(
#[prop(into)]
class: Signal<String>,
#[prop(into)]
inner_class: String,
index: Column,
#[prop(into)]
sort_priority: Signal<Option<usize>>,
#[prop(into)]
sort_direction: Signal<ColumnSort>,
on_click: F,
drag_state: DragStateRwSignal<Column>,
drag_handler: HeadDragHandler<Column>,
columns: RwSignal<Vec<Column>>,
children: Children,
) -> impl IntoView
where
F: Fn(TableHeadEvent<Column>) + 'static,
Column: PartialEq + Copy + Send + Sync + std::fmt::Debug + 'static,
{
let style = default_th_sorting_style(sort_priority, sort_direction);
let drag_classes = drag_handler.0.get_drag_classes(drag_state, index, columns);
view! {
<th
class=move || format!("{} {}", class.get(), drag_classes.get())
style=style
draggable="true"
on:click=move |mouse_event| on_click(TableHeadEvent {
index,
mouse_event,
})
on:drop={
let drag_handler = drag_handler.clone();
move |evt| {
drag_handler.0.received_drop(drag_state, columns, index, evt);
}
}
on:dragover={
let drag_handler = drag_handler.clone();
move |evt| {
drag_handler.0.dragging_over(drag_state, index, evt);
}
}
on:dragleave={
let drag_handler = drag_handler.clone();
move |evt| {
drag_handler.0.drag_leave(drag_state, index, evt);
}
}
on:dragstart={
let drag_handler = drag_handler.clone();
move |evt| {
drag_handler.0.drag_start(drag_state, index, evt);
}
}
on:dragend=move |evt| {
drag_handler.0.drag_end(drag_state, columns, index, evt);
}
>
<span class=inner_class>{children()}</span>
</th>
}
}
pub fn default_th_sorting_style(
sort_priority: Signal<Option<usize>>,
sort_direction: Signal<ColumnSort>,
) -> Signal<String> {
Signal::derive(move || {
let sort = match sort_direction.get() {
ColumnSort::Ascending => "--sort-icon: '▲';",
ColumnSort::Descending => "--sort-icon: '▼';",
ColumnSort::None => "--sort-icon: '';",
};
let priority = match sort_priority.get() {
Some(priority) => format!("--sort-priority: '{}';", priority + 1),
None => "--sort-priority: '';".to_string(),
};
format!("{} {}", sort, &priority)
})
}