diff --git a/__init__.py b/__init__.py index 5de718f12f4..a6c8910ae7e 100644 --- a/__init__.py +++ b/__init__.py @@ -20,7 +20,7 @@ import torch -version = [1, 13, 7] +version = [1, 14] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') print(f"### Loading: ComfyUI-Manager ({version_str})") diff --git a/extension-node-map.json b/extension-node-map.json index 23ad084e654..5e8ebafc2d3 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -5363,7 +5363,8 @@ ], "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration": [ [ - "ChatGptPrompt" + "ChatGptPrompt", + "ChatGptTextConcat" ], { "title_aux": "ComfyUI-Chat-GPT-Integration" diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index a6f4d55d801..7f301a6d08a 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -13,7 +13,7 @@ var docStyle = document.createElement('style'); docStyle.innerHTML = ` #cm-manager-dialog { width: 1000px; - height: 410px; + height: 420px; box-sizing: content-box; z-index: 10000; } @@ -119,6 +119,7 @@ const style = ` padding: 0px !important; position: relative; overflow: hidden; + font-size: 17px !important; } #cm-nodeinfo-button { width: 310px; @@ -126,6 +127,7 @@ const style = ` padding: 0px !important; position: relative; overflow: hidden; + font-size: 17px !important; } #cm-manual-button { width: 310px; @@ -142,6 +144,43 @@ const style = ` font-size: 17px !important; } +.cm-experimental-button { + width: 290px; + height: 30px; + position: relative; + overflow: hidden; + font-size: 17px !important; +} + +.cm-experimental { + width: 310px; + border: 1px solid #555; + border-radius: 5px; + padding: 10px; + align-items: center; + text-align: center; + justify-content: center; + box-sizing: border-box; +} + +.cm-experimental-legend { + margin-top: -20px; + margin-left: 95px; + width:100px; + height:20px; + font-size: 13px; + font-weight: bold; + background-color: #990000; + color: #CCFFFF; + border-radius: 5px; +} + +.cm-menu-combo { + cursor: pointer; + width: 310px; + box-sizing: border-box; +} + .cm-small-button { width: 120px; height: 30px; @@ -151,6 +190,15 @@ const style = ` font-size: 17px !important; } +#cm-install-customnodes-button { + width: 200px; + height: 30px; + position: relative; + overflow: hidden; + box-sizing: border-box; + font-size: 17px !important; +} + .cm-search-filter { width: 200px; height: 30px !important; @@ -394,7 +442,20 @@ async function fetchUpdates(update_check_checkbox) { } if (response.status == 201) { - app.ui.dialog.show('There is an updated extension available.

NOTE:
Fetch Updates is not an update.
Please update from "Install Custom Nodes".

'); + app.ui.dialog.show("There is an updated extension available.

NOTE:
Fetch Updates is not an update.
Please update from

