diff --git a/js/common.js b/js/common.js
index 7a63ad51..86e65344 100644
--- a/js/common.js
+++ b/js/common.js
@@ -94,9 +94,62 @@ function internalCustomConfirm(message, confirmMessage, cancelMessage) {
});
}
-export function show_message(msg) {
- app.ui.dialog.show(msg);
- app.ui.dialog.element.style.zIndex = 1100;
+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"; // mt-1
+
+ 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;
}
export async function sleep(ms) {
diff --git a/js/custom-nodes-manager.js b/js/custom-nodes-manager.js
index 6f8fdd02..bbee79f9 100644
--- a/js/custom-nodes-manager.js
+++ b/js/custom-nodes-manager.js
@@ -930,7 +930,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);
}
}
@@ -1461,7 +1471,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`);
}