Browse Source

support keyword search

pull/14/head
Dr.Lt.Data 1 year ago
parent
commit
b72722316e
  1. 1
      README.md
  2. 2
      __init__.py
  3. 45
      extension-node-map.json
  4. 190
      js/comfyui-manager.js
  5. BIN
      misc/custom-nodes.png
  6. BIN
      misc/models.png
  7. 8
      model-list.json

1
README.md

@ -8,6 +8,7 @@
# Changes
* **0.9** Support keyword search in installer menu.
* **V0.7.1** Bug fix for the issue where updates were not being applied on Windows.
* **For those who have been using versions 0.6, please perform a manual git pull in the custom_nodes/ComfyUI-Manager directory.**
* **V0.7** To address the issue of a slow list refresh, separate the fetch update and update check processes.

2
__init__.py

@ -16,7 +16,7 @@ sys.path.append('../..')
from torchvision.datasets.utils import download_url
# ensure .js
print("### Loading: ComfyUI-Manager (V0.8)")
print("### Loading: ComfyUI-Manager (V0.9)")
comfy_path = os.path.dirname(folder_paths.__file__)
custom_nodes_path = os.path.join(comfy_path, 'custom_nodes')

45
extension-node-map.json

@ -207,15 +207,29 @@
],
"https://github.com/LucianoCirino/efficiency-nodes-comfyui": [
"Efficient Loader",
"Evaluate Floats",
"Evaluate Integers",
"Evaluate Strings",
"Image Overlay",
"Join XY Inputs",
"KSampler (Efficient)",
"Simple Eval Examples",
"XY Input: CFG Scale",
"XY Input: Checkpoint",
"XY Input: Denoise",
"XY Input: LoRA",
"XY Input: LoRA (Advanced)",
"XY Input: Sampler",
"XY Input: Scheduler",
"XY Input: Seeds++ Batch",
"XY Input: Steps",
"XY Input: VAE",
"XY Plot"
],
"https://github.com/Nourepide/ComfyUI-Allore": [
"AlphaChanelAsMask",
"AlphaChanelByMask",
"AlphaChanelRemove",
"AlphaChanelRestore",
"ClipClamp",
"ClipVisionClamp",
@ -225,20 +239,46 @@
"GligenClamp",
"ImageClamp",
"ImageCompositeAbsolute",
"ImageCompositeAbsoluteByContainer",
"ImageCompositeRelative",
"ImageCompositeRelativeByContainer",
"ImageContainer",
"ImageContainerInheritanceAdd",
"ImageContainerInheritanceMax",
"ImageContainerInheritanceScale",
"ImageContainerInheritanceSum",
"ImageDrawArc",
"ImageDrawArcByContainer",
"ImageDrawChord",
"ImageDrawChordByContainer",
"ImageDrawEllipse",
"ImageDrawEllipseByContainer",
"ImageDrawLine",
"ImageDrawLineByContainer",
"ImageDrawPieslice",
"ImageDrawPiesliceByContainer",
"ImageDrawPolygon",
"ImageDrawRectangle",
"ImageDrawRectangleByContainer",
"ImageDrawRectangleRounded",
"ImageDrawRectangleRoundedByContainer",
"ImageFilterBlur",
"ImageFilterBoxBlur",
"ImageFilterContour",
"ImageFilterDetail",
"ImageFilterEdgeEnhance",
"ImageFilterEdgeEnhanceMore",
"ImageFilterEmboss",
"ImageFilterFindEdges",
"ImageFilterGaussianBlur",
"ImageFilterMax",
"ImageFilterMedian",
"ImageFilterMin",
"ImageFilterMode",
"ImageFilterRank",
"ImageFilterSharpen",
"ImageFilterSmooth",
"ImageFilterSmoothMore",
"ImageSegmentation",
"ImageSegmentationCustom",
"ImageSegmentationCustomAdvanced",
@ -258,12 +298,15 @@
"LatentSelector"
],
"https://github.com/TinyTerra/ComfyUI_tinyterraNodes.git": [
"ttN busIN",
"ttN busOUT",
"ttN concat",
"ttN debugInput",
"ttN float",
"ttN hiresfixScale",
"ttN imageOutput",
"ttN imageREMBG",
"ttN int",
"ttN modelScale",
"ttN pipe2BASIC",
"ttN pipe2DETAILER",
"ttN pipeEDIT",

190
js/comfyui-manager.js vendored

@ -218,6 +218,7 @@ class CustomNodesInstaller extends ComfyDialog {
constructor() {
super();
this.search_keyword = '';
this.element = $el("div.comfy-modal", { parent: document.body }, []);
}
@ -232,6 +233,22 @@ class CustomNodesInstaller extends ComfyDialog {
}
}
apply_searchbox(data) {
let keyword = this.search_box.value.toLowerCase();
for(let i in this.grid_rows) {
let data = this.grid_rows[i].data;
let content = data.author.toLowerCase() + data.description.toLowerCase() + data.title.toLowerCase();
if(keyword == "")
this.grid_rows[i].control.style.display = null;
else if(content.includes(keyword)) {
this.grid_rows[i].control.style.display = null;
}
else {
this.grid_rows[i].control.style.display = 'none';
}
}
}
async filter_missing_node(data) {
const mappings = await getCustomnodeMappings();
@ -280,7 +297,9 @@ class CustomNodesInstaller extends ComfyDialog {
const msg = $el('div', {id:'custom-message'},
[$el('br'),
'The custom node DB is currently being updated, and updates to custom nodes are being checked for.',
'The custom node DB is currently being updated, and updates to custom nodes are being checked for.',
$el('br'),
'NOTE: Update only checks for extensions that have been fetched.',
$el('br')]);
msg.style.height = '100px';
msg.style.verticalAlign = 'middle';
@ -298,8 +317,10 @@ class CustomNodesInstaller extends ComfyDialog {
this.element.removeChild(this.element.children[0]);
}
this.createHeaderControls();
await this.createGrid();
this.createControls();
this.apply_searchbox(this.data);
this.createBottomControls();
}
updateMessage(msg) {
@ -343,6 +364,8 @@ class CustomNodesInstaller extends ComfyDialog {
headerRow.style.padding = "0";
grid.appendChild(headerRow);
this.grid_rows = {};
if(this.data)
for (var i = 0; i < this.data.length; i++) {
const data = this.data[i];
@ -455,6 +478,8 @@ class CustomNodesInstaller extends ComfyDialog {
dataRow.appendChild(data4);
dataRow.appendChild(data5);
grid.appendChild(dataRow);
this.grid_rows[i] = {data:data, control:dataRow};
}
const panel = document.createElement('div');
@ -466,10 +491,43 @@ class CustomNodesInstaller extends ComfyDialog {
this.element.appendChild(panel);
}
async createControls() {
var close_button = document.createElement("button");
createHeaderControls() {
this.search_box = $el('input', {type:'text', id:'manager-customnode-search-box', placeholder:'input search keyword', value:this.search_keyword}, []);
this.search_box.style.height = "25px";
this.search_box.onkeydown = (event) => {
if (event.key === 'Enter') {
this.search_keyword = this.search_box.value;
this.apply_searchbox();
}
if (event.key === 'Escape') {
this.search_keyword = this.search_box.value;
this.search_box.value = '';
this.apply_searchbox();
}
};
let search_button = document.createElement("button");
search_button.innerHTML = "Search";
search_button.onclick = () => {
this.apply_searchbox();
};
search_button.style.display = "inline-block";
let cell = $el('td', {width:'100%'}, [this.search_box, ' ', search_button]);
let search_control = $el('table', {width:'100%'},
[
$el('tr', {}, [cell])
]
);
cell.style.textAlign = "right";
this.element.appendChild(search_control);
}
async createBottomControls() {
let close_button = document.createElement("button");
close_button.innerHTML = "Close";
close_button.onclick = () => { this.close(); }
close_button.onclick = () => { this.search_keyword = ''; this.close(); }
close_button.style.display = "inline-block";
this.message_box = $el('div', {id:'custom-installer-message'}, [$el('br'), '']);
@ -509,6 +567,7 @@ class AlternativesInstaller extends ComfyDialog {
constructor() {
super();
this.search_keyword = '';
this.element = $el("div.comfy-modal", { parent: document.body }, []);
}
@ -523,6 +582,23 @@ class AlternativesInstaller extends ComfyDialog {
}
}
apply_searchbox(data) {
let keyword = this.search_box.value.toLowerCase();
for(let i in this.grid_rows) {
let data1 = this.grid_rows[i].data;
let data2 = data1.custom_node;
let content = data1.tags.toLowerCase() + data1.description.toLowerCase() + data2.author.toLowerCase() + data2.description.toLowerCase() + data2.title.toLowerCase();
if(keyword == "")
this.grid_rows[i].control.style.display = null;
else if(content.includes(keyword)) {
this.grid_rows[i].control.style.display = null;
}
else {
this.grid_rows[i].control.style.display = 'none';
}
}
}
async invalidateControl() {
this.clear();
@ -534,6 +610,8 @@ class AlternativesInstaller extends ComfyDialog {
const msg = $el('div', {id:'custom-message'},
[$el('br'),
'The custom node DB is currently being updated, and updates to custom nodes are being checked for.',
$el('br'),
'NOTE: Update only checks for extensions that have been fetched.',
$el('br')]);
msg.style.height = '100px';
msg.style.verticalAlign = 'middle';
@ -548,8 +626,10 @@ class AlternativesInstaller extends ComfyDialog {
this.element.removeChild(this.element.children[0]);
}
this.createHeaderControls();
await this.createGrid();
this.createControls();
this.apply_searchbox(this.data);
this.createBottomControls();
}
updateMessage(msg) {
@ -597,6 +677,8 @@ class AlternativesInstaller extends ComfyDialog {
headerRow.style.padding = "0";
grid.appendChild(headerRow);
this.grid_rows = {};
if(this.data)
for (var i = 0; i < this.data.length; i++) {
const data = this.data[i];
@ -724,6 +806,8 @@ class AlternativesInstaller extends ComfyDialog {
dataRow.appendChild(data5);
dataRow.appendChild(data6);
grid.appendChild(dataRow);
this.grid_rows[i] = {data:data, control:dataRow};
}
const panel = document.createElement('div');
@ -735,7 +819,40 @@ class AlternativesInstaller extends ComfyDialog {
this.element.appendChild(panel);
}
async createControls() {
createHeaderControls() {
this.search_box = $el('input', {type:'text', id:'manager-alternode-search-box', placeholder:'input search keyword', value:this.search_keyword}, []);
this.search_box.style.height = "25px";
this.search_box.onkeydown = (event) => {
if (event.key === 'Enter') {
this.search_keyword = this.search_box.value;
this.apply_searchbox();
}
if (event.key === 'Escape') {
this.search_keyword = this.search_box.value;
this.search_box.value = '';
this.apply_searchbox();
}
};
let search_button = document.createElement("button");
search_button.innerHTML = "Search";
search_button.onclick = () => {
this.apply_searchbox();
};
search_button.style.display = "inline-block";
let cell = $el('td', {width:'100%'}, [this.search_box, ' ', search_button]);
let search_control = $el('table', {width:'100%'},
[
$el('tr', {}, [cell])
]
);
cell.style.textAlign = "right";
this.element.appendChild(search_control);
}
async createBottomControls() {
var close_button = document.createElement("button");
close_button.innerHTML = "Close";
close_button.onclick = () => { this.close(); }
@ -778,6 +895,7 @@ class ModelInstaller extends ComfyDialog {
constructor() {
super();
this.search_keyword = '';
this.element = $el("div.comfy-modal", { parent: document.body }, []);
}
@ -802,6 +920,22 @@ class ModelInstaller extends ComfyDialog {
}
}
apply_searchbox(data) {
let keyword = this.search_box.value.toLowerCase();
for(let i in this.grid_rows) {
let data = this.grid_rows[i].data;
let content = data.name.toLowerCase() + data.type.toLowerCase() + data.base.toLowerCase() + data.description.toLowerCase();
if(keyword == "")
this.grid_rows[i].control.style.display = null;
else if(content.includes(keyword)) {
this.grid_rows[i].control.style.display = null;
}
else {
this.grid_rows[i].control.style.display = 'none';
}
}
}
async invalidateControl() {
this.clear();
this.data = (await getModelList()).models;
@ -810,8 +944,9 @@ class ModelInstaller extends ComfyDialog {
this.element.removeChild(this.element.children[0]);
}
await this.createHeaderControls();
await this.createGrid();
this.createControls();
await this.createBottomControls();
}
updateMessage(msg) {
@ -865,6 +1000,8 @@ class ModelInstaller extends ComfyDialog {
headerRow.style.padding = "0";
grid.appendChild(headerRow);
this.grid_rows = {};
if(this.data)
for (var i = 0; i < this.data.length; i++) {
const data = this.data[i];
@ -925,6 +1062,8 @@ class ModelInstaller extends ComfyDialog {
dataRow.appendChild(data6);
dataRow.appendChild(data_install);
grid.appendChild(dataRow);
this.grid_rows[i] = {data:data, control:dataRow};
}
const panel = document.createElement('div');
@ -936,7 +1075,40 @@ class ModelInstaller extends ComfyDialog {
this.element.appendChild(panel);
}
async createControls() {
createHeaderControls() {
this.search_box = $el('input', {type:'text', id:'manager-model-search-box', placeholder:'input search keyword', value:this.search_keyword}, []);
this.search_box.style.height = "25px";
this.search_box.onkeydown = (event) => {
if (event.key === 'Enter') {
this.search_keyword = this.search_box.value;
this.apply_searchbox();
}
if (event.key === 'Escape') {
this.search_keyword = this.search_box.value;
this.search_box.value = '';
this.apply_searchbox();
}
};
let search_button = document.createElement("button");
search_button.innerHTML = "Search";
search_button.onclick = () => {
this.apply_searchbox();
};
search_button.style.display = "inline-block";
let cell = $el('td', {width:'100%'}, [this.search_box, ' ', search_button]);
let search_control = $el('table', {width:'100%'},
[
$el('tr', {}, [cell])
]
);
cell.style.textAlign = "right";
this.element.appendChild(search_control);
}
async createBottomControls() {
var close_button = document.createElement("button");
close_button.innerHTML = "Close";
close_button.onclick = () => { this.close(); }

BIN
misc/custom-nodes.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 121 KiB

BIN
misc/models.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

After

Width:  |  Height:  |  Size: 120 KiB

8
model-list.json

@ -1,9 +1,9 @@
{
"models": [
{
"name": "TASED Decoder",
"name": "TAESD Decoder",
"type": "VAE",
"base": "TASED",
"base": "TAESD",
"save_path": "vae_approx",
"description": "To view the preview in high quality while running samples in ComfyUI, you will need this model.",
"reference": "https://github.com/madebyollin/taesd",
@ -11,9 +11,9 @@
"url": "https://github.com/madebyollin/taesd/raw/main/taesd_decoder.pth"
},
{
"name": "TASED Encoder",
"name": "TAESD Encoder",
"type": "VAE",
"base": "TASED",
"base": "TAESD",
"save_path": "vae_approx",
"description": "To view the preview in high quality while running samples in ComfyUI, you will need this model.",
"reference": "https://github.com/madebyollin/taesd",

Loading…
Cancel
Save