feat: improve Civitai integration and download button resilience
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -3753,10 +3753,11 @@
|
||||
.mr-model-details-version-tab {
|
||||
display: inline-grid;
|
||||
gap: 2px;
|
||||
min-width: 118px;
|
||||
flex: 0 0 auto;
|
||||
min-width: max-content;
|
||||
max-width: 230px;
|
||||
min-height: 38px;
|
||||
padding: 6px 10px;
|
||||
padding: 6px 11px;
|
||||
border: 1px solid rgba(255,255,255,0.11);
|
||||
border-radius: 6px;
|
||||
background: rgba(255,255,255,0.06);
|
||||
|
||||
@@ -572,7 +572,7 @@ export const resolveDownloadMethods = {
|
||||
);
|
||||
}
|
||||
if (downloadBtn) {
|
||||
downloadBtn.textContent = '✓ Done';
|
||||
this.restoreDownloadButtonReadyState(downloadBtn);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
@@ -731,9 +731,7 @@ export const resolveDownloadMethods = {
|
||||
progressDiv.innerHTML = this.renderStatusMessage('Download complete. Checking local matches...', 'success');
|
||||
}
|
||||
if (downloadBtn) {
|
||||
downloadBtn.textContent = '✓ Done';
|
||||
downloadBtn.classList.remove('mr-is-success-action');
|
||||
downloadBtn.classList.add('mr-btn-primary');
|
||||
this.restoreDownloadButtonReadyState(downloadBtn);
|
||||
}
|
||||
delete this.activeDownloads[downloadId];
|
||||
this.updateDownloadAllButtonState();
|
||||
@@ -800,6 +798,17 @@ export const resolveDownloadMethods = {
|
||||
}
|
||||
},
|
||||
|
||||
restoreDownloadButtonReadyState(downloadBtn) {
|
||||
if (!downloadBtn) return;
|
||||
downloadBtn.disabled = false;
|
||||
downloadBtn.classList.remove('mr-is-success-action', 'mr-btn-primary');
|
||||
if (downloadBtn.classList.contains('search-download-btn')) {
|
||||
downloadBtn.innerHTML = getSvgIcon('download');
|
||||
return;
|
||||
}
|
||||
downloadBtn.innerHTML = '<span class="mr-btn-icon">☁</span> Download';
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel an active download
|
||||
*/
|
||||
|
||||
@@ -1503,13 +1503,15 @@ export const searchPanelMethods = {
|
||||
model_id: missing.download_source?.model_id || ids.modelId,
|
||||
version_id: missing.download_source?.version_id || ids.versionId,
|
||||
base_model: missing.civitai_info?.base_model || missing.download_source?.base_model,
|
||||
tags: missing.civitai_info?.tags || missing.download_source?.tags || []
|
||||
tags: missing.civitai_info?.tags || missing.download_source?.tags || [],
|
||||
searchedAt: missing.download_source?.searchedAt || missing.download_source?.searched_at
|
||||
};
|
||||
},
|
||||
|
||||
applyCivitaiUrnResult(missing, civitai = {}) {
|
||||
if (!missing || !civitai) return;
|
||||
const ids = this.getUrnIds(missing);
|
||||
const searchedAt = civitai.searchedAt || civitai.searched_at || new Date().toISOString();
|
||||
missing.civitai_info = {
|
||||
model_name: civitai.name,
|
||||
version_name: civitai.version_name,
|
||||
@@ -1531,7 +1533,8 @@ export const searchPanelMethods = {
|
||||
version_id: civitai.version_id || ids.versionId,
|
||||
model_url: civitai.url || `https://civitai.com/models/${ids.modelId}?modelVersionId=${ids.versionId}`,
|
||||
base_model: civitai.base_model,
|
||||
tags: civitai.tags || []
|
||||
tags: civitai.tags || [],
|
||||
searchedAt
|
||||
};
|
||||
},
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ export const modelInfoMethods = {
|
||||
const hasLocalPath = Boolean(model?.path || model?.resolved_path);
|
||||
this.setContextMenuItemVisible('showInfo', !isDownloadTableContext);
|
||||
this.setContextMenuItemVisible('showMore', canShowMore);
|
||||
this.setContextMenuItemVisible('civitai', !isDownloadTableContext);
|
||||
this.setContextMenuItemVisible('openFolder', !isDownloadTableContext && hasLocalPath);
|
||||
this.setContextMenuDividerVisible('source', !isDownloadTableContext || canShowMore);
|
||||
this.setContextMenuDividerVisible('folder', !isDownloadTableContext && hasLocalPath);
|
||||
@@ -144,6 +145,12 @@ export const modelInfoMethods = {
|
||||
async openInCivitAI(model) {
|
||||
if (!model) return;
|
||||
|
||||
const directUrl = this.getKnownCivitaiModelUrl(model);
|
||||
if (directUrl) {
|
||||
window.open(directUrl, '_blank');
|
||||
return;
|
||||
}
|
||||
|
||||
const name = model.name || model.original_path?.split(/[\/\\]/).pop() || '';
|
||||
if (!name) return;
|
||||
|
||||
@@ -182,6 +189,27 @@ export const modelInfoMethods = {
|
||||
}
|
||||
},
|
||||
|
||||
getKnownCivitaiModelUrl(model = {}) {
|
||||
const candidates = [
|
||||
model.model_url,
|
||||
model.workflow_model_url,
|
||||
model.openUrl,
|
||||
model.url
|
||||
];
|
||||
for (const url of candidates) {
|
||||
const value = String(url || '');
|
||||
if (/^https:\/\/(?:www\.)?civitai\.com\/models\/\d+/i.test(value)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
const modelId = model.model_id || model.modelId;
|
||||
const versionId = model.version_id || model.versionId;
|
||||
if (modelId) {
|
||||
return `https://civitai.com/models/${modelId}${versionId ? `?modelVersionId=${versionId}` : ''}`;
|
||||
}
|
||||
return '';
|
||||
},
|
||||
|
||||
/**
|
||||
* Show model info dialog (similar to rgthree's RgthreeLoraInfoDialog)
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user