diff --git a/api/internal/db/applications.go b/api/internal/db/applications.go index 603bcbbc..2e27666e 100644 --- a/api/internal/db/applications.go +++ b/api/internal/db/applications.go @@ -167,7 +167,7 @@ func (a *ApplicationDB) GetApplication(ctx context.Context, appID string) (*mode COALESCE(ct.name, '') as template_name, COALESCE(ct.display_name, ia.display_name) as template_display_name, COALESCE(ct.description, '') as description, COALESCE(ct.category, '') as category, COALESCE(ct.app_type, '') as app_type, COALESCE(ct.icon_url, '') as icon_url, - COALESCE(ct.manifest, '') as manifest, + COALESCE(ct.manifest::text, '{}') as manifest, COALESCE(ia.install_status, '') as install_status, COALESCE(ia.install_message, '') as install_message FROM installed_applications ia diff --git a/ui/src/lib/api.ts b/ui/src/lib/api.ts index f8bda7c9..821301f8 100644 --- a/ui/src/lib/api.ts +++ b/ui/src/lib/api.ts @@ -1151,7 +1151,7 @@ class APIClient { // ============================================================================ async listApplications(enabledOnly?: boolean): Promise<{ applications: InstalledApplication[]; total: number }> { - const params: Record = {}; + const params: Record = { _t: Date.now().toString() }; // Cache bust if (enabledOnly) params.enabled = 'true'; const response = await this.client.get<{ applications: InstalledApplication[]; total: number }>('/applications', { params }); return response.data; diff --git a/ui/src/pages/Applications.tsx b/ui/src/pages/Applications.tsx index 7ad371c0..130a2a55 100644 --- a/ui/src/pages/Applications.tsx +++ b/ui/src/pages/Applications.tsx @@ -191,6 +191,8 @@ function ApplicationsContent() { try { await api.deleteApplication(selectedApp.id); + // Optimistically remove from state immediately for instant UI feedback + setApplications(prev => prev.filter(app => app.id !== selectedApp.id)); addNotification({ message: 'Application deleted successfully', severity: 'success', @@ -198,6 +200,7 @@ function ApplicationsContent() { }); setDeleteDialogOpen(false); setSelectedApp(null); + // Still refresh to ensure consistency with server await loadApplications(); } catch (error) { console.error('Failed to delete application:', error);