pipeline cards: click the title to open the audio details view
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m49s

across review, processing, and done columns the movie/episode name is
now a link to /review/audio/\$id — matches the usual web pattern and
removes an extra click through the now-redundant Details button on
pipeline cards. jellyfin's deep link moves to a small ↗ affordance
next to the title so the 'open in jellyfin' path is still one click
away without hijacking the primary click.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-14 18:24:00 +02:00
parent 47781e04f9
commit 90fd87be61
4 changed files with 35 additions and 20 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "netfelix-audio-fix",
"version": "2026.04.14.18",
"version": "2026.04.14.19",
"scripts": {
"dev:server": "NODE_ENV=development bun --hot server/index.tsx",
"dev:client": "vite",

View File

@@ -1,3 +1,4 @@
import { Link } from "@tanstack/react-router";
import { Badge } from "~/shared/components/ui/badge";
import { api } from "~/shared/lib/api";
import type { PipelineJobItem } from "~/shared/lib/types";
@@ -40,7 +41,13 @@ export function DoneColumn({ items, onMutate }: DoneColumnProps) {
{mark}
</span>
<div className="min-w-0 flex-1">
<p className="text-xs font-medium truncate">{item.name}</p>
<Link
to="/review/audio/$id"
params={{ id: String(item.item_id) }}
className="text-xs font-medium truncate block hover:text-blue-600 hover:underline"
>
{item.name}
</Link>
<Badge variant={item.status === "done" ? "done" : "error"}>{item.status}</Badge>
</div>
</div>

View File

@@ -84,19 +84,27 @@ export function PipelineCard({
<div className={`group rounded-lg border p-3 ${confidenceColor}`}>
<div className="flex items-start justify-between gap-2">
<div className="min-w-0">
{jellyfinLink ? (
<a
href={jellyfinLink}
target="_blank"
rel="noopener noreferrer"
<div className="flex items-center gap-1 min-w-0">
<Link
to="/review/audio/$id"
params={{ id: String(mediaItemId) }}
className="text-sm font-medium truncate block hover:text-blue-600 hover:underline"
onClick={(e) => e.stopPropagation()}
>
{title}
</a>
) : (
<p className="text-sm font-medium truncate">{title}</p>
)}
</Link>
{jellyfinLink && (
<a
href={jellyfinLink}
target="_blank"
rel="noopener noreferrer"
title="Open in Jellyfin"
onClick={(e) => e.stopPropagation()}
className="text-xs text-gray-400 hover:text-blue-600 shrink-0"
>
</a>
)}
</div>
<div className="flex items-center gap-1.5 mt-1 flex-wrap">
{item.transcode_reasons && item.transcode_reasons.length > 0
? item.transcode_reasons.map((r) => (
@@ -153,13 +161,6 @@ export function PipelineCard({
</div>
<div className="flex items-center gap-1 mt-2">
<Link
to="/review/audio/$id"
params={{ id: String(mediaItemId) }}
className="text-xs px-2 py-1 rounded border border-gray-300 text-gray-700 hover:bg-gray-100 no-underline"
>
Details
</Link>
{onSkip && (
<button
type="button"

View File

@@ -1,3 +1,4 @@
import { Link } from "@tanstack/react-router";
import { useEffect, useState } from "react";
import { Badge } from "~/shared/components/ui/badge";
import { api } from "~/shared/lib/api";
@@ -64,7 +65,13 @@ export function ProcessingColumn({ items, progress, queueStatus, onMutate }: Pro
{job ? (
<div className="rounded border bg-white p-3">
<div className="flex items-start justify-between gap-2">
<p className="text-sm font-medium truncate flex-1">{job.name}</p>
<Link
to="/review/audio/$id"
params={{ id: String(job.item_id) }}
className="text-sm font-medium truncate flex-1 hover:text-blue-600 hover:underline"
>
{job.name}
</Link>
<button
type="button"
onClick={stop}