import { showToast } from '../utils/uiHelpers.js'; import { modalManager } from '../managers/ModalManager.js'; import { state } from '../state/index.js'; export function createLoraCard(lora) { const card = document.createElement('div'); card.className = 'lora-card'; card.dataset.sha256 = lora.sha256; card.dataset.filepath = lora.file_path; card.dataset.name = lora.model_name; card.dataset.file_name = lora.file_name; card.dataset.folder = lora.folder; card.dataset.modified = lora.modified; card.dataset.from_civitai = lora.from_civitai; card.dataset.meta = JSON.stringify(lora.civitai || {}); const version = state.previewVersions.get(lora.file_path); const previewUrl = lora.preview_url || '/loras_static/images/no-preview.png'; const versionedPreviewUrl = version ? `${previewUrl}?t=${version}` : previewUrl; card.innerHTML = `
${previewUrl.endsWith('.mp4') ? `` : `${lora.model_name}` }
${lora.base_model}
`; // Main card click event card.addEventListener('click', () => { const meta = JSON.parse(card.dataset.meta || '{}'); if (Object.keys(meta).length) { showLoraModal(meta); } else { showToast( card.dataset.from_civitai === 'true' ? 'Click "Fetch" to retrieve metadata' : 'No CivitAI information available', 'info' ); } }); // Copy button click event card.querySelector('.fa-copy')?.addEventListener('click', e => { e.stopPropagation(); navigator.clipboard.writeText(card.dataset.file_name) .then(() => showToast('Model name copied', 'success')) .catch(() => showToast('Copy failed', 'error')); }); // Civitai button click event if (lora.from_civitai) { card.querySelector('.fa-globe')?.addEventListener('click', e => { e.stopPropagation(); openCivitai(lora.model_name); }); } // Delete button click event card.querySelector('.fa-trash')?.addEventListener('click', e => { e.stopPropagation(); deleteModel(lora.file_path); }); // Replace preview button click event card.querySelector('.fa-image')?.addEventListener('click', e => { e.stopPropagation(); replacePreview(lora.file_path); }); return card; } export function showLoraModal(lora) { const escapedWords = lora.trainedWords?.length ? lora.trainedWords.map(word => word.replace(/'/g, '\\\'')) : []; const categories = {}; escapedWords.forEach(word => { const category = word.includes(':') ? word.split(':')[0] : 'General'; if (!categories[category]) { categories[category] = []; } categories[category].push(word); }); const imageMarkup = lora.images.map(img => { if (img.type === 'video') { return ``; } else { return `Preview`; } }).join(''); const triggerWordsMarkup = escapedWords.length ? `
Trigger Words
${escapedWords.map(word => `
${word}
`).join('')}
` : '
No trigger words
'; const content = ` `; modalManager.showModal('loraModal', content); }