canonrs-client 0.1.0

CanonRS client-side runtime
#![allow(unreachable_pub)]
use leptos::prelude::*;
use canonrs_core::DataTablePaginationPrimitive;

#[component]
pub fn DataTablePagination(
    current_page: RwSignal<usize>,
    total: RwSignal<usize>,
    page_size: usize,
) -> impl IntoView {
    let handle_prev = move |_| {
        current_page.update(|page| {
            if *page > 1 { *page -= 1; }
        });
    };

    let handle_next = move |_| {
        let t = total.get();
        let total_pages = ((t as f32) / (page_size as f32)).ceil() as usize;
        current_page.update(|page| {
            if *page < total_pages { *page += 1; }
        });
    };

    view! {
        <DataTablePaginationPrimitive>
            <div>
                {move || {
                    let t = total.get();
                    let page = current_page.get();
                    let start = (page - 1) * page_size + 1;
                    let end = (start + page_size).saturating_sub(1).min(t);
                    format!("Showing {}-{} of {}", start, end, t)
                }}
            </div>
            <div class="flex gap-2">
                <button
                    on:click=handle_prev
                    class="px-3 py-1 border rounded"
                    disabled=move || current_page.get() == 1
                >"Previous"</button>
                <button
                    on:click=handle_next
                    class="px-3 py-1 border rounded"
                    disabled=move || {
                        let t = total.get();
                        let total_pages = ((t as f32) / (page_size as f32)).ceil() as usize;
                        current_page.get() >= total_pages
                    }
                >"Next"</button>
            </div>
        </DataTablePaginationPrimitive>
    }
}