graphile_worker_admin_ui_client 0.1.3

Leptos WASM client for the embedded graphile_worker admin UI
Documentation
use leptos::prelude::*;

use super::super::types::OverviewResponse;

#[component]
pub(in crate::wasm) fn QueuesPanel(
    overview: RwSignal<OverviewResponse>,
    queue_filter: RwSignal<String>,
) -> impl IntoView {
    view! {
        <div id="queues" class="gw-panel">
            <div class="flex items-center gap-2 border-b p-3" style="border-color: rgb(var(--border));">
                <span class="i-lucide-git-branch h-4 w-4"></span>
                <h3 class="font-semibold">"Queues"</h3>
            </div>
            <div class="divide-y" style="border-color: rgb(var(--border));">
                {move || if overview.get().queues.is_empty() {
                    view! { <div class="p-4 gw-muted">"No queues yet."</div> }.into_any()
                } else {
                    ().into_any()
                }}
                <For
                    each=move || overview.get().queues
                    key=|queue| queue.id
                    children=move |queue| {
                        let queue_name = queue.queue_name.clone();
                        view! {
                            <div class="flex items-center justify-between gap-3 p-3">
                                <div class="min-w-0">
                                    <button class="truncate font-medium hover:underline" type="button" on:click=move |_| {
                                        queue_filter.set(queue_name.clone());
                                        if let Some(window) = web_sys::window() {
                                            let _ = window.location().set_hash("jobs");
                                        }
                                    }>{queue.queue_name.clone()}</button>
                                    <p class="gw-muted text-xs">{queue.locked_by.clone().map(|worker| format!("locked by {worker}")).unwrap_or_else(|| "unlocked".to_string())}</p>
                                </div>
                                <div class="flex gap-2">
                                    <span class="gw-pill">{format!("{} ready", queue.ready_count)}</span>
                                    <span class="gw-pill">{format!("{} total", queue.job_count)}</span>
                                </div>
                            </div>
                        }
                    }
                />
            </div>
        </div>
    }
}