Show a revised-chapters count on the story list
This commit is contained in:
@@ -172,6 +172,7 @@ function storyRow(s) {
|
|||||||
{ 'data-label': 'Chapters' },
|
{ 'data-label': 'Chapters' },
|
||||||
String(s.chapter_count),
|
String(s.chapter_count),
|
||||||
s.offsite_count > 0 && [' ', badge('warn', `${s.offsite_count} removed`, 'Chapters the site no longer lists')],
|
s.offsite_count > 0 && [' ', badge('warn', `${s.offsite_count} removed`, 'Chapters the site no longer lists')],
|
||||||
|
s.revised_count > 0 && [' ', badge('info', `${s.revised_count} revised`, 'Chapters the site changed since Bindery added them')],
|
||||||
),
|
),
|
||||||
h(
|
h(
|
||||||
'td',
|
'td',
|
||||||
|
|||||||
+3
-1
@@ -187,7 +187,9 @@ class Store:
|
|||||||
s.message, s.last_checked, s.last_changed, s.ingested_at, s.locked_fields,
|
s.message, s.last_checked, s.last_changed, s.ingested_at, s.locked_fields,
|
||||||
(SELECT COUNT(*) FROM chapters c WHERE c.story_id = s.id AND c.included = 1) AS chapter_count,
|
(SELECT COUNT(*) FROM chapters c WHERE c.story_id = s.id AND c.included = 1) AS chapter_count,
|
||||||
(SELECT COUNT(*) FROM chapters c WHERE c.story_id = s.id AND c.included = 1
|
(SELECT COUNT(*) FROM chapters c WHERE c.story_id = s.id AND c.included = 1
|
||||||
AND c.on_site = 0) AS offsite_count
|
AND c.on_site = 0) AS offsite_count,
|
||||||
|
(SELECT COUNT(*) FROM chapters c WHERE c.story_id = s.id AND c.included = 1
|
||||||
|
AND (SELECT COUNT(*) FROM revisions r WHERE r.chapter_id = c.id) > 1) AS revised_count
|
||||||
FROM stories s ORDER BY s.title COLLATE NOCASE""").fetchall()
|
FROM stories s ORDER BY s.title COLLATE NOCASE""").fetchall()
|
||||||
return [_story(r) for r in rows]
|
return [_story(r) for r in rows]
|
||||||
|
|
||||||
|
|||||||
@@ -263,6 +263,20 @@ test('story list stacks on a narrow screen instead of scrolling sideways', async
|
|||||||
assert.deepEqual(dataLabels, [undefined, 'Author', 'Site', 'Chapters', 'Status', 'Last check']);
|
assert.deepEqual(dataLabels, [undefined, 'Author', 'Site', 'Chapters', 'Status', 'Last check']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('the story list shows removed and revised chapter counts, only when there are any', async () => {
|
||||||
|
details.story.offsite_count = 0;
|
||||||
|
details.story.revised_count = 0;
|
||||||
|
await mountStories();
|
||||||
|
assert.doesNotMatch(main.textContent, /removed/);
|
||||||
|
assert.doesNotMatch(main.textContent, /revised/);
|
||||||
|
cleanups.pop()();
|
||||||
|
details.story.offsite_count = 2;
|
||||||
|
details.story.revised_count = 3;
|
||||||
|
await mountStories();
|
||||||
|
assert.match(main.textContent, /2 removed/);
|
||||||
|
assert.match(main.textContent, /3 revised/);
|
||||||
|
});
|
||||||
|
|
||||||
test('story download modes send selected chapters and clear forced fields after success', async () => {
|
test('story download modes send selected chapters and clear forced fields after success', async () => {
|
||||||
await mountStory();
|
await mountStory();
|
||||||
api.on('POST', 'stories/1/download', { mode_label: 'Queued' });
|
api.on('POST', 'stories/1/download', { mode_label: 'Queued' });
|
||||||
|
|||||||
@@ -33,6 +33,20 @@ def test_chapters_revisions_and_rules(tmp_path):
|
|||||||
assert store.rules(None) != []
|
assert store.rules(None) != []
|
||||||
|
|
||||||
|
|
||||||
|
def test_list_stories_counts_offsite_and_revised_chapters(tmp_path):
|
||||||
|
store = Store(tmp_path / "db.sqlite")
|
||||||
|
sid = store.create_story("https://example/s/1", "example", "T", "A", [])
|
||||||
|
c1 = store.add_chapter(sid, "u1", "One", "<p>1</p>", "h1", "new", 0)
|
||||||
|
c2 = store.add_chapter(sid, "u2", "Two", "<p>2</p>", "h2", "new", 1)
|
||||||
|
store.add_chapter(sid, "u3", "Three", "<p>3</p>", "h3", "new", 2)
|
||||||
|
store.update_chapter(c1, on_site=0)
|
||||||
|
store.add_revision(c2, "<p>2b</p>", "h2b", "recheck")
|
||||||
|
|
||||||
|
story = store.list_stories()[0]
|
||||||
|
assert story["offsite_count"] == 1
|
||||||
|
assert story["revised_count"] == 1
|
||||||
|
|
||||||
|
|
||||||
def test_cover_replaces_previous_cover(tmp_path):
|
def test_cover_replaces_previous_cover(tmp_path):
|
||||||
store = Store(tmp_path / "db.sqlite")
|
store = Store(tmp_path / "db.sqlite")
|
||||||
sid = store.create_story("u", "s", "T", "A", [])
|
sid = store.create_story("u", "s", "T", "A", [])
|
||||||
|
|||||||
Reference in New Issue
Block a user