mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-05-06 16:36:45 -03:00
fix(download-history): use title for downloaded tooltip
This commit is contained in:
@@ -1532,6 +1532,8 @@ class ModelCivitaiHandler:
|
|||||||
|
|
||||||
cache = await self._service.scanner.get_cached_data()
|
cache = await self._service.scanner.get_cached_data()
|
||||||
version_index = cache.version_index
|
version_index = cache.version_index
|
||||||
|
downloaded_version_ids: set[int] = set()
|
||||||
|
try:
|
||||||
history_service = await ServiceRegistry.get_downloaded_version_history_service()
|
history_service = await ServiceRegistry.get_downloaded_version_history_service()
|
||||||
downloaded_version_ids = set(
|
downloaded_version_ids = set(
|
||||||
await history_service.get_downloaded_version_ids(
|
await history_service.get_downloaded_version_ids(
|
||||||
@@ -1539,6 +1541,11 @@ class ModelCivitaiHandler:
|
|||||||
model_id,
|
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:
|
for version in versions:
|
||||||
version_id = None
|
version_id = None
|
||||||
|
|||||||
@@ -33,7 +33,6 @@
|
|||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
position: relative;
|
|
||||||
transform: translateZ(0);
|
transform: translateZ(0);
|
||||||
will-change: transform;
|
will-change: transform;
|
||||||
}
|
}
|
||||||
@@ -43,34 +42,6 @@
|
|||||||
font-size: 0.9em;
|
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 */
|
||||||
.early-access-badge {
|
.early-access-badge {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
|
|||||||
@@ -270,13 +270,13 @@ export class DownloadManager {
|
|||||||
<div class="local-path">${localPath || ''}</div>
|
<div class="local-path">${localPath || ''}</div>
|
||||||
</div>`;
|
</div>`;
|
||||||
} else if (hasBeenDownloaded) {
|
} else if (hasBeenDownloaded) {
|
||||||
localStatus = `<div class="downloaded-badge">
|
const downloadedTooltip = translate(
|
||||||
<i class="fas fa-history"></i> ${translate('modals.download.downloaded', {}, 'Downloaded')}
|
|
||||||
<div class="downloaded-info">${translate(
|
|
||||||
'modals.download.downloadedTooltip',
|
'modals.download.downloadedTooltip',
|
||||||
{},
|
{},
|
||||||
'Previously downloaded, but it is not currently in your library.'
|
'Previously downloaded, but it is not currently in your library.'
|
||||||
)}</div>
|
);
|
||||||
|
localStatus = `<div class="downloaded-badge" title="${downloadedTooltip.replace(/"/g, '"')}">
|
||||||
|
<i class="fas fa-history"></i> ${translate('modals.download.downloaded', {}, 'Downloaded')}
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ describe('DownloadManager version history badges', () => {
|
|||||||
expect(items).toHaveLength(2);
|
expect(items).toHaveLength(2);
|
||||||
|
|
||||||
expect(items[0].querySelector('.downloaded-badge')?.textContent).toContain('Downloaded');
|
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.'
|
'Previously downloaded, but it is not currently in your library.'
|
||||||
);
|
);
|
||||||
expect(items[0].querySelector('.local-badge')).toBeNull();
|
expect(items[0].querySelector('.local-badge')).toBeNull();
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from types import SimpleNamespace
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from py.config import config
|
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.services.service_registry import ServiceRegistry
|
||||||
from py.utils.metadata_manager import MetadataManager
|
from py.utils.metadata_manager import MetadataManager
|
||||||
from py.services.model_update_service import ModelUpdateRecord, ModelVersionRecord
|
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
|
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
|
@pytest.mark.asyncio
|
||||||
async def test_refresh_model_updates_filters_records_without_updates():
|
async def test_refresh_model_updates_filters_records_without_updates():
|
||||||
cache = SimpleNamespace(version_index={})
|
cache = SimpleNamespace(version_index={})
|
||||||
|
|||||||
Reference in New Issue
Block a user