Three-pane layout: feeds, items, item text
Feeds beside, the feed's items above, and the selected item's text with its enclosures below -- the shape iPodderX used. Selecting a row fills the pane below instead of expanding inline; enclosures render there as a player when the file is present and a labelled download when it is not. The divider drags and its position is remembered. The archived site kept no usable screenshot of the original window, only marketing panels, so this follows the description rather than reference art. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AdXho5tTkjFLeUXKbEjKBh
This commit is contained in:
@@ -43,7 +43,7 @@ test('settings opens and saves the global schedule', async ({ page }) => {
|
||||
await expect(page.locator('#gunit')).toHaveValue('h');
|
||||
});
|
||||
|
||||
test('episodes show with their metadata, and notes expand', async ({ page }) => {
|
||||
test('episodes show with their metadata, and the text opens below', async ({ page }) => {
|
||||
await page.getByText('Test Show').click();
|
||||
await expect(page.locator('.ep').first()).toBeVisible({ timeout: 20_000 });
|
||||
await expect(page.getByText('First Episode')).toBeVisible();
|
||||
@@ -53,8 +53,35 @@ test('episodes show with their metadata, and notes expand', async ({ page }) =>
|
||||
await expect(first).toContainText('30:30'); // itunes:duration 1830
|
||||
await expect(page.locator('.ep', { hasText: 'Second Episode' })).toContainText('15:00');
|
||||
|
||||
await first.locator('.t').click();
|
||||
await expect(page.locator('.notes').first()).toContainText('Show notes for the first one');
|
||||
// Selecting an item shows its text in the pane below, not inline in the row.
|
||||
await first.click();
|
||||
await expect(first).toHaveClass(/sel/);
|
||||
await expect(page.locator('#detail')).toContainText('Show notes for the first one');
|
||||
await expect(page.locator('#detail .dt')).toHaveText('First Episode');
|
||||
});
|
||||
|
||||
test('the three panes are there and the item text lands in the bottom one', async ({ page }) => {
|
||||
await page.getByText('Test Show').click();
|
||||
await expect(page.locator('#list')).toBeVisible();
|
||||
await expect(page.locator('#grab')).toBeVisible(); // the draggable divider
|
||||
await expect(page.locator('#detail')).toContainText('Pick an episode');
|
||||
|
||||
await page.locator('.ep', { hasText: 'First Episode' }).click();
|
||||
await expect(page.locator('#detail .dt')).toHaveText('First Episode');
|
||||
// The enclosure travels with the item, into the same pane.
|
||||
await expect(page.locator('#detail .encbox')).toHaveCount(1);
|
||||
|
||||
// Only the downloaded one gets a player, and max_new_per_check is 1, so find it by
|
||||
// its chip rather than assuming which episode the daemon happened to fetch.
|
||||
const downloaded = page.locator('.ep', { hasText: 'downloaded' }).first();
|
||||
await downloaded.click();
|
||||
await expect(page.locator('#detail audio')).toBeVisible();
|
||||
await expect(page.locator('#detail .encbox .btn', { hasText: 'Save' })).toBeVisible();
|
||||
|
||||
// Selecting another item replaces the pane rather than stacking.
|
||||
await page.locator('.ep', { hasText: 'First Episode' }).click();
|
||||
await expect(page.locator('#detail .dt')).toHaveText('First Episode');
|
||||
await expect(page.locator('#detail audio')).toHaveCount(0);
|
||||
});
|
||||
|
||||
test('the filter tabs change what is listed', async ({ page }) => {
|
||||
|
||||
Reference in New Issue
Block a user