Files
2025-09-27 21:12:01 +03:00

155 lines
4.6 KiB
JavaScript

/**
* ComfyUI Queue Manager Menu Extension
* Follows the official ComfyUI topbar menu API
*/
import { app } from "/scripts/app.js";
// Queue Manager window reference
let queueManagerWindow = null;
/**
* Open the Queue Manager interface
*/
function openQueueManager() {
try {
// Check if window is already open
if (queueManagerWindow && !queueManagerWindow.closed) {
queueManagerWindow.focus();
return;
}
// Get the queue manager URL
const baseUrl = window.location.origin;
const queueManagerUrl = `${baseUrl}/extensions/comfyui-queue-manager/index.html`;
// Try to open as popup window
const windowFeatures = [
"width=1200",
"height=800",
"left=100",
"top=100",
"resizable=yes",
"scrollbars=yes",
"status=no",
"menubar=no",
"toolbar=no"
].join(",");
queueManagerWindow = window.open(queueManagerUrl, "QueueManager", windowFeatures);
if (queueManagerWindow) {
queueManagerWindow.focus();
console.log("[Queue Manager] Opened successfully");
} else {
// Fallback to new tab
queueManagerWindow = window.open(queueManagerUrl, "_blank");
if (queueManagerWindow) {
queueManagerWindow.focus();
console.log("[Queue Manager] Opened as new tab");
} else {
throw new Error("Failed to open Queue Manager window");
}
}
// Handle window close
const checkClosed = setInterval(() => {
if (queueManagerWindow && queueManagerWindow.closed) {
queueManagerWindow = null;
clearInterval(checkClosed);
}
}, 1000);
} catch (error) {
console.error("[Queue Manager] Failed to open:", error);
// Show error notification
const notification = document.createElement("div");
notification.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
background: #f44336;
color: white;
padding: 12px 20px;
border-radius: 4px;
z-index: 10000;
font-size: 14px;
box-shadow: 0 2px 10px rgba(0,0,0,0.3);
`;
notification.textContent = "Failed to open Queue Manager. Please check popup blocker settings.";
document.body.appendChild(notification);
setTimeout(() => {
if (document.body.contains(notification)) {
document.body.removeChild(notification);
}
}, 5000);
}
}
/**
* Register the Queue Manager extension using official ComfyUI API
*/
app.registerExtension({
name: "QueueManager",
// Define commands following official API
commands: [
{
id: "queueManager.open",
label: "Open Queue Manager",
function: openQueueManager
}
],
// Add commands to menu following official API
menuCommands: [
{
path: ["Queue"],
commands: ["queueManager.open"]
}
],
async setup() {
console.log("[Queue Manager] Extension registered successfully");
// Set up keyboard shortcut (Ctrl+Shift+Q)
document.addEventListener("keydown", (e) => {
if (e.ctrlKey && e.shiftKey && e.key === "Q") {
e.preventDefault();
openQueueManager();
}
});
},
async beforeRegisterNodeDef(nodeType, nodeData, app) {
// Hook into Queue Manager node registration
if (nodeData.name === "QueueManagerNode") {
console.log("[Queue Manager] Node detected:", nodeData.name);
// Add button widget to the node
const onNodeCreated = nodeType.prototype.onNodeCreated;
nodeType.prototype.onNodeCreated = function() {
if (onNodeCreated) {
onNodeCreated.apply(this, arguments);
}
// Add "Open Queue Manager" button to the node
this.addWidget("button", "Open Queue Manager", null, () => {
openQueueManager();
});
};
}
}
});
// Clean up on page unload
window.addEventListener("beforeunload", () => {
if (queueManagerWindow && !queueManagerWindow.closed) {
queueManagerWindow.close();
}
});
console.log("[Queue Manager] Menu extension loaded");