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::browser::copy_to_clipboard;
use super::super::filters::{job_state, state_label};
use super::super::types::ListedJob;

#[component]
pub(super) fn JobDetailsModal(job: ListedJob, toast: RwSignal<Option<String>>) -> impl IntoView {
    let row_state = state_label(job_state(&job));
    let job_json = serde_json::to_string_pretty(&job).unwrap_or_default();
    view! {
        <div class="grid gap-3">
            <div class="grid gap-3 md:grid-cols-3">
                <div class="gw-panel p-3"><span class="gw-muted text-xs">"Task"</span><strong class="block">{job.task_identifier.clone()}</strong></div>
                <div class="gw-panel p-3"><span class="gw-muted text-xs">"Queue"</span><strong class="block">{job.queue_name.clone().unwrap_or_else(|| "default".to_string())}</strong></div>
                <div class="gw-panel p-3"><span class="gw-muted text-xs">"State"</span><strong class="block">{row_state}</strong></div>
            </div>
            <label class="grid gap-1 text-sm" for="job-detail-payload">"Payload"
                <textarea id="job-detail-payload" name="job_detail_payload" class="gw-textarea font-mono" readonly>{serde_json::to_string_pretty(&job.payload).unwrap_or_default()}</textarea>
            </label>
            <label class="grid gap-1 text-sm" for="job-detail-last-error">"Last error"
                <textarea id="job-detail-last-error" name="job_detail_last_error" class="gw-textarea font-mono" readonly>{job.last_error.clone().unwrap_or_default()}</textarea>
            </label>
            <div class="flex justify-end gap-2">
                <button class="gw-btn" type="button" on:click=move |_| copy_to_clipboard(job_json.clone(), "Copied job JSON", toast)>
                    <span class="i-lucide-copy h-4 w-4"></span>"Copy JSON"
                </button>
            </div>
        </div>
    }
}