feat: replace all select dropdowns with IconGridSelect, fix EN template seed

Shared grid-items.ts with reusable item definitions for: sort by/order,
album mode, asset type, memory source, locale, response mode, event type
filter, chat action, preview target type, provider type.

Replaced selects on:
- Dashboard: event type, provider, sort (compact mode — auto-width)
- Tracking configs: sort by/order, album modes, asset types, memory source
- Command configs: locale, response mode, provider type
- Targets: chat action
- Template configs: preview target type, provider type
- Command template configs: provider type
- Providers: type selector (read-only during edit)

IconGridSelect: added compact prop for inline filter bars (auto-width,
smaller padding, shows icon + label text).

Backend: template seed now re-creates deleted system templates on startup
using raw SQL to handle legacy NOT NULL columns.

Added i18n: trackingConfig.providerType, trackingConfig.sortRandom
Added provider_type badge to tracking config cards.
This commit is contained in:
2026-03-22 01:17:06 +03:00
parent db7aac5fe8
commit a9bb912c30
11 changed files with 175 additions and 104 deletions
@@ -14,12 +14,14 @@
placeholder = 'Select...',
columns = 2,
disabled = false,
compact = false,
}: {
items: GridItem[];
value: string | number | null;
placeholder?: string;
columns?: number;
disabled?: boolean;
compact?: boolean;
} = $props();
let open = $state(false);
@@ -58,16 +60,16 @@
<svelte:window onkeydown={open ? handleKeydown : undefined} />
<button type="button" bind:this={triggerEl} onclick={toggle}
class="icon-grid-trigger"
class="icon-grid-trigger {compact ? 'icon-grid-compact' : ''}"
class:disabled
style="opacity: {disabled ? 0.5 : 1}; cursor: {disabled ? 'default' : 'pointer'};">
{#if selected}
<span class="icon-grid-trigger-icon"><MdiIcon name={selected.icon} size={18} /></span>
<span class="icon-grid-trigger-icon"><MdiIcon name={selected.icon} size={compact ? 14 : 18} /></span>
<span class="icon-grid-trigger-label">{selected.label}</span>
{:else}
<span class="icon-grid-trigger-label" style="color: var(--color-muted-foreground);">{placeholder}</span>
{/if}
<span class="icon-grid-trigger-arrow"><MdiIcon name="mdiChevronDown" size={14} /></span>
<span class="icon-grid-trigger-arrow"><MdiIcon name="mdiChevronDown" size={compact ? 10 : 14} /></span>
</button>
{#if open}
@@ -113,6 +115,15 @@
.icon-grid-trigger:hover:not(.disabled) {
border-color: var(--color-primary);
}
.icon-grid-compact {
width: auto;
padding: 0.3rem 0.5rem;
gap: 0.3rem;
font-size: 0.8rem;
}
.icon-grid-compact .icon-grid-trigger-label {
flex: none;
}
.icon-grid-trigger-icon {
flex-shrink: 0;
color: var(--color-primary);