|
|
function() { |
|
|
console.log("[WanGP] main JS initialized"); |
|
|
window.updateAndTrigger = function(action) { |
|
|
const hiddenTextbox = document.querySelector('#queue_action_input textarea'); |
|
|
const hiddenButton = document.querySelector('#queue_action_trigger'); |
|
|
if (hiddenTextbox && hiddenButton) { |
|
|
hiddenTextbox.value = action; |
|
|
hiddenTextbox.dispatchEvent(new Event('input', { bubbles: true })); |
|
|
hiddenButton.click(); |
|
|
} else { |
|
|
console.error("Could not find hidden queue action elements."); |
|
|
} |
|
|
}; |
|
|
|
|
|
window.scrollToQueueTop = function() { |
|
|
const container = document.querySelector('#queue-scroll-container'); |
|
|
if (container) container.scrollTop = 0; |
|
|
}; |
|
|
window.scrollToQueueBottom = function() { |
|
|
const container = document.querySelector('#queue-scroll-container'); |
|
|
if (container) container.scrollTop = container.scrollHeight; |
|
|
}; |
|
|
|
|
|
window.showImageModal = function(action) { |
|
|
const hiddenTextbox = document.querySelector('#modal_action_input textarea'); |
|
|
const hiddenButton = document.querySelector('#modal_action_trigger'); |
|
|
if (hiddenTextbox && hiddenButton) { |
|
|
hiddenTextbox.value = action; |
|
|
hiddenTextbox.dispatchEvent(new Event('input', { bubbles: true })); |
|
|
hiddenButton.click(); |
|
|
} |
|
|
}; |
|
|
window.closeImageModal = function() { |
|
|
const closeButton = document.querySelector('#modal_close_trigger_btn'); |
|
|
if (closeButton) closeButton.click(); |
|
|
}; |
|
|
|
|
|
let draggedItem = null; |
|
|
|
|
|
function attachDelegatedDragAndDrop(container) { |
|
|
if (container.dataset.dndDelegated) return; |
|
|
container.dataset.dndDelegated = 'true'; |
|
|
|
|
|
container.addEventListener('dragstart', (e) => { |
|
|
const row = e.target.closest('.draggable-row'); |
|
|
if (!row || e.target.closest('.action-button') || e.target.closest('.hover-image')) { |
|
|
if (row) e.preventDefault(); |
|
|
return; |
|
|
} |
|
|
draggedItem = row; |
|
|
setTimeout(() => draggedItem.classList.add('dragging'), 0); |
|
|
}); |
|
|
|
|
|
container.addEventListener('dragend', () => { |
|
|
if (draggedItem) { |
|
|
draggedItem.classList.remove('dragging'); |
|
|
} |
|
|
draggedItem = null; |
|
|
document.querySelectorAll('.drag-over-top, .drag-over-bottom').forEach(el => { |
|
|
el.classList.remove('drag-over-top', 'drag-over-bottom'); |
|
|
}); |
|
|
}); |
|
|
|
|
|
container.addEventListener('dragover', (e) => { |
|
|
e.preventDefault(); |
|
|
const targetRow = e.target.closest('.draggable-row'); |
|
|
|
|
|
document.querySelectorAll('.drag-over-top, .drag-over-bottom').forEach(el => { |
|
|
el.classList.remove('drag-over-top', 'drag-over-bottom'); |
|
|
}); |
|
|
|
|
|
if (targetRow && draggedItem && targetRow !== draggedItem) { |
|
|
const rect = targetRow.getBoundingClientRect(); |
|
|
const midpoint = rect.top + rect.height / 2; |
|
|
|
|
|
if (e.clientY < midpoint) { |
|
|
targetRow.classList.add('drag-over-top'); |
|
|
} else { |
|
|
targetRow.classList.add('drag-over-bottom'); |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
container.addEventListener('drop', (e) => { |
|
|
e.preventDefault(); |
|
|
const targetRow = e.target.closest('.draggable-row'); |
|
|
if (!draggedItem || !targetRow || targetRow === draggedItem) return; |
|
|
|
|
|
const oldIndex = draggedItem.dataset.index; |
|
|
let newIndex = parseInt(targetRow.dataset.index); |
|
|
|
|
|
if (targetRow.classList.contains('drag-over-bottom')) { |
|
|
newIndex++; |
|
|
} |
|
|
|
|
|
if (oldIndex != newIndex) { |
|
|
const action = `move_${oldIndex}_to_${newIndex}`; |
|
|
window.updateAndTrigger(action); |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
const observer = new MutationObserver((mutations, obs) => { |
|
|
const container = document.querySelector('#queue_html_container'); |
|
|
if (container) { |
|
|
attachDelegatedDragAndDrop(container); |
|
|
obs.disconnect(); |
|
|
} |
|
|
}); |
|
|
|
|
|
const targetNode = document.querySelector('gradio-app'); |
|
|
if (targetNode) { |
|
|
observer.observe(targetNode, { childList: true, subtree: true }); |
|
|
} |
|
|
|
|
|
const hit = n => n?.id === "img_editor" || n?.classList?.contains("wheel-pass"); |
|
|
addEventListener("wheel", e => { |
|
|
const path = e.composedPath?.() || (() => { let a=[],n=e.target; for(;n;n=n.parentNode||n.host) a.push(n); return a; })(); |
|
|
if (path.some(hit)) e.stopImmediatePropagation(); |
|
|
}, { capture: true, passive: true }); |
|
|
|