fix(v3): pedal click opens the plugin's screen, not its settings (#556)

The v3 Pedalboard's settingsTarget() resolved settings-first, so a
plugin that ships both a screen and a settings panel (notably the
bundled Audio Engine) could only ever reach its settings from the
pedalboard — its actual page was unreachable.

Flip to screen-first (stompbox metaphor: step on the pedal, see the
pedal), falling back to settings when there is no screen. Keep a
settings fallback in openPluginSettings() when a declared screen
isn't mounted yet (installing/failed) so settings-bearing plugins are
never stranded on a toast. Drive the pedal aria-label off the same
target so it never promises the wrong surface. Update the unit test
contract to screen > settings > none.

Fixes #555

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Byron Gamatos
2026-06-22 10:07:36 +02:00
committed by GitHub
co-authored by Claude Opus 4.8
parent 63eb7a4ffc
commit f79efe2516
2 changed files with 25 additions and 8 deletions
+6 -2
View File
@@ -73,11 +73,15 @@ test('thumbUrl: manifest icon routes through the asset endpoint; else default',
assert.equal(t.thumbUrl({ id: 'x', icon: '' }), '/static/v3/pedal-default.svg');
});
test('settingsTarget: settings > screen > none', () => {
test('settingsTarget: screen > settings > none', () => {
const { t } = loadPage();
assert.deepEqual(t.settingsTarget({ id: 'a', has_settings: true, nav: true }), { kind: 'settings', id: 'a' });
// A screen wins even when the plugin also has settings (e.g. audio_engine):
// the pedal opens the plugin's page, not its settings panel.
assert.deepEqual(t.settingsTarget({ id: 'a', has_settings: true, nav: true }), { kind: 'screen', id: 'a' });
assert.deepEqual(t.settingsTarget({ id: 'b', has_settings: false, nav: true }), { kind: 'screen', id: 'b' });
assert.deepEqual(t.settingsTarget({ id: 'c', has_settings: false, has_screen: true }), { kind: 'screen', id: 'c' });
// Settings-only plugin (no screen) falls back to its settings panel.
assert.deepEqual(t.settingsTarget({ id: 'e', has_settings: true }), { kind: 'settings', id: 'e' });
assert.deepEqual(t.settingsTarget({ id: 'd' }), { kind: 'none', id: 'd' });
});