fix(download-history): use title for downloaded tooltip

This commit is contained in:
Will Miao
2026-04-13 20:26:40 +08:00
parent a95c518b30
commit 70cd3f4e1b
5 changed files with 77 additions and 43 deletions

View File

@@ -1532,13 +1532,20 @@ class ModelCivitaiHandler:
cache = await self._service.scanner.get_cached_data()
version_index = cache.version_index
history_service = await ServiceRegistry.get_downloaded_version_history_service()
downloaded_version_ids = set(
await history_service.get_downloaded_version_ids(
self._service.model_type,
model_id,
downloaded_version_ids: set[int] = set()
try:
history_service = await ServiceRegistry.get_downloaded_version_history_service()
downloaded_version_ids = set(
await history_service.get_downloaded_version_ids(
self._service.model_type,
model_id,
)
)
except Exception as exc: # pragma: no cover - defensive logging
self._logger.debug(
"Failed to load download history for CivitAI versions: %s",
exc,
)
)
for version in versions:
version_id = None

View File

@@ -33,7 +33,6 @@
font-weight: 500;
white-space: nowrap;
flex-shrink: 0;
position: relative;
transform: translateZ(0);
will-change: transform;
}
@@ -43,34 +42,6 @@
font-size: 0.9em;
}
.downloaded-info {
display: none;
position: absolute;
top: 100%;
right: 0;
background: var(--card-bg);
border: 1px solid color-mix(in oklch, var(--badge-update-bg, #4a90e2) 50%, transparent);
border-radius: var(--border-radius-xs);
padding: var(--space-1);
margin-top: 4px;
font-size: 0.9em;
color: var(--text-color);
white-space: normal;
word-break: break-word;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
z-index: 100;
min-width: 240px;
max-width: 320px;
transform: translateZ(0);
position: fixed;
pointer-events: none;
}
.downloaded-badge:hover .downloaded-info {
display: block;
pointer-events: auto;
}
/* Early Access Badge */
.early-access-badge {
display: inline-flex;

View File

@@ -270,13 +270,13 @@ export class DownloadManager {
<div class="local-path">${localPath || ''}</div>
</div>`;
} else if (hasBeenDownloaded) {
localStatus = `<div class="downloaded-badge">
const downloadedTooltip = translate(
'modals.download.downloadedTooltip',
{},
'Previously downloaded, but it is not currently in your library.'
);
localStatus = `<div class="downloaded-badge" title="${downloadedTooltip.replace(/"/g, '&quot;')}">
<i class="fas fa-history"></i> ${translate('modals.download.downloaded', {}, 'Downloaded')}
<div class="downloaded-info">${translate(
'modals.download.downloadedTooltip',
{},
'Previously downloaded, but it is not currently in your library.'
)}</div>
</div>`;
}

View File

@@ -127,7 +127,7 @@ describe('DownloadManager version history badges', () => {
expect(items).toHaveLength(2);
expect(items[0].querySelector('.downloaded-badge')?.textContent).toContain('Downloaded');
expect(items[0].querySelector('.downloaded-info')?.textContent).toContain(
expect(items[0].querySelector('.downloaded-badge')?.getAttribute('title')).toContain(
'Previously downloaded, but it is not currently in your library.'
);
expect(items[0].querySelector('.local-badge')).toBeNull();

View File

@@ -6,7 +6,7 @@ from types import SimpleNamespace
import pytest
from py.config import config
from py.routes.handlers.model_handlers import ModelUpdateHandler
from py.routes.handlers.model_handlers import ModelCivitaiHandler, ModelUpdateHandler
from py.services.service_registry import ServiceRegistry
from py.utils.metadata_manager import MetadataManager
from py.services.model_update_service import ModelUpdateRecord, ModelVersionRecord
@@ -163,6 +163,62 @@ async def test_build_version_context_includes_download_history(monkeypatch):
assert overrides[124]["has_been_downloaded"] is False
@pytest.mark.asyncio
async def test_get_civitai_versions_degrades_when_download_history_unavailable(monkeypatch):
cache = SimpleNamespace(version_index={})
service = DummyService(cache)
class DummyProvider:
async def get_model_versions(self, model_id):
assert model_id == "42"
return {
"type": "lora",
"modelVersions": [
{
"id": 7,
"name": "Version 7",
"files": [],
}
],
}
async def fake_history_service_factory():
raise RuntimeError("download history unavailable")
monkeypatch.setattr(
ServiceRegistry,
"get_downloaded_version_history_service",
staticmethod(fake_history_service_factory),
)
async def metadata_provider_factory():
return DummyProvider()
handler = ModelCivitaiHandler(
service=service,
settings_service=SimpleNamespace(get=lambda *_: False),
ws_manager=SimpleNamespace(),
logger=logging.getLogger(__name__),
metadata_provider_factory=metadata_provider_factory,
validate_model_type=lambda *_: True,
expected_model_types=lambda: "LoRA",
find_model_file=lambda *_: None,
metadata_sync=SimpleNamespace(),
metadata_refresh_use_case=SimpleNamespace(),
metadata_progress_callback=lambda *_args, **_kwargs: None,
)
response = await handler.get_civitai_versions(
SimpleNamespace(match_info={"model_id": "42"})
)
payload = json.loads(response.text)
assert response.status == 200
assert payload[0]["id"] == 7
assert payload[0]["existsLocally"] is False
assert payload[0]["hasBeenDownloaded"] is False
@pytest.mark.asyncio
async def test_refresh_model_updates_filters_records_without_updates():
cache = SimpleNamespace(version_index={})