import { showToast } from '../utils/uiHelpers.js'; import { modalManager } from '../managers/ModalManager.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 || {}); // Add timestamp to preview URL to prevent caching const previewUrl = lora.preview_url ? `${lora.preview_url}?t=${Date.now()}` : '/loras_static/images/no-preview.png'; card.innerHTML = `
${previewUrl.endsWith('.mp4') ? `` : `${lora.model_name}` }
${lora.base_model}
`; 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' ); } }); return card; } export function updatePreviewInCard(filePath, file, previewUrl) { const card = document.querySelector(`.lora-card[data-filepath="${filePath}"]`); const previewContainer = card?.querySelector('.card-preview'); const oldPreview = previewContainer?.querySelector('img, video'); if (oldPreview) { const newPreviewUrl = `${previewUrl}?t=${Date.now()}`; const newPreview = file.type.startsWith('video/') ? createVideoPreview(newPreviewUrl) : createImagePreview(newPreviewUrl); oldPreview.replaceWith(newPreview); } } 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); document.querySelectorAll('.trigger-category').forEach(category => { category.addEventListener('click', function() { const categoryName = this.dataset.category; document.querySelectorAll('.trigger-category').forEach(c => c.classList.remove('active')); this.classList.add('active'); const wordsList = document.querySelector('.trigger-words-list'); wordsList.innerHTML = categories[categoryName].map(word => `
${word}
`).join(''); }); }); } export function initializeLoraCards() { document.querySelectorAll('.lora-card').forEach(card => { 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'); } }); 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')); }); }); } function createVideoPreview(url) { const video = document.createElement('video'); video.controls = video.autoplay = video.muted = video.loop = true; video.src = url; return video; } function createImagePreview(url) { const img = document.createElement('img'); img.src = url; return img; }