mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-03-25 07:05:43 -03:00
Update
This commit is contained in:
18
nodes.py
18
nodes.py
@@ -71,6 +71,11 @@ class LorasEndpoint:
|
|||||||
|
|
||||||
# Convert to dict for API response
|
# Convert to dict for API response
|
||||||
lora_data = metadata.to_dict()
|
lora_data = metadata.to_dict()
|
||||||
|
# Get relative path and remove filename to get just the folder structure
|
||||||
|
rel_path = os.path.relpath(file_path, self.loras_root)
|
||||||
|
folder = os.path.dirname(rel_path)
|
||||||
|
# Ensure forward slashes for consistency across platforms
|
||||||
|
lora_data['folder'] = folder.replace(os.path.sep, '/')
|
||||||
|
|
||||||
loras.append(lora_data)
|
loras.append(lora_data)
|
||||||
|
|
||||||
@@ -98,7 +103,10 @@ class LorasEndpoint:
|
|||||||
|
|
||||||
# Format the data for the template
|
# Format the data for the template
|
||||||
formatted_loras = [self.format_lora(l) for l in data]
|
formatted_loras = [self.format_lora(l) for l in data]
|
||||||
|
folders = sorted(list(set(l['folder'] for l in data)))
|
||||||
|
|
||||||
|
print("folders:",folders)
|
||||||
|
|
||||||
# Debug logging
|
# Debug logging
|
||||||
if formatted_loras:
|
if formatted_loras:
|
||||||
print(f"Sample lora data: {formatted_loras[0]}")
|
print(f"Sample lora data: {formatted_loras[0]}")
|
||||||
@@ -107,11 +115,13 @@ class LorasEndpoint:
|
|||||||
|
|
||||||
context = {
|
context = {
|
||||||
"loras": formatted_loras,
|
"loras": formatted_loras,
|
||||||
|
"folders": folders,
|
||||||
# Only set single lora if we're viewing details
|
# Only set single lora if we're viewing details
|
||||||
"lora": formatted_loras[0] if formatted_loras else {
|
"lora": formatted_loras[0] if formatted_loras else {
|
||||||
"model_name": "",
|
"model_name": "",
|
||||||
"file_name": "",
|
"file_name": "",
|
||||||
"preview_url": "",
|
"preview_url": "",
|
||||||
|
"folder": "",
|
||||||
"civitai": {
|
"civitai": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"model": "",
|
"model": "",
|
||||||
@@ -148,6 +158,8 @@ class LorasEndpoint:
|
|||||||
"model_name": lora["model_name"],
|
"model_name": lora["model_name"],
|
||||||
"file_name": lora["file_name"],
|
"file_name": lora["file_name"],
|
||||||
"preview_url": lora["preview_url"],
|
"preview_url": lora["preview_url"],
|
||||||
|
"base_model": lora["base_model"],
|
||||||
|
"folder": lora["folder"],
|
||||||
"civitai": lora.get("civitai", {}) or {} # 确保当 civitai 为 None 时返回空字典
|
"civitai": lora.get("civitai", {}) or {} # 确保当 civitai 为 None 时返回空字典
|
||||||
}
|
}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -156,7 +168,9 @@ class LorasEndpoint:
|
|||||||
return {
|
return {
|
||||||
"model_name": lora.get("model_name", "Unknown"),
|
"model_name": lora.get("model_name", "Unknown"),
|
||||||
"file_name": lora.get("file_name", ""),
|
"file_name": lora.get("file_name", ""),
|
||||||
"preview_url": lora.get("preview_url", ""),
|
"preview_url": lora.get("preview_url", ""),
|
||||||
|
"base_model": lora.get("base_model", ""),
|
||||||
|
"folder": lora.get("folder", ""),
|
||||||
"civitai": {
|
"civitai": {
|
||||||
"id": "",
|
"id": "",
|
||||||
"modelId": "",
|
"modelId": "",
|
||||||
|
|||||||
@@ -27,22 +27,25 @@ body {
|
|||||||
/* 文件夹标签样式 */
|
/* 文件夹标签样式 */
|
||||||
.folder-tags {
|
.folder-tags {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 8px;
|
gap: 4px;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
padding: 10px 0;
|
padding: 4px 0;
|
||||||
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tag {
|
.tag {
|
||||||
padding: 6px 12px;
|
|
||||||
border-radius: 20px;
|
|
||||||
background: #e0e0e0;
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
white-space: nowrap;
|
padding: 2px 8px;
|
||||||
transition: all 0.3s;
|
margin: 2px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-radius: 3px;
|
||||||
|
display: inline-block;
|
||||||
|
line-height: 1.2;
|
||||||
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tag.active {
|
.tag.active {
|
||||||
background: var(--primary-color);
|
background-color: #007bff;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,22 +17,6 @@ function sortCards(sortBy) {
|
|||||||
cards.forEach(card => grid.appendChild(card));
|
cards.forEach(card => grid.appendChild(card));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 文件夹筛选
|
|
||||||
document.querySelectorAll('.tag').forEach(tag => {
|
|
||||||
tag.addEventListener('click', () => {
|
|
||||||
document.querySelectorAll('.tag').forEach(t => t.classList.remove('active'));
|
|
||||||
tag.classList.add('active');
|
|
||||||
const folder = tag.dataset.folder;
|
|
||||||
filterByFolder(folder);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function filterByFolder(folder) {
|
|
||||||
document.querySelectorAll('.lora-card').forEach(card => {
|
|
||||||
card.style.display = card.dataset.folder === folder ? 'block' : 'none';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 刷新功能
|
// 刷新功能
|
||||||
async function refreshLoras() {
|
async function refreshLoras() {
|
||||||
try {
|
try {
|
||||||
@@ -210,6 +194,28 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function toggleFolder(element) {
|
||||||
|
// Remove active class from all tags if clicking already active tag
|
||||||
|
if (element.classList.contains('active')) {
|
||||||
|
document.querySelectorAll('.tag').forEach(tag => tag.classList.remove('active'));
|
||||||
|
// Show all cards
|
||||||
|
document.querySelectorAll('.lora-card').forEach(card => card.style.display = '');
|
||||||
|
} else {
|
||||||
|
// Remove active class from all tags
|
||||||
|
document.querySelectorAll('.tag').forEach(tag => tag.classList.remove('active'));
|
||||||
|
// Add active class to clicked tag
|
||||||
|
element.classList.add('active');
|
||||||
|
// Hide all cards first
|
||||||
|
document.querySelectorAll('.lora-card').forEach(card => {
|
||||||
|
if (card.getAttribute('data-folder') === element.getAttribute('data-folder')) {
|
||||||
|
card.style.display = '';
|
||||||
|
} else {
|
||||||
|
card.style.display = 'none';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 主题切换
|
// 主题切换
|
||||||
function toggleTheme() {
|
function toggleTheme() {
|
||||||
const theme = document.body.dataset.theme || 'light';
|
const theme = document.body.dataset.theme || 'light';
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
<div class="controls">
|
<div class="controls">
|
||||||
<div class="folder-tags">
|
<div class="folder-tags">
|
||||||
{% for folder in folders %}
|
{% for folder in folders %}
|
||||||
<div class="tag" data-folder="{{ folder }}">{{ folder }}</div>
|
<div class="tag" data-folder="{{ folder }}" onclick="toggleFolder(this)">{{ folder }}</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
<div class="card-grid" id="loraGrid">
|
<div class="card-grid" id="loraGrid">
|
||||||
{% for lora in loras %}
|
{% for lora in loras %}
|
||||||
<!-- 在卡片部分更新元数据展示 -->
|
<!-- 在卡片部分更新元数据展示 -->
|
||||||
<div class="lora-card" data-name="{{ lora.model_name }}" data-file_name="{{ lora.file_name }}" data-meta="{{ lora.civitai | default({}) | tojson | forceescape }}">
|
<div class="lora-card" data-name="{{ lora.model_name }}" data-file_name="{{ lora.file_name }}" data-folder="{{ lora.folder }}" data-meta="{{ lora.civitai | default({}) | tojson | forceescape }}">
|
||||||
<div class="card-preview">
|
<div class="card-preview">
|
||||||
<img src="{{ lora.preview_url or '/loras_static/images/no-preview.png' }}" alt="{{ lora.name }}">
|
<img src="{{ lora.preview_url or '/loras_static/images/no-preview.png' }}" alt="{{ lora.name }}">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
|
|||||||
Reference in New Issue
Block a user