fix(plex): a playlist row's menu adds its title to a collection too

The row menu called the title's action list without the anchor the panel opens beside, and the optional parameter dropped the row silently. The anchor is now required, so every host menu decides.
This commit is contained in:
2026-10-08 21:18:48 +02:00
parent 7e94da72b9
commit 0fce732497
3 changed files with 17 additions and 8 deletions
@@ -28,6 +28,7 @@ vi.mock("./confirmContext", () => ({ useConfirm: () => h.confirm }));
import PlexPlaylistView from "./PlexPlaylistView";
import { api, type PlexCard } from "../lib/api";
import { qk } from "../lib/queryKeys";
beforeAll(() => {
class Stub {
@@ -63,15 +64,15 @@ const ep = (id: string, season: number, n: number) =>
thumb: "",
}) as unknown as PlexCard;
function mount(items: PlexCard[], onInfoCard?: (c: PlexCard) => void) {
function mount(items: PlexCard[], onInfoCard?: (c: PlexCard) => void, { admin = false } = {}) {
vi.spyOn(api, "plexPlaylist").mockResolvedValue({ id: 5, title: "Films", items } as never);
vi.spyOn(api, "comfortPins").mockResolvedValue([] as never);
const onPlay = vi.fn();
const onBack = vi.fn();
const client = new QueryClient({ defaultOptions: { queries: { retry: false } } });
if (admin) client.setQueryData(qk.me(), { role: "admin" });
render(
<QueryClientProvider
client={new QueryClient({ defaultOptions: { queries: { retry: false } } })}
>
<QueryClientProvider client={client}>
<PlexPlaylistView playlistId={5} onBack={onBack} onPlay={onPlay} onInfoCard={onInfoCard} />
</QueryClientProvider>,
);
@@ -112,6 +113,13 @@ const pressKey = (key: string) =>
});
describe("PlexPlaylistView · a row's menu", () => {
it("offers an admin a movie's 'Add to collection…', as its card's menu does", async () => {
mount([movie("1")], undefined, { admin: true });
await screen.findByText("Movie 1");
await openMenu(() => fireEvent.click(moreOf("Movie 1")));
expect(menuRows()).toContain("plex.collectionAdd.row");
});
it("has no X at rest: each title ends in its '…', which hides until hover or focus", async () => {
mount([movie("1"), ep("e1", 1, 1)]);
await screen.findByText("Movie 1");