What changed
Major UX rework of every multi-book listing page plus the user-visible product brand.
Calibre-Web NextGen — the new name
The product name on user-visible surfaces switches from "Calibre-Web Automated" to Calibre-Web NextGen: page title, About page, admin version table, CWA settings + stats headings, error pages, OPDS feed description. SPDX headers, copyright credits, and links to the upstream crocodilestick/Calibre-Web-Automated and janeczku/calibre-web projects are untouched — both are still credited as the projects this fork stands on.
Redesigned book organizer
The row of 6–10 icon-only sort buttons that dominated the top of every listing on mobile is replaced with three controls in one row:
- Sort dropdown (left, pinned) — same glyphicons you know, paired with plain-English labels: "Date added, newest first", "Title A → Z", "Author A → Z", "Published, oldest first", and so on.
- Multi-select toggle (right) — flips the page into selection mode. Cover overlays gain checkboxes, tapping a cover toggles selection, hover quick-actions are suppressed. ESC exits.
- Settings gear (right) — dropdown with a placeholder "Cover Settings" entry.
When selection is active, a second row appears under the bar (separated by a thin divider) with three bulk operations:
- Add to Shelf — sub-dropdown of your shelves; 200 / 207 partial-success / 400 all-already-on-shelf are mapped to success / info / info toasts (no more red "Request failed" when books were just duplicates).
- Mark Read / Mark Unread.
- Delete — confirm modal, then bulk delete. Gated on the delete-books role.
These are wired to server endpoints that already existed (/shelf/add_selected_to_shelf, /ajax/readselectedbooks, /ajax/deleteselectedbooks) — no new Python routes shipped here, just the UI that was missing.
Cover badges
Each cover now shows status badges at the bottom-left:
- Green "✓ Read" pill if the book is marked read.
- Up to three shelf capsules stacked below ("Bedside", "To Read", "Favorites"); a "+N" pill if it's on more.
- Faded in selection mode so the checkbox overlay stays dominant.
Mobile
- A "Top" pill appears at the top of the screen after you scroll past 200 px on phone viewports; tap to smooth-scroll back to the top. Hidden on desktop. Honors
prefers-reduced-motion. - Toast feedback for bulk actions sits at the bottom of the screen with a color-coded left border (green / blue / red) — never overlaps the bar.
To get the update
docker pull ghcr.io/new-usemame/calibre-web-nextgen:v4.0.43
Existing instances will continue to display whatever value you previously saved as the page title in admin → settings; new installs default to "Calibre-Web NextGen".
E2E verification
Demo built from this commit, seeded with 26 Project Gutenberg titles and 3 shelves:
- Sort dropdown — every option navigates to the right
?sort_param=…URL on every multi-book page (Books, Hot, New, Best Rated, Read, Unread, Archived, by-author, by-series, by-shelf, search). - Multi-select — capture-phase click handler successfully blocks the Bootstrap detail-modal binding when select mode is on; reverting to the modal binding when select mode is off.
- Add to Shelf (success) — added 3 books to a shelf, verified by visiting the shelf page.
- Add to Shelf (duplicates) — re-added the same 3 books; got "All 3 book(s) were already on Bedside." info toast (not a red error).
- Mark Read / Unread — flash success toast;
/ajax/readselectedbooksreturns 200. - Delete — confirm modal appears, Cancel preserves the library, OK deletes + reloads.
- Cover badges — Crime and Punishment showed green "Read" + Bedside + To Read + Favorites capsules stacked at bottom-left.
- Mobile (390 × 844) — bar collapses to one row, second row stacks vertically, toast slides up from the bottom, scroll-to-top pill appears past 200 px.
- Permission gates — Delete button hidden for users without
role_delete_books(); public-shelf items hidden from the dropdown unlessrole_edit_shelfs().
Files
New:
cps/static/css/book_organizer.csscps/static/js/book_organizer.jscps/templates/_book_organizer.html(Jinja macro module)
Touched:
cps/templates/{index,author,shelf,search,layout,image}.html— bar wiring, cover badges, scroll-to-top, toast/confirm-modal infracps/render_template.py—g.book_shelves_mapprecomputecps/{about,config_sql}.py,cps/templates/{admin,cwa_settings,cwa_stats*,http_error}.html,cps/templates/osd.xml— brand strings