Merge origin/main into wails-v3
21 conflicts, all from the same cause: three features were developed on both lines and this branch's copies are the ones adapted to v3's bindings and to the file-shaped schema. Resolutions: - `frontend/wailsjs/` stays deleted — v2's generated bindings, replaced by `frontend/bindings/`. - remove-from-library, `library-status.ts`, the requested-badge spec and its component test: took this branch's copies, which differ from main's only in calling `pruneEmptyEntities`/`CountAudioFiles`, importing `@go/download/models.js`, and staging a real UUID for the catalog's `CHECK(length(mbid) = 16)`. - `GetFilePathsByRecordingMBIDsByLibrary` dropped: it joined `recordings`, which no longer exists, and `library_id = 0` answers both scoped and unscoped now. `GetAudioFilesByPaths` was already here. - The album page, the artist page and the library badge kept this branch's versions, which supersede main's: ownership asked once from the files, the partial-completeness ring, and the request action. - Docs: no migration chain (013) over main's two-file column rule and its pre-1.0 squashing note, both of which 013 retired. Kept main's `CreateSmartPlaylist` read-pool example, which is a real second instance of that bug. Verified on the merge result, not on either parent: lint clean in all three build configurations, `make test` green in all three, 776 Vitest tests, `tsc --noEmit`, bindings-check and skill-check clean. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AfVYUVExXsx1nSWrXN8mAh
This commit is contained in:
@@ -144,7 +144,7 @@ meaningless against the seed's one empty playlist, so it builds ten
|
||||
It wraps every bound Go method, so "did that refetch the library" is a
|
||||
fact rather than an inference. It is not a spec and does not run in CI.
|
||||
|
||||
**The cheapest tier needs none of that.** `make ui-test` runs 757
|
||||
**The cheapest tier needs none of that.** `make ui-test` runs 776
|
||||
Vitest tests in a real Chromium with no Wails, no backend, no seeded
|
||||
library and no virtual display, because **v3 routes every runtime call
|
||||
— bindings, event emits, window, dialogs, clipboard — through one IPC
|
||||
@@ -298,12 +298,15 @@ rather than renaming them.
|
||||
`DB.QueryContext`/`QueryContextWith`/`QueryRow` route to a
|
||||
*query-only* read pool (a second `sql.DB` over the same file), so
|
||||
an `INSERT ... RETURNING` issued through one fails at runtime with
|
||||
"attempt to write a readonly database (8)". Use `ExecContext`, or
|
||||
`QueryRowWriter` when the statement really does return a row.
|
||||
Nothing caught this because `NewTestDB` shares one in-memory
|
||||
connection and leaves `readDB` nil, so `reader()` returns the
|
||||
*writer* under test. `TestNoWritesOnTheReadPool` walks the tree for
|
||||
it, in the same spirit as `TestNoDirectRuntimeEmits`.
|
||||
"attempt to write a readonly database (8)" — which is exactly what
|
||||
`CreateSmartPlaylist` did, meaning no smart playlist could be
|
||||
created at all. Use `ExecContext`, or `QueryRowWriter` when the
|
||||
statement really does return a row. Nothing caught this because
|
||||
`NewTestDB` shares one in-memory connection and leaves `readDB`
|
||||
nil, so `reader()` returns the *writer* under test.
|
||||
`TestNoWritesOnTheReadPool` walks the tree for it, in the same
|
||||
spirit as `TestNoDirectRuntimeEmits` and for the same reason — a
|
||||
lint pass only sees one build configuration.
|
||||
- **A new table has to say what kind of data it holds.**
|
||||
`backend/datamap` is a catalogue of every table's Kind and
|
||||
Lifetime, and `TestCatalogCoversSchema` fails on a table missing
|
||||
|
||||
@@ -354,6 +354,25 @@ export class LibraryStatusIndicator extends LitElement {
|
||||
}
|
||||
|
||||
const title = this.tooltip();
|
||||
const icon = this.iconName()
|
||||
? html`<wa-icon name=${this.iconName()} aria-hidden="true"></wa-icon>`
|
||||
: nothing;
|
||||
|
||||
if (this.actionable) {
|
||||
return html`
|
||||
<button
|
||||
class="badge"
|
||||
type="button"
|
||||
title=${title}
|
||||
aria-label=${title}
|
||||
?disabled=${this.busy}
|
||||
@click=${this.onActivate}
|
||||
@keydown=${this.onKeydown}
|
||||
>
|
||||
${icon}
|
||||
</button>
|
||||
`;
|
||||
}
|
||||
|
||||
// The ring stands in for the icon wherever the icon would go —
|
||||
// including inside the button, because a partly-held album is
|
||||
|
||||
Reference in New Issue
Block a user