This commit is contained in:
Will Miao
2025-01-26 07:21:26 +08:00
parent 9d64ebc5d6
commit 6e9ed34b92
4 changed files with 51 additions and 28 deletions

View File

@@ -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,6 +103,9 @@ 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:
@@ -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:
@@ -157,6 +169,8 @@ class LorasEndpoint:
"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": "",

View File

@@ -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;
} }

View File

@@ -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';

View File

@@ -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">