apalis-board-web 1.0.0-rc.8

Frontend components for managing Apalis task queues.
Documentation
use leptos::prelude::*;
use leptos_struct_table::*;
use serde::Deserialize;

#[component]
pub fn Paginator(pagination_controller: PaginationController) -> impl IntoView {
    let current_page = pagination_controller.current_page;
    let page_count = pagination_controller.page_count();

    let page_range = move || {
        let mut start = current_page.get().saturating_sub(2);

        let mut end = start + 5;

        if let Some(row_count) = page_count.get()
            && end > row_count
        {
            end = row_count;
            start = end.saturating_sub(5);
        }

        start..end
    };

    view! {
        <nav aria-label="Page navigation " class="my-4 flex justify-end px-2">
            <ul class="inline-flex -space-x-px text-sm">
                <li>
                    <a
                        href="#"
                        class="flex items-center rounded-s-sm justify-center px-3 h-8 ms-0 leading-tight text-charcoal-400 bg-charcoal-900 border border-e-0 border-charcoal-700 rounded-none hover:bg-charcoal-800 hover:text-charcoal-200 dark:bg-charcoal-900 dark:border-charcoal-700 dark:text-charcoal-200 dark:hover:bg-charcoal-800 dark:hover:text-charcoal-100"
                        on:click=move |evt| {
                            evt.prevent_default();
                            evt.stop_propagation();
                            pagination_controller.previous();
                        }
                    >
                        Previous
                    </a>
                </li>

                <For each=page_range key=|page| *page let:page>
                    <PageLink page pagination_controller />
                </For>

                <li>
                    <a
                        href="#"
                        class="flex items-center rounded-e-sm justify-center px-3 h-8 leading-tight text-charcoal-400 bg-charcoal-900 border border-charcoal-700 rounded-none hover:bg-charcoal-800 hover:text-charcoal-200 dark:bg-charcoal-900 dark:border-charcoal-700 dark:text-charcoal-200 dark:hover:bg-charcoal-800 dark:hover:text-charcoal-100"
                        on:click=move |evt| {
                            evt.prevent_default();
                            evt.stop_propagation();
                            pagination_controller.next();
                        }
                    >
                        Next
                    </a>
                </li>
            </ul>
        </nav>
    }
}

#[component]
pub fn PageLink(page: usize, pagination_controller: PaginationController) -> impl IntoView {
    let is_selected = move || pagination_controller.current_page.get() == page;

    let class = move || {
        if is_selected() {
            "flex items-center justify-center px-3 h-8 text-primary bg-background-bright border border-grid-bright rounded-none hover:bg-grid-bright hover:text-text-bright dark:bg-background-bright dark:border-grid-bright dark:text-text-bright dark:hover:bg-grid-bright dark:hover:text-text-bright"
        } else {
            "flex items-center justify-center px-3 h-8 leading-tight text-text-dimmed bg-white border border-grid-bright hover:bg-grid-bright hover:text-text-bright dark:bg-background-dimmed dark:border-grid-bright dark:text-text-dimmed dark:hover:bg-grid-bright dark:hover:text-text-bright"
        }
    };

    view! {
        <li>
            <a
                href="#"
                class=class
                on:click=move |evt| {
                    evt.prevent_default();
                    evt.stop_propagation();
                    pagination_controller.current_page.set(page);
                }
            >

                {page + 1}
            </a>
        </li>
    }
}

#[derive(Deserialize, Debug)]
pub struct MetaResponse {
    pub total: String,
    pub page: String,
    pub page_size: String,
}