From fbb646b8ebddd004460c92747333fd07cfbee3b7 Mon Sep 17 00:00:00 2001 From: Nariman Jelveh Date: Mon, 6 Jul 2026 16:46:31 -0700 Subject: [PATCH] Return index_url from /installedApps for dashboard app titles (#3352) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The dashboard derives a hostname title for anonymous (app-…) apps whose uuid/name/title are all identical, falling back to the host of index_url. That worked for launch/recent apps but not for apps that come only from /installedApps, because the endpoint didn't return index_url. Add apps.index_url to the SELECT (alongside apps.icon, relying on the functional dependency on the apps.id primary key) and assert it in the extension test. --- extensions/installedApps.test.ts | 3 +++ extensions/installedApps.ts | 1 + 2 files changed, 4 insertions(+) diff --git a/extensions/installedApps.test.ts b/extensions/installedApps.test.ts index 5a8c87859..d5d19735f 100644 --- a/extensions/installedApps.test.ts +++ b/extensions/installedApps.test.ts @@ -132,6 +132,9 @@ describe('installedApps extension — handleInstalledApps', () => { expect(list[0].uid).toBe(app!.uid); expect(list[0].name).toBe(app!.name); expect(list[0].title).toBe(app!.title); + // index_url is required so the dashboard can derive a hostname title + // for anonymous (app-…) apps. + expect(list[0].index_url).toBe(app!.index_url); expect(Object.prototype.hasOwnProperty.call(list[0], 'iconUrl')).toBe( true, ); diff --git a/extensions/installedApps.ts b/extensions/installedApps.ts index 9b3014897..62feae22f 100644 --- a/extensions/installedApps.ts +++ b/extensions/installedApps.ts @@ -49,6 +49,7 @@ export const handleInstalledApps = async ( apps.title, apps.description, apps.icon, + apps.index_url, MIN(perm.dt) AS installed_at FROM apps LEFT JOIN user_to_app_permissions AS perm ON apps.id = perm.app_id