From 4ea3f7d50f4dd7a700a319b17740113bb41fdb9c Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Sun, 2 Aug 2026 15:42:15 +0200 Subject: [PATCH] fix(frontend): clarify CivArchive error tooltips --- tests/test_search_source_methods.mjs | 7 ++++++- web/resolver/actions/resolve_download_methods.js | 9 +++++++-- web/resolver/search/search_source_methods.js | 7 +++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/tests/test_search_source_methods.mjs b/tests/test_search_source_methods.mjs index 5c67c87..45376b7 100644 --- a/tests/test_search_source_methods.mjs +++ b/tests/test_search_source_methods.mjs @@ -5,6 +5,7 @@ import { searchSourceMethods } from '../web/resolver/search/search_source_method const { getSearchSourceLabel, getSearchSourceErrorMessage, + getSearchSourceErrorTooltip, getSearchSourceDefinitions, getSearchResultKeysForSources, getHashLookupSourcesForSearchSources, @@ -54,7 +55,7 @@ test('search source labels and definitions remain stable', () => { }); test('CivArchive availability failures receive a user-facing retry message', () => { - const dialog = { getSearchSourceLabel }; + const dialog = { getSearchSourceLabel, getSearchSourceErrorMessage }; const temporaryFailure = getSearchSourceErrorMessage.call( dialog, 'civarchive', @@ -77,6 +78,10 @@ test('CivArchive availability failures receive a user-facing retry message', () getSearchSourceErrorMessage.call(dialog, 'civitai', 'CivAI request timed out'), 'CivAI request timed out' ); + assert.equal( + getSearchSourceErrorTooltip.call(dialog, 'civarchive', 'CivArchive search failed: HTTP 522'), + 'CivArchive may be overloaded or temporarily unavailable. Please try again later. Details: CivArchive search failed: HTTP 522' + ); }); test('search source selection maps source ids to result and hash keys', () => { diff --git a/web/resolver/actions/resolve_download_methods.js b/web/resolver/actions/resolve_download_methods.js index a2540e4..32addcf 100644 --- a/web/resolver/actions/resolve_download_methods.js +++ b/web/resolver/actions/resolve_download_methods.js @@ -2486,6 +2486,9 @@ export const resolveDownloadMethods = { const sourceErrorMessage = sourceError ? (this.getSearchSourceErrorMessage?.(source, sourceError) || sourceError) : null; + const sourceErrorTooltip = sourceError + ? (this.getSearchSourceErrorTooltip?.(source, sourceError) || sourceErrorMessage) + : null; if (sourceErrorMessage) sourceErrorMessages.add(sourceErrorMessage); const found = this.hasSearchResults(data); @@ -2506,7 +2509,7 @@ export const resolveDownloadMethods = { status: sourceError ? 'error' : (found ? 'found' : 'none'), percent: 100, message: sourceErrorMessage || (found ? foundMessage : 'No match'), - error: sourceError || null + error: sourceErrorTooltip }, missing, { workflowKey }); if (data.civitai) { @@ -2553,6 +2556,8 @@ export const resolveDownloadMethods = { const sourceErrorMessage = this.getSearchSourceErrorMessage?.(source, error.message) || error.message || 'Error'; + const sourceErrorTooltip = this.getSearchSourceErrorTooltip?.(source, error.message) + || sourceErrorMessage; sourceErrorMessages.add(sourceErrorMessage); state.lastAttemptSources = Array.from(attemptedSources); state.lastAttemptFound = anyFound; @@ -2562,7 +2567,7 @@ export const resolveDownloadMethods = { status: 'error', percent: 100, message: sourceErrorMessage, - error: error.message || null + error: sourceErrorTooltip }, missing, { workflowKey }); this.persistSearchStateForWorkflow(workflowKey, missing, state); this.refreshSearchUiForMissing(missing, state, { workflowKey }); diff --git a/web/resolver/search/search_source_methods.js b/web/resolver/search/search_source_methods.js index 69c78e7..9c897d8 100644 --- a/web/resolver/search/search_source_methods.js +++ b/web/resolver/search/search_source_methods.js @@ -92,6 +92,13 @@ export const searchSourceMethods = { return message; }, + getSearchSourceErrorTooltip(source, error) { + const technicalMessage = String(error || '').trim(); + const displayMessage = this.getSearchSourceErrorMessage(source, technicalMessage); + if (!technicalMessage || technicalMessage === displayMessage) return displayMessage; + return `${displayMessage} Details: ${technicalMessage}`; + }, + getSearchSourceDefinitions() { return [ {