refactor(filter): extract preset management logic into FilterPresetManager

Move filter preset creation, deletion, application, and storage logic
from FilterManager into a dedicated FilterPresetManager class to
improve separation of concerns and maintainability.

- Add FilterPresetManager with preset CRUD operations
- Update FilterManager to use preset manager via composition
- Handle EMPTY_WILDCARD_MARKER for wildcard base model filters
- Add preset-related translations to all locale files
- Update filter preset UI styling and interactions
This commit is contained in:
Will Miao
2026-01-29 16:25:45 +08:00
parent e50b2c802e
commit 08267cdb48
16 changed files with 1383 additions and 247 deletions

View File

@@ -10,7 +10,8 @@
"next": "Далее",
"backToTop": "Наверх",
"settings": "Настройки",
"help": "Справка"
"help": "Справка",
"add": "Добавить"
},
"status": {
"loading": "Загрузка...",
@@ -204,6 +205,19 @@
},
"filter": {
"title": "Фильтр моделей",
"presets": "Пресеты",
"savePreset": "Сохранить текущие активные фильтры как новый пресет.",
"savePresetDisabledActive": "Невозможно сохранить: Пресет уже активен. Измените фильтры, чтобы сохранить новый пресет",
"savePresetDisabledNoFilters": "Сначала выберите фильтры для сохранения как пресет",
"savePresetPrompt": "Введите имя пресета:",
"presetClickTooltip": "Нажмите чтобы применить пресет \"{name}\"",
"presetDeleteTooltip": "Удалить пресет",
"presetDeleteConfirm": "Удалить пресет \"{name}\"?",
"presetDeleteConfirmClick": "Нажмите еще раз для подтверждения",
"presetOverwriteConfirm": "Пресет \"{name}\" уже существует. Перезаписать?",
"presetNamePlaceholder": "Имя пресета...",
"restoreDefaults": "Восстановить по умолчанию",
"noPresets": "Пресеты еще не сохранены. Выберите фильтры ниже и нажмите + для сохранения",
"baseModel": "Базовая модель",
"modelTags": "Теги (Топ 20)",
"modelTypes": "Model Types",
@@ -1419,7 +1433,26 @@
"filters": {
"applied": "{message}",
"cleared": "Фильтры очищены",
"noCustomFilterToClear": "Нет пользовательского фильтра для очистки"
"noCustomFilterToClear": "Нет пользовательского фильтра для очистки",
"noActiveFilters": "Нет активных фильтров для сохранения"
},
"presets": {
"created": "Пресет \"{name}\" создан",
"deleted": "Пресет \"{name}\" удален",
"applied": "Пресет \"{name}\" применен",
"overwritten": "Пресет \"{name}\" перезаписан",
"restored": "Пресеты по умолчанию восстановлены"
},
"error": {
"presetNameEmpty": "Имя пресета не может быть пустым",
"presetNameTooLong": "Имя пресета должно содержать не более {max} символов",
"presetNameInvalidChars": "Имя пресета содержит недопустимые символы",
"presetNameExists": "Пресет с таким именем уже существует",
"maxPresetsReached": "Допустимо максимум {max} пресетов. Удалите один, чтобы добавить больше.",
"presetNotFound": "Пресет не найден",
"invalidPreset": "Недопустимые данные пресета",
"deletePresetFailed": "Не удалось удалить пресет",
"applyPresetFailed": "Не удалось применить пресет"
},
"downloads": {
"imagesCompleted": "Примеры изображений {action} завершены",