mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-06-22 03:20:54 -03:00
feat(ui): add group-by-model toggle to global context menu
Adds a 'Group by Model' toggle entry to the right-click global context menu for quick access, complementing the existing setting in Settings → Layout Settings. The menu item shows a checkmark indicator reflecting the current state and immediately reloads the view on toggle. Also fixes he.json translation that was mojibake (garbled characters). Includes: - Context menu HTML item with check-indicator - JS toggle logic via settingsManager - i18n for all 10 locales - Hebrew translation fix
This commit is contained in:
@@ -183,6 +183,9 @@
|
|||||||
},
|
},
|
||||||
"manageExcludedModels": {
|
"manageExcludedModels": {
|
||||||
"label": "Ausgeschlossene Modelle verwalten"
|
"label": "Ausgeschlossene Modelle verwalten"
|
||||||
|
},
|
||||||
|
"groupByModel": {
|
||||||
|
"label": "Nach Modell gruppieren"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
|
|||||||
@@ -183,6 +183,9 @@
|
|||||||
},
|
},
|
||||||
"manageExcludedModels": {
|
"manageExcludedModels": {
|
||||||
"label": "Manage Excluded Models"
|
"label": "Manage Excluded Models"
|
||||||
|
},
|
||||||
|
"groupByModel": {
|
||||||
|
"label": "Group by Model"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
|
|||||||
@@ -183,6 +183,9 @@
|
|||||||
},
|
},
|
||||||
"manageExcludedModels": {
|
"manageExcludedModels": {
|
||||||
"label": "Gestionar modelos excluidos"
|
"label": "Gestionar modelos excluidos"
|
||||||
|
},
|
||||||
|
"groupByModel": {
|
||||||
|
"label": "Agrupar por modelo"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
|
|||||||
@@ -183,6 +183,9 @@
|
|||||||
},
|
},
|
||||||
"manageExcludedModels": {
|
"manageExcludedModels": {
|
||||||
"label": "Gérer les modèles exclus"
|
"label": "Gérer les modèles exclus"
|
||||||
|
},
|
||||||
|
"groupByModel": {
|
||||||
|
"label": "Grouper par modèle"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
|
|||||||
@@ -183,6 +183,9 @@
|
|||||||
},
|
},
|
||||||
"manageExcludedModels": {
|
"manageExcludedModels": {
|
||||||
"label": "ניהול מודלים מוחרגים"
|
"label": "ניהול מודלים מוחרגים"
|
||||||
|
},
|
||||||
|
"groupByModel": {
|
||||||
|
"label": "קיבוץ לפי דגם"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
|
|||||||
@@ -183,6 +183,9 @@
|
|||||||
},
|
},
|
||||||
"manageExcludedModels": {
|
"manageExcludedModels": {
|
||||||
"label": "除外モデルを管理"
|
"label": "除外モデルを管理"
|
||||||
|
},
|
||||||
|
"groupByModel": {
|
||||||
|
"label": "モデルでグループ化"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
|
|||||||
@@ -183,6 +183,9 @@
|
|||||||
},
|
},
|
||||||
"manageExcludedModels": {
|
"manageExcludedModels": {
|
||||||
"label": "제외된 모델 관리"
|
"label": "제외된 모델 관리"
|
||||||
|
},
|
||||||
|
"groupByModel": {
|
||||||
|
"label": "모델별 그룹화"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
|
|||||||
@@ -183,6 +183,9 @@
|
|||||||
},
|
},
|
||||||
"manageExcludedModels": {
|
"manageExcludedModels": {
|
||||||
"label": "Управление исключёнными моделями"
|
"label": "Управление исключёнными моделями"
|
||||||
|
},
|
||||||
|
"groupByModel": {
|
||||||
|
"label": "Группировать по модели"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
|
|||||||
@@ -183,6 +183,9 @@
|
|||||||
},
|
},
|
||||||
"manageExcludedModels": {
|
"manageExcludedModels": {
|
||||||
"label": "管理已排除的模型"
|
"label": "管理已排除的模型"
|
||||||
|
},
|
||||||
|
"groupByModel": {
|
||||||
|
"label": "按模型分组"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
|
|||||||
@@ -183,6 +183,9 @@
|
|||||||
},
|
},
|
||||||
"manageExcludedModels": {
|
"manageExcludedModels": {
|
||||||
"label": "管理已排除的模型"
|
"label": "管理已排除的模型"
|
||||||
|
},
|
||||||
|
"groupByModel": {
|
||||||
|
"label": "按模型分組"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
|
|||||||
@@ -24,6 +24,14 @@ export class GlobalContextMenu extends BaseContextMenu {
|
|||||||
const cleanupExamplesItem = this.menu.querySelector('[data-action="cleanup-example-images-folders"]');
|
const cleanupExamplesItem = this.menu.querySelector('[data-action="cleanup-example-images-folders"]');
|
||||||
const excludedModelsItem = this.menu.querySelector('[data-action="manage-excluded-models"]');
|
const excludedModelsItem = this.menu.querySelector('[data-action="manage-excluded-models"]');
|
||||||
const repairRecipesItem = this.menu.querySelector('[data-action="repair-recipes"]');
|
const repairRecipesItem = this.menu.querySelector('[data-action="repair-recipes"]');
|
||||||
|
const groupByModelItem = this.menu.querySelector('[data-action="toggle-group-by-model"]');
|
||||||
|
const groupByModelCheck = groupByModelItem?.querySelector('.check-indicator');
|
||||||
|
|
||||||
|
// Update check indicator for group-by-model
|
||||||
|
if (groupByModelCheck) {
|
||||||
|
const isEnabled = !!state.global.settings.group_by_model;
|
||||||
|
groupByModelCheck.style.display = isEnabled ? 'block' : 'none';
|
||||||
|
}
|
||||||
|
|
||||||
if (isRecipesPage) {
|
if (isRecipesPage) {
|
||||||
modelUpdateItem?.classList.add('hidden');
|
modelUpdateItem?.classList.add('hidden');
|
||||||
@@ -31,6 +39,7 @@ export class GlobalContextMenu extends BaseContextMenu {
|
|||||||
downloadExamplesItem?.classList.add('hidden');
|
downloadExamplesItem?.classList.add('hidden');
|
||||||
cleanupExamplesItem?.classList.add('hidden');
|
cleanupExamplesItem?.classList.add('hidden');
|
||||||
excludedModelsItem?.classList.add('hidden');
|
excludedModelsItem?.classList.add('hidden');
|
||||||
|
groupByModelItem?.classList.add('hidden');
|
||||||
repairRecipesItem?.classList.remove('hidden');
|
repairRecipesItem?.classList.remove('hidden');
|
||||||
} else {
|
} else {
|
||||||
modelUpdateItem?.classList.remove('hidden');
|
modelUpdateItem?.classList.remove('hidden');
|
||||||
@@ -38,6 +47,7 @@ export class GlobalContextMenu extends BaseContextMenu {
|
|||||||
downloadExamplesItem?.classList.remove('hidden');
|
downloadExamplesItem?.classList.remove('hidden');
|
||||||
cleanupExamplesItem?.classList.remove('hidden');
|
cleanupExamplesItem?.classList.remove('hidden');
|
||||||
excludedModelsItem?.classList.remove('hidden');
|
excludedModelsItem?.classList.remove('hidden');
|
||||||
|
groupByModelItem?.classList.remove('hidden');
|
||||||
repairRecipesItem?.classList.add('hidden');
|
repairRecipesItem?.classList.add('hidden');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,6 +84,9 @@ export class GlobalContextMenu extends BaseContextMenu {
|
|||||||
case 'manage-excluded-models':
|
case 'manage-excluded-models':
|
||||||
this.manageExcludedModels();
|
this.manageExcludedModels();
|
||||||
break;
|
break;
|
||||||
|
case 'toggle-group-by-model':
|
||||||
|
this.toggleGroupByModel();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
console.warn(`Unhandled global context menu action: ${action}`);
|
console.warn(`Unhandled global context menu action: ${action}`);
|
||||||
break;
|
break;
|
||||||
@@ -86,6 +99,25 @@ export class GlobalContextMenu extends BaseContextMenu {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toggleGroupByModel() {
|
||||||
|
const sm = window.settingsManager;
|
||||||
|
if (!sm) {
|
||||||
|
console.error('settingsManager not available on window');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const newValue = !state.global.settings.group_by_model;
|
||||||
|
state.global.settings.group_by_model = newValue;
|
||||||
|
|
||||||
|
sm.saveSetting('group_by_model', newValue).catch((error) => {
|
||||||
|
console.error('Failed to save group_by_model setting:', error);
|
||||||
|
// Revert state on failure
|
||||||
|
state.global.settings.group_by_model = !newValue;
|
||||||
|
});
|
||||||
|
|
||||||
|
sm.applyFrontendSettings();
|
||||||
|
sm.reloadContent();
|
||||||
|
}
|
||||||
|
|
||||||
async downloadExampleImages(menuItem) {
|
async downloadExampleImages(menuItem) {
|
||||||
const downloadPath = state?.global?.settings?.example_images_path;
|
const downloadPath = state?.global?.settings?.example_images_path;
|
||||||
if (!downloadPath) {
|
if (!downloadPath) {
|
||||||
|
|||||||
@@ -158,6 +158,11 @@
|
|||||||
<div class="context-menu-item" data-action="manage-excluded-models">
|
<div class="context-menu-item" data-action="manage-excluded-models">
|
||||||
<i class="fas fa-eye-slash"></i> <span>{{ t('globalContextMenu.manageExcludedModels.label', default='Manage Excluded Models') }}</span>
|
<i class="fas fa-eye-slash"></i> <span>{{ t('globalContextMenu.manageExcludedModels.label', default='Manage Excluded Models') }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="context-menu-separator"></div>
|
||||||
|
<div class="context-menu-item" data-action="toggle-group-by-model">
|
||||||
|
<i class="fas fa-layer-group"></i> <span>{{ t('globalContextMenu.groupByModel.label') }}</span>
|
||||||
|
<i class="fas fa-check check-indicator" style="margin-left:auto;display:none"></i>
|
||||||
|
</div>
|
||||||
<div class="context-menu-item" data-action="repair-recipes">
|
<div class="context-menu-item" data-action="repair-recipes">
|
||||||
<i class="fas fa-tools"></i> <span>{{ t('globalContextMenu.repairRecipes.label') }}</span>
|
<i class="fas fa-tools"></i> <span>{{ t('globalContextMenu.repairRecipes.label') }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user