"); + + const button = document.getElementById('cm-install-customnodes-button'); + button.addEventListener("click", + async function() { + app.ui.dialog.close(); + + if(!CustomNodesInstaller.instance) + CustomNodesInstaller.instance = new CustomNodesInstaller(app, self); + + await CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.UPDATE); + } + ); + app.ui.dialog.element.style.zIndex = 10010; update_check_checkbox.checked = false; } @@ -531,7 +592,7 @@ class ManagerMenuDialog extends ComfyDialog { () => { if(!CustomNodesInstaller.instance) CustomNodesInstaller.instance = new CustomNodesInstaller(app, self); - CustomNodesInstaller.instance.show(false); + CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.NORMAL); } }), @@ -542,7 +603,7 @@ class ManagerMenuDialog extends ComfyDialog { () => { if(!CustomNodesInstaller.instance) CustomNodesInstaller.instance = new CustomNodesInstaller(app, self); - CustomNodesInstaller.instance.show(true); + CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.MISSING_NODES); } }), @@ -589,14 +650,14 @@ class ManagerMenuDialog extends ComfyDialog { // db mode this.datasrc_combo = document.createElement("select"); - this.datasrc_combo.style.cursor = "pointer"; + this.datasrc_combo.className = "cm-menu-combo"; this.datasrc_combo.appendChild($el('option', { value: 'cache', text: 'DB: Channel (1day cache)' }, [])); this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'DB: Local' }, [])); this.datasrc_combo.appendChild($el('option', { value: 'url', text: 'DB: Channel (remote)' }, [])); // preview method let preview_combo = document.createElement("select"); - preview_combo.style.cursor = "pointer"; + preview_combo.className = "cm-menu-combo"; preview_combo.appendChild($el('option', { value: 'auto', text: 'Preview method: Auto' }, [])); preview_combo.appendChild($el('option', { value: 'taesd', text: 'Preview method: TAESD (slow)' }, [])); preview_combo.appendChild($el('option', { value: 'latent2rgb', text: 'Preview method: Latent2RGB (fast)' }, [])); @@ -612,7 +673,7 @@ class ManagerMenuDialog extends ComfyDialog { // nickname let badge_combo = document.createElement("select"); - badge_combo.style.cursor = "pointer"; + badge_combo.className = "cm-menu-combo"; badge_combo.appendChild($el('option', { value: 'none', text: 'Badge: None' }, [])); badge_combo.appendChild($el('option', { value: 'nick', text: 'Badge: Nickname' }, [])); badge_combo.appendChild($el('option', { value: 'nick_hide', text: 'Badge: Nickname (hide built-in)' }, [])); @@ -631,7 +692,7 @@ class ManagerMenuDialog extends ComfyDialog { // channel let channel_combo = document.createElement("select"); - channel_combo.style.cursor = "pointer"; + channel_combo.className = "cm-menu-combo"; api.fetchApi('/manager/channel_url_list') .then(response => response.json()) .then(async data => { @@ -657,7 +718,7 @@ class ManagerMenuDialog extends ComfyDialog { // share let share_combo = document.createElement("select"); - share_combo.style.cursor = "pointer"; + share_combo.className = "cm-menu-combo"; const share_options = [ ['none', 'None'], ['openart', 'OpenArt AI'], @@ -696,20 +757,7 @@ class ManagerMenuDialog extends ComfyDialog { badge_combo, channel_combo, share_combo, - - $el("hr", {}, []), - $el("center", {}, ["!! EXPERIMENTAL !!"]), $el("br", {}, []), - $el("button.cm-button", { - type: "button", - textContent: "Snapshot Manager", - onclick: - () => { - if(!SnapshotManager.instance) - SnapshotManager.instance = new SnapshotManager(app, self); - SnapshotManager.instance.show(); - } - }), $el("button.cm-button", { type: "button", textContent: "Install via Git URL", @@ -721,6 +769,21 @@ class ManagerMenuDialog extends ComfyDialog { } } }), + + $el("br", {}, []), + $el("filedset.cm-experimental", {}, [ + $el("legend.cm-experimental-legend", {}, ["EXPERIMENTAL"]), + $el("button.cm-experimental-button", { + type: "button", + textContent: "Snapshot Manager", + onclick: + () => { + if(!SnapshotManager.instance) + SnapshotManager.instance = new SnapshotManager(app, self); + SnapshotManager.instance.show(); + } + }) + ]), ]; } diff --git a/js/custom-nodes-downloader.js b/js/custom-nodes-downloader.js index 5409502596c..fda3476e588 100644 --- a/js/custom-nodes-downloader.js +++ b/js/custom-nodes-downloader.js @@ -3,6 +3,7 @@ import { api } from "../../scripts/api.js" import { ComfyDialog, $el } from "../../scripts/ui.js"; import { install_checked_custom_node, manager_instance, rebootAPI } from "./common.js"; + async function getCustomNodes() { var mode = manager_instance.datasrc_combo.value; @@ -91,6 +92,12 @@ export class CustomNodesInstaller extends ComfyDialog { message_box = null; data = null; + static ShowMode = { + NORMAL: 0, + MISSING_NODES: 1, + UPDATE: 2, + }; + clear() { this.install_buttons = []; this.message_box = null; @@ -235,7 +242,7 @@ export class CustomNodesInstaller extends ComfyDialog { this.conflict_mappings = await getConflictMappings(); - if(this.is_missing_node_mode) + if(this.show_mode == CustomNodesInstaller.ShowMode.MISSING_NODES) this.data = await this.filter_missing_node(this.data); this.element.removeChild(msg); @@ -661,6 +668,13 @@ export class CustomNodesInstaller extends ComfyDialog { combo.appendChild(option); }); + if(this.show_mode == CustomNodesInstaller.ShowMode.UPDATE) { + this.filter = 'Update'; + } + else if(this.show_mode == CustomNodesInstaller.ShowMode.MISSING_NODES) { + this.filter = '*'; + } + let self = this; combo.addEventListener('change', function(event) { self.filter = event.target.value; @@ -736,8 +750,13 @@ export class CustomNodesInstaller extends ComfyDialog { this.element.appendChild(close_button); } - async show(is_missing_node_mode) { - this.is_missing_node_mode = is_missing_node_mode; + async show(show_mode) { + this.show_mode = show_mode; + + if(this.show_mode != CustomNodesInstaller.ShowMode.NORMAL) { + this.search_keyword = ''; + } + try { this.invalidateControl(); diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 23ad084e654..5e8ebafc2d3 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -5363,7 +5363,8 @@ ], "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration": [ [ - "ChatGptPrompt" + "ChatGptPrompt", + "ChatGptTextConcat" ], { "title_aux": "ComfyUI-Chat-GPT-Integration"