diff --git a/js/common.js b/js/common.js index b8193055..41babceb 100644 --- a/js/common.js +++ b/js/common.js @@ -95,8 +95,61 @@ function internalCustomConfirm(message, confirmMessage, cancelMessage) { }); } -export function show_message(msg) { +export function addReportButton(dialogEl, options = {}) { + const contentEl = dialogEl.querySelector(".comfy-modal-content"); + const closeBtnEl = contentEl?.querySelector("button"); + if (!contentEl || !closeBtnEl) return; + + const { msg, errorSubtype, extraFields = [] } = options; + + const button = document.createElement("button"); + button.textContent = "Report Error"; + button.style.marginBottom = "0.25rem"; + + const cleanText = (text) => (text ? text.replace(/[\r\n\t\s]/g, " ") : text); + + button.addEventListener("click", () => { + window["app"].extensionManager.dialog.showIssueReportDialog({ + title: "Report Manager Issue", + subtitle: "Please describe the issue you are experiencing", + panelProps: { + errorType: "ManagerError", + exceptionMessage: cleanText(msg), + tags: { + errorSubtype: cleanText(errorSubtype), + isElectron: "electronAPI" in window, + }, + defaultFields: ["Logs", "SystemStats"], + extraFields: [ + { + label: "ComfyUI-Manager Version", + value: "ManagerVersion", // unique ID for the field + getData: async () => + (await api.fetchApi(`/manager/version`)).text(), + }, + ...extraFields, + ], + }, + }); + button.remove(); + }); + + closeBtnEl.addEventListener("click", () => button.remove(), { + once: true, + passive: true, + }); + contentEl.insertBefore(button, closeBtnEl); +} + +export function show_message(msg, errorReportOptions) { app.ui.dialog.show(msg); + if (errorReportOptions) { + try { + addReportButton(app.ui.dialog.element, errorReportOptions); + } catch { + // do nothing + } + } app.ui.dialog.element.style.zIndex = 1100; } diff --git a/js/custom-nodes-manager.js b/js/custom-nodes-manager.js index a4ca3653..2109cc2b 100644 --- a/js/custom-nodes-manager.js +++ b/js/custom-nodes-manager.js @@ -650,7 +650,17 @@ export class CustomNodesManager { show_message(title+'The information is not available.') } else { - show_message(title+sanitizeHTML(res['msg']).replace(/ /g, ' ').replace(/\n/g, '
')); + const errorReportOptions = { + msg: `Error importing '${rowItem.title}' module.`, + errorSubtype: "importError", + extraFields: [{ + label: "Failed Import Info", + value: "FailedImportInfo", + getData: () => res['msg'] + }], + } + + show_message(title+sanitizeHTML(res['msg']).replace(/ /g, ' ').replace(/\n/g, '
'), errorReportOptions); } } @@ -1617,7 +1627,17 @@ export class CustomNodesManager { if (errorMsg) { self.showError(errorMsg); - show_message("Installation Error:\n"+errorMsg); + show_message("Installation Error:\n"+errorMsg, { + msg: `Installation Error: ${errorMsg}`, + errorSubtype: `node${label}Error`, + extraFields: [ + { + label: `${label} Error Trace`, + value: `${label}ErrorsTrace`, + getData: () => errorMsg, + }, + ], + }); } else { self.showStatus(`${label} ${result.length} custom node(s) successfully`); }