// Recipe Modal Component import { showToast } from '../utils/uiHelpers.js'; import { state } from '../state/index.js'; import { setSessionItem, removeSessionItem } from '../utils/storageHelpers.js'; class RecipeModal { constructor() { this.init(); } init() { this.setupCopyButtons(); // Set up tooltip positioning handlers after DOM is ready document.addEventListener('DOMContentLoaded', () => { this.setupTooltipPositioning(); }); // Set up document click handler to close edit fields document.addEventListener('click', (event) => { // Handle title edit const titleEditor = document.getElementById('recipeTitleEditor'); if (titleEditor && titleEditor.classList.contains('active') && !titleEditor.contains(event.target) && !event.target.closest('.edit-icon')) { this.saveTitleEdit(); } // Handle tags edit const tagsEditor = document.getElementById('recipeTagsEditor'); if (tagsEditor && tagsEditor.classList.contains('active') && !tagsEditor.contains(event.target) && !event.target.closest('.edit-icon')) { this.saveTagsEdit(); } // Handle reconnect input const reconnectContainers = document.querySelectorAll('.lora-reconnect-container'); reconnectContainers.forEach(container => { if (container.classList.contains('active') && !container.contains(event.target) && !event.target.closest('.deleted-badge.reconnectable')) { this.hideReconnectInput(container); } }); }); } // Add tooltip positioning handler to ensure correct positioning of fixed tooltips setupTooltipPositioning() { document.addEventListener('mouseover', (event) => { // Check if we're hovering over a local-badge if (event.target.closest('.local-badge')) { const badge = event.target.closest('.local-badge'); const tooltip = badge.querySelector('.local-path'); if (tooltip) { // Get badge position const badgeRect = badge.getBoundingClientRect(); // Position the tooltip tooltip.style.top = (badgeRect.bottom + 4) + 'px'; tooltip.style.left = (badgeRect.right - tooltip.offsetWidth) + 'px'; } } // Add tooltip positioning for missing badge if (event.target.closest('.recipe-status.missing')) { const badge = event.target.closest('.recipe-status.missing'); const tooltip = badge.querySelector('.missing-tooltip'); if (tooltip) { // Get badge position const badgeRect = badge.getBoundingClientRect(); // Position the tooltip tooltip.style.top = (badgeRect.bottom + 4) + 'px'; tooltip.style.left = (badgeRect.left) + 'px'; } } }, true); } showRecipeDetails(recipe) { // Store the full recipe for editing this.currentRecipe = JSON.parse(JSON.stringify(recipe)); // 深拷贝以避免对原始对象的修改 // Set modal title with edit icon const modalTitle = document.getElementById('recipeModalTitle'); if (modalTitle) { modalTitle.innerHTML = `
`;
// Determine CSS class based on LoRA state
let loraItemClass = 'recipe-lora-item';
if (existsLocally) {
loraItemClass += ' exists-locally';
} else if (isDeleted) {
loraItemClass += ' is-deleted';
} else {
loraItemClass += ' missing-locally';
}
return `
Enter LoRA Syntax or Name to Reconnect:
Example:<lora:Boris_Vallejo_BV_flux_D:1> or just Boris_Vallejo_BV_flux_D