diff --git a/src/lib/components/widget/WidgetConfigPanel.svelte b/src/lib/components/widget/WidgetConfigPanel.svelte index 9b5aecc..d863703 100644 --- a/src/lib/components/widget/WidgetConfigPanel.svelte +++ b/src/lib/components/widget/WidgetConfigPanel.svelte @@ -2,11 +2,19 @@ import { t } from 'svelte-i18n'; import { fade } from 'svelte/transition'; import { tick } from 'svelte'; + import DynamicIcon from '$lib/components/ui/DynamicIcon.svelte'; + + interface AppInfo { + id: string; + name: string; + icon?: string | null; + iconType?: string; + } interface Props { widgetType: string; initialConfig?: Record; - apps?: Array<{ id: string; name: string }>; + apps?: AppInfo[]; mode: 'create' | 'edit'; onSave: (config: Record) => void; onCancel: () => void; @@ -14,6 +22,14 @@ let { widgetType, initialConfig = {}, apps = [], mode, onSave, onCancel }: Props = $props(); + // App search + let appSearchQuery = $state(''); + const filteredApps = $derived( + appSearchQuery.trim() + ? apps.filter((a) => a.name.toLowerCase().includes(appSearchQuery.toLowerCase())) + : apps + ); + // -- Form fields initialised from config -- // App let appId = $state((initialConfig.appId as string) ?? ''); @@ -173,12 +189,53 @@ {#if widgetType === 'app'}
- + +
+ + + + +
+ +
+ {#if filteredApps.length === 0} +

{$t('common.no_results') ?? 'No apps found'}

+ {:else} +
+ {#each filteredApps as app} + + {/each} +
+ {/if} +
{:else if widgetType === 'bookmark'} diff --git a/src/lib/components/widget/WidgetGrid.svelte b/src/lib/components/widget/WidgetGrid.svelte index cd7df91..fc135d8 100644 --- a/src/lib/components/widget/WidgetGrid.svelte +++ b/src/lib/components/widget/WidgetGrid.svelte @@ -109,7 +109,7 @@ } } - const appsForPicker = $derived(allApps.map((a) => ({ id: a.id, name: a.name }))); + const appsForPicker = $derived(allApps.map((a) => ({ id: a.id, name: a.name, icon: a.icon, iconType: a.iconType }))); {#if widgets.length === 0 && !editMode.active}