Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 7 additions & 19 deletions gui/frontend/src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1942,30 +1942,18 @@ export default function App() {
return [...manual, ...auto];
};

// The overrides in effect, not the ones edited since the last preview: a preview
// round-trip echoes them back into preview.ReleaseNameOverrides, so a diff against
// that snapshot empties itself as soon as the metadata is refreshed.
const namingOverrides = useMemo(() => {
const stored =
preview.ReleaseNameOverrides && typeof preview.ReleaseNameOverrides === "object"
? preview.ReleaseNameOverrides
: {};
const overrides = releaseOverrideState?.dirty
? releaseOverrideState.overrides
: preview.ReleaseNameOverrides || {};
return Object.entries(overrides || {}).filter(([key, value]) => {
return Object.entries(overrides || {}).filter(([, value]) => {
if (value === null || value === undefined) return false;
const storedValue = (stored as Record<string, unknown>)[key];
if (typeof value === "string") {
const current = value.trim();
const prev = typeof storedValue === "string" ? storedValue.trim() : "";
return current !== prev;
}
if (typeof value === "number") {
const prev = typeof storedValue === "number" ? storedValue : 0;
return value !== prev;
}
if (typeof value === "boolean") {
const prev = typeof storedValue === "boolean" ? storedValue : false;
return value !== prev;
}
if (typeof value === "string") return value.trim() !== "";
if (typeof value === "number") return value !== 0;
if (typeof value === "boolean") return value;
return false;
});
}, [preview.ReleaseNameOverrides, releaseOverrideState]);
Expand Down
16 changes: 16 additions & 0 deletions gui/frontend/src/pages/tracker_upload/index.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,22 @@ describe("TrackerUploadPage", () => {
expect(screen.queryByText(/Upload:/)).toBeNull();
});

it("shows the prepared release name before a dry run runs", () => {
render(<TrackerUploadPage {...baseProps} dryRunPreview={{ ...dryRunPreview, Trackers: [] }} />);

expect(screen.getByText("Example Movie 2160p WEB-DL DD+ 5.1-GRP")).toBeTruthy();
expect(
screen.getByText(/Prepared name — run a dry run to resolve the AITHER upload name\./),
).toBeTruthy();
});

it("lists the naming overrides in effect", () => {
render(<TrackerUploadPage {...baseProps} namingOverrides={[["Tag", "-GRP"]]} />);

expect(screen.getByText("Naming overrides (1)")).toBeTruthy();
expect(screen.getByText("-GRP")).toBeTruthy();
});

it("shows rule warnings without blocking tracker eligibility", () => {
render(
<TrackerUploadPage
Expand Down
34 changes: 21 additions & 13 deletions gui/frontend/src/pages/tracker_upload/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,20 @@ export default function TrackerUploadPage(props: Readonly<Props>) {
</p>
))}

{releaseNameChanged ? null : (
<div className="grid gap-0.5">
<p className="label">Release name</p>
<p className="value mono [overflow-wrap:anywhere]">
{uploadReleaseName || originalReleaseName || "No release name yet"}
</p>
{!uploadReleaseName && originalReleaseName ? (
<p className="muted text-xs">
Prepared name — run a dry run to resolve the {tracker.name} upload name.
</p>
) : null}
</div>
)}

{releaseNameChanged ? (
<div className="grid gap-1 rounded-md border border-amber-300/55 bg-amber-300/12 px-2.5 py-2">
<div className="flex flex-wrap items-center gap-1.5">
Expand Down Expand Up @@ -899,21 +913,15 @@ export default function TrackerUploadPage(props: Readonly<Props>) {
{namingOverrides.length > 0 ? (
<details>
<summary className="cursor-pointer list-none text-sm font-semibold marker:content-[''] [&::-webkit-details-marker]:hidden">
Naming changes
Naming overrides ({namingOverrides.length})
</summary>
<div className="mt-2 grid gap-1.5">
<div>
<p className="label">Release name</p>
<p className="value mono">{preview.ReleaseName || "No release name yet"}</p>
</div>
<div className="grid gap-1.5">
{namingOverrides.map(([key, value]) => (
<div className={subtleBox} key={key}>
<p className="label">{formatLabel(key)}</p>
<p className="value mono">{String(value)}</p>
</div>
))}
</div>
{namingOverrides.map(([key, value]) => (
<div className={subtleBox} key={key}>
<p className="label">{formatLabel(key)}</p>
<p className="value mono">{String(value)}</p>
</div>
))}
</div>
</details>
) : null}
Expand Down
Loading