From 6c77ca8f2b57c58ca50cebc8e138a2347d33039c Mon Sep 17 00:00:00 2001 From: Mark Lierman Date: Thu, 12 Feb 2026 22:51:14 -0500 Subject: [PATCH 1/3] Added tag search --- backend/settings/settings.go | 25 +++++- .../lib/components/left-bar/Settings.svelte | 56 +++++++++++++ .../lib/components/mods-list/ModsList.svelte | 39 +++++++-- .../mods-list/ModsListFilters.svelte | 82 ++++++++++++++++++- frontend/src/lib/store/modFiltersStore.ts | 8 ++ frontend/src/lib/store/settingsStore.ts | 9 ++ 6 files changed, 207 insertions(+), 12 deletions(-) diff --git a/backend/settings/settings.go b/backend/settings/settings.go index 7f0b1a26..d51c089e 100644 --- a/backend/settings/settings.go +++ b/backend/settings/settings.go @@ -16,8 +16,9 @@ import ( ) type SavedModFilters struct { - Order string `json:"order"` - Filter string `json:"filter"` + Order string `json:"order"` + Filter string `json:"filter"` + TagSearchMode string `json:"tagSearchMode,omitempty"` // "any" or "and" } type View string @@ -83,8 +84,9 @@ var Settings = &settings{ FavoriteMods: []string{}, ModFilters: SavedModFilters{ - Order: "last-updated", - Filter: "compatible", + Order: "last-updated", + Filter: "compatible", + TagSearchMode: "any", }, RemoteNames: map[string]string{}, @@ -182,6 +184,21 @@ func (s *settings) SetModFiltersFilter(filter string) { _ = SaveSettings() } +func (s *settings) GetModFiltersTagSearchMode() string { + if s.ModFilters.TagSearchMode != "and" && s.ModFilters.TagSearchMode != "any" { + return "any" + } + return s.ModFilters.TagSearchMode +} + +func (s *settings) SetModFiltersTagSearchMode(mode string) { + if mode != "and" && mode != "any" { + return + } + s.ModFilters.TagSearchMode = mode + _ = SaveSettings() +} + func (s *settings) emitFavoriteMods() { wailsRuntime.EventsEmit(common.AppContext, "favoriteMods", s.FavoriteMods) } diff --git a/frontend/src/lib/components/left-bar/Settings.svelte b/frontend/src/lib/components/left-bar/Settings.svelte index 7db6b661..d2d85ecb 100644 --- a/frontend/src/lib/components/left-bar/Settings.svelte +++ b/frontend/src/lib/components/left-bar/Settings.svelte @@ -22,6 +22,7 @@ queueAutoStart, saveWindowPosition, startView, + tagSearchMode, updateCheckMode, version, } from '$lib/store/settingsStore'; @@ -63,6 +64,27 @@ }, ]; + const tagSearchModeMenu = { + event: 'click', + target: 'tag-search-mode-menu', + middleware: { + offset: 4, + }, + placement: 'right-start', + closeQuery: '[data-popup="tag-search-mode-menu"] .listbox-item', + } satisfies PopupSettings; + + $: tagSearchModes = [ + { + id: 'any' as const, + name: $t('settings.tag-search.any', 'Match any'), + }, + { + id: 'and' as const, + name: $t('settings.tag-search.and', 'Match all'), + }, + ]; + const updateCheckModeMenu = { event: 'click', target: 'update-check-mode-menu', @@ -277,6 +299,27 @@ +
+ +
+
+
+ +
+ +
Date: Fri, 13 Feb 2026 08:17:09 -0500 Subject: [PATCH 3/3] Fix for linter errors --- backend/settings/settings.go | 15 +++++++++----- .../lib/components/mods-list/ModsList.svelte | 2 +- .../mods-list/ModsListFilters.svelte | 20 +++++++++---------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/backend/settings/settings.go b/backend/settings/settings.go index d51c089e..b7aa8793 100644 --- a/backend/settings/settings.go +++ b/backend/settings/settings.go @@ -18,7 +18,7 @@ import ( type SavedModFilters struct { Order string `json:"order"` Filter string `json:"filter"` - TagSearchMode string `json:"tagSearchMode,omitempty"` // "any" or "and" + TagSearchMode string `json:"tagSearchMode,omitempty"` } type View string @@ -36,6 +36,11 @@ var ( UpdateAsk UpdateCheckMode = "ask" ) +const ( + TagSearchModeAny = "any" + TagSearchModeAnd = "and" +) + type settings struct { WindowPosition *utils.Position `json:"windowPosition,omitempty"` Maximized bool `json:"maximized,omitempty"` @@ -86,7 +91,7 @@ var Settings = &settings{ ModFilters: SavedModFilters{ Order: "last-updated", Filter: "compatible", - TagSearchMode: "any", + TagSearchMode: TagSearchModeAny, }, RemoteNames: map[string]string{}, @@ -185,14 +190,14 @@ func (s *settings) SetModFiltersFilter(filter string) { } func (s *settings) GetModFiltersTagSearchMode() string { - if s.ModFilters.TagSearchMode != "and" && s.ModFilters.TagSearchMode != "any" { - return "any" + if s.ModFilters.TagSearchMode != TagSearchModeAnd && s.ModFilters.TagSearchMode != TagSearchModeAny { + return TagSearchModeAny } return s.ModFilters.TagSearchMode } func (s *settings) SetModFiltersTagSearchMode(mode string) { - if mode != "and" && mode != "any" { + if mode != TagSearchModeAnd && mode != TagSearchModeAny { return } s.ModFilters.TagSearchMode = mode diff --git a/frontend/src/lib/components/mods-list/ModsList.svelte b/frontend/src/lib/components/mods-list/ModsList.svelte index dcf9fc9f..60e6a1bb 100644 --- a/frontend/src/lib/components/mods-list/ModsList.svelte +++ b/frontend/src/lib/components/mods-list/ModsList.svelte @@ -15,7 +15,7 @@ import { favoriteMods, lockfileMods, manifestMods, selectedProfileTargets } from '$lib/store/ficsitCLIStore'; import { expandedMod, hasFetchedMods } from '$lib/store/generalStore'; import { type OfflineMod, type PartialMod, type TagOption, filter, filterOptions, order, search, selectedTags } from '$lib/store/modFiltersStore'; - import { offline, tagSearchMode, startView } from '$lib/store/settingsStore'; + import { offline, startView, tagSearchMode } from '$lib/store/settingsStore'; import { OfflineGetMods } from '$wailsjs/go/ficsitcli/ficsitCLI'; const dispatch = createEventDispatcher(); diff --git a/frontend/src/lib/components/mods-list/ModsListFilters.svelte b/frontend/src/lib/components/mods-list/ModsListFilters.svelte index fb94868f..eb2f0161 100644 --- a/frontend/src/lib/components/mods-list/ModsListFilters.svelte +++ b/frontend/src/lib/components/mods-list/ModsListFilters.svelte @@ -6,9 +6,9 @@ import Marquee from '$lib/components/Marquee.svelte'; import SvgIcon from '$lib/components/SVGIcon.svelte'; import Select from '$lib/components/Select.svelte'; + import { type PopupSettings, popup } from '$lib/skeletonExtensions'; import { type FilterField, type OrderByField, type TagOption, filter, filterOptions, order, orderByOptions, search, selectedTags } from '$lib/store/modFiltersStore'; import { tagSearchMode } from '$lib/store/settingsStore'; - import { type PopupSettings, popup } from '$lib/skeletonExtensions'; export let availableTags: TagOption[] = []; $: selectedTagIds = new Set($selectedTags.map((t) => t.id)); @@ -16,7 +16,7 @@ $selectedTags = $selectedTags.filter((t) => availableTags.some((a) => a.id === t.id)); } - let tagPopupOpen = false; + let _tagPopupOpen = false; const tagPopupName = 'modsTagFilter'; const tagPopup: PopupSettings = { event: 'click', @@ -34,7 +34,7 @@ } as SizeOptions, shift: { padding: 0 }, }, - state: ({ state }) => (tagPopupOpen = state), + state: ({ state }) => (_tagPopupOpen = state), }; function toggleTag(tag: TagOption) { @@ -86,9 +86,9 @@