mod aggregation_footer;
mod body;
mod cell;
mod cell_selection_handlers;
mod column_menu;
mod column_picker;
mod column_reorder;
mod column_styles;
mod controlled;
mod docs;
mod edit;
mod export_menu;
mod filter_panel;
mod filter_rule_editor;
mod footer;
mod grid_keyboard;
mod group_row;
mod header;
mod header_cell;
mod header_filters;
mod header_groups;
mod infinite_scroll;
mod leading_columns;
mod list_body;
mod overlays;
mod pagination_bar;
#[cfg(feature = "preview")]
mod phase9_previews;
mod pivot_panel;
mod quick_search;
mod root;
mod row;
mod row_interaction;
mod row_reorder;
mod styles;
mod toolbar;
mod toolbar_overflow;
mod tree_grouping_cell;
pub use body::DataTableBody;
pub use cell::data_table_cell_view;
pub use footer::DataTableFooter;
pub use header::DataTableHeader;
pub use header_cell::DataTableHeaderCell;
pub use overlays::DataTableOverlays;
pub use pagination_bar::DataTablePaginationBar;
pub use quick_search::DataTableQuickSearch;
pub use root::DataTableRoot;
pub use toolbar::DataTableToolbar;
#[cfg(feature = "preview")]
pub use docs::{
DATATABLEADVANCEDDOC_PREVIEW_REGISTRATION, DATATABLECHARTSINTEGRATIONDOC_PREVIEW_REGISTRATION,
DATATABLECOLUMNDEFINITIONDOC_PREVIEW_REGISTRATION, DATATABLECOLUMNSDOC_PREVIEW_REGISTRATION,
DATATABLEDATASOURCEDOC_PREVIEW_REGISTRATION, DATATABLEEDITINGDOC_PREVIEW_REGISTRATION,
DATATABLEEXPORTDOC_PREVIEW_REGISTRATION, DATATABLERENDERINGDOC_PREVIEW_REGISTRATION,
DATATABLEROWSDOC_PREVIEW_REGISTRATION, DATATABLESELECTIONDOC_PREVIEW_REGISTRATION,
DATATABLESLOTSDOC_PREVIEW_REGISTRATION, DATATABLESORTINGFILTERINGDOC_PREVIEW_REGISTRATION,
DATATABLESTATEDOC_PREVIEW_REGISTRATION,
};
use leptos::prelude::*;
use orbital_macros::component_doc;
use orbital_theme::Direction;
use crate::types::{
AggregationModel, AggregationPosition, DataTableColumnDef, DataTableColumnGroupDef,
DataTableEmptyView, DataTableEvents, DataTableFeatures, DataTableFilter, DataTableFooterSlot,
DataTableHandle, DataTableHeaderChromeConfig, DataTableInitialState, DataTableLoadingView,
DataTableLocale, DataTableNoResultsView, DataTablePivotModel, DataTableRowDetail,
DataTableRowGrouping, DataTableRowModel, DataTableSelectionMode, DataTableSlots, DataTableSort,
DataTableSource, DataTableToolbarConfig, DataTableToolbarSlot, EditMode, GetRowId, GetTreePath,
ListViewConfig, PaginationDisplayFormat, PaginationState, PagingMode, RowDetailView,
ServerFetchPolicy,
};
fn default_page_size_options() -> Option<Vec<u32>> {
Some(vec![10, 25, 50, 100])
}
#[component_doc(
category = "Data Table",
group_priority = 10,
preview_slug = "data-table",
preview_label = "Data Table",
preview_icon = icondata::AiTableOutlined,
)]
#[component]
pub fn DataTable(
#[prop(optional, into)]
class: MaybeProp<String>,
#[prop(optional)]
columns: Option<Vec<DataTableColumnDef>>,
#[prop(optional)]
data_source: Option<DataTableSource>,
#[prop(default = PagingMode::Paged)]
paging: PagingMode,
#[prop(optional)]
items: Option<RwSignal<Vec<DataTableRowModel>>>,
#[prop(default = EditMode::Cell)]
edit_mode: EditMode,
#[prop(default = false)]
show_undo_toolbar: bool,
#[prop(default = DataTableFeatures::empty())]
features: DataTableFeatures,
#[prop(default = DataTableToolbarConfig::default())]
toolbar_config: DataTableToolbarConfig,
#[prop(default = DataTableHeaderChromeConfig::default())]
header_chrome: DataTableHeaderChromeConfig,
#[prop(default = true)]
sortable: bool,
#[prop(default = false)]
resizable_columns: bool,
#[prop(optional)]
column_groups: Option<Vec<DataTableColumnGroupDef>>,
#[prop(optional)]
header_height: Option<f64>,
#[prop(optional)]
height: Option<f64>,
#[prop(optional)]
max_height: Option<f64>,
#[prop(default = false)]
flex: bool,
#[prop(default = false)]
auto_row_height: bool,
#[prop(optional)]
locale: Option<DataTableLocale>,
#[prop(default = PaginationDisplayFormat::Locale)]
pagination_display: PaginationDisplayFormat,
#[prop(default = default_page_size_options())]
page_size_options: Option<Vec<u32>>,
#[prop(optional)]
data_table_toolbar: Option<DataTableToolbarSlot>,
#[prop(optional)]
data_table_toolbar_slot: Option<DataTableToolbarSlot>,
#[prop(optional)]
data_table_footer: Option<DataTableFooterSlot>,
#[prop(optional)]
data_table_footer_slot: Option<DataTableFooterSlot>,
#[prop(optional)]
data_table_empty_view: Option<DataTableEmptyView>,
#[prop(optional)]
data_table_no_results_view: Option<DataTableNoResultsView>,
#[prop(optional)]
data_table_loading_view: Option<DataTableLoadingView>,
#[prop(optional)]
loading: Option<RwSignal<bool>>,
#[prop(optional)]
dir: Option<Direction>,
#[prop(optional)]
get_row_class: Option<Callback<(DataTableRowModel, usize), String>>,
#[prop(optional)]
get_row_id: Option<GetRowId>,
#[prop(optional)]
get_tree_path: Option<GetTreePath>,
#[prop(optional)]
row_grouping: Option<DataTableRowGrouping>,
#[prop(optional)]
aggregation: Option<AggregationModel>,
#[prop(default = AggregationPosition::Footer)]
aggregation_position: AggregationPosition,
#[prop(optional)]
pivot: Option<DataTablePivotModel>,
#[prop(optional)]
list_view: Option<ListViewConfig>,
#[prop(optional)]
data_table_row_detail: Option<DataTableRowDetail>,
#[prop(optional)]
row_detail: Option<RowDetailView>,
#[prop(optional)]
selection_mode: Option<DataTableSelectionMode>,
#[prop(optional)]
initial_state: Option<DataTableInitialState>,
#[prop(optional)]
sort: Option<Signal<Option<DataTableSort>>>,
#[prop(optional)]
filter: Option<Signal<Option<DataTableFilter>>>,
#[prop(optional)]
pagination: Option<Signal<Option<PaginationState>>>,
#[prop(optional)]
selection: Option<Signal<Option<std::collections::HashSet<String>>>>,
#[prop(default = ServerFetchPolicy::default())]
server_fetch_policy: ServerFetchPolicy,
#[prop(optional, default = DataTableEvents::default())]
data_table_events: DataTableEvents,
#[prop(optional)]
events: Option<DataTableEvents>,
#[prop(optional)]
on_handle: Option<Callback<DataTableHandle, ()>>,
#[prop(optional)]
children: Option<Children>,
) -> impl IntoView {
let columns = StoredValue::new(columns.unwrap_or_default());
let column_groups = StoredValue::new(column_groups);
let initial_state = StoredValue::new(initial_state);
let resolved_events = StoredValue::new(Some(DataTableEvents::resolve(
data_table_events,
events,
on_handle,
)));
let items = items.unwrap_or_else(|| RwSignal::new(Vec::new()));
let resolved_source = data_source.unwrap_or_else(|| DataTableSource::client_signal(items));
let data_source = StoredValue::new(resolved_source);
let selection_mode = StoredValue::new(selection_mode);
let selection_mode = Signal::derive(move || selection_mode.get_value());
let get_row_id = StoredValue::new(get_row_id);
let get_tree_path = StoredValue::new(get_tree_path);
let row_grouping = StoredValue::new(row_grouping.unwrap_or_default());
let aggregation = StoredValue::new(aggregation.unwrap_or_default());
let aggregation_position = StoredValue::new(aggregation_position);
let pivot = StoredValue::new(pivot.unwrap_or_default());
let list_view = StoredValue::new(list_view);
let toolbar_slot = data_table_toolbar.or(data_table_toolbar_slot);
let footer_slot = data_table_footer.or(data_table_footer_slot);
let slots = DataTableSlots::from_slot_props(
toolbar_slot,
footer_slot,
data_table_empty_view,
data_table_no_results_view,
data_table_loading_view,
data_table_row_detail,
);
let row_detail = StoredValue::new(slots.row_detail_view(row_detail));
let slots_for_root = slots;
let get_row_class = StoredValue::new(get_row_class);
let locale = StoredValue::new(locale.unwrap_or_default());
let pagination_display = StoredValue::new(pagination_display);
let page_size_options = StoredValue::new(page_size_options);
let direction_override = StoredValue::new(dir);
let toolbar_config = StoredValue::new(toolbar_config);
let header_chrome = StoredValue::new(header_chrome);
let client_loading = loading.unwrap_or_else(|| RwSignal::new(false));
let sort = sort.unwrap_or_else(|| Signal::derive(|| None));
let filter = filter.unwrap_or_else(|| Signal::derive(|| None));
let pagination = pagination.unwrap_or_else(|| Signal::derive(|| None));
let selection = selection.unwrap_or_else(|| Signal::derive(|| None));
let server_fetch_policy = StoredValue::new(server_fetch_policy);
view! {
<DataTableRoot
class=class
columns=columns
column_groups=column_groups
data_source=data_source
paging=paging
features=features
sortable=sortable
resizable_columns=resizable_columns
header_height=header_height
height=height
max_height=max_height
flex=flex
auto_row_height=auto_row_height
get_row_id=get_row_id
get_tree_path=get_tree_path
row_grouping=row_grouping
aggregation=aggregation
aggregation_position=aggregation_position
pivot=pivot
list_view=list_view
row_detail=row_detail
locale=locale
pagination_display=pagination_display
page_size_options=page_size_options
slots=slots_for_root
get_row_class=get_row_class
direction_override=direction_override
client_loading=client_loading
selection_mode=selection_mode
initial_state=initial_state
controlled_sort=sort
controlled_filter=filter
controlled_pagination=pagination
controlled_selection=selection
events=resolved_events
edit_mode=edit_mode
show_undo_toolbar=show_undo_toolbar
toolbar_config=toolbar_config
header_chrome=header_chrome
server_fetch_policy=server_fetch_policy
children=children
/>
}
}