Refactor UI, settings, and code quality across all categories
- Fix Replace Cover: routes now read preview_path from form POST instead of session (session writes from background threads were lost) - Fix batch generation: submit all jobs immediately, poll all in parallel via Promise.all - Fix label NameError in character generate route - Fix style detail missing characters context - Selected Preview pane: click any image to select it; data-preview-path on all images across all 8 detail templates - Gallery → Library rename across all index page headings and navbar - Settings: add configurable LoRA/checkpoint directories; default checkpoint selector moved from navbar to settings page - Consolidate 6 get_available_*_loras() into single get_available_loras(category) reading from Settings - ComfyUI tooltip shows currently loaded checkpoint name - Remove navbar checkpoint bar - Phase 4 cleanup: remove dead _queue_generation(), add session.modified, standardize log prefixes, rename action_type → action Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -73,6 +73,70 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<!-- Directory Settings -->
|
||||
<h5 class="mb-3 text-primary">LoRA Directories</h5>
|
||||
<p class="text-muted small">Absolute paths on disk where LoRA files are scanned for each category.</p>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="lora_dir_characters" class="form-label">Characters / Looks</label>
|
||||
<input type="text" class="form-control" id="lora_dir_characters" name="lora_dir_characters"
|
||||
value="{{ settings.lora_dir_characters or '/ImageModels/lora/Illustrious/Looks' }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="lora_dir_outfits" class="form-label">Outfits</label>
|
||||
<input type="text" class="form-control" id="lora_dir_outfits" name="lora_dir_outfits"
|
||||
value="{{ settings.lora_dir_outfits or '/ImageModels/lora/Illustrious/Clothing' }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="lora_dir_actions" class="form-label">Actions</label>
|
||||
<input type="text" class="form-control" id="lora_dir_actions" name="lora_dir_actions"
|
||||
value="{{ settings.lora_dir_actions or '/ImageModels/lora/Illustrious/Poses' }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="lora_dir_styles" class="form-label">Styles</label>
|
||||
<input type="text" class="form-control" id="lora_dir_styles" name="lora_dir_styles"
|
||||
value="{{ settings.lora_dir_styles or '/ImageModels/lora/Illustrious/Styles' }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="lora_dir_scenes" class="form-label">Scenes</label>
|
||||
<input type="text" class="form-control" id="lora_dir_scenes" name="lora_dir_scenes"
|
||||
value="{{ settings.lora_dir_scenes or '/ImageModels/lora/Illustrious/Backgrounds' }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="lora_dir_detailers" class="form-label">Detailers</label>
|
||||
<input type="text" class="form-control" id="lora_dir_detailers" name="lora_dir_detailers"
|
||||
value="{{ settings.lora_dir_detailers or '/ImageModels/lora/Illustrious/Detailers' }}">
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<h5 class="mb-3 text-primary">Checkpoint Directories</h5>
|
||||
<div class="mb-3">
|
||||
<label for="checkpoint_dirs" class="form-label">Checkpoint Scan Paths</label>
|
||||
<input type="text" class="form-control" id="checkpoint_dirs" name="checkpoint_dirs"
|
||||
value="{{ settings.checkpoint_dirs or '/ImageModels/Stable-diffusion/Illustrious,/ImageModels/Stable-diffusion/Noob' }}">
|
||||
<div class="form-text">Comma-separated list of directories to scan for checkpoint files.</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<h5 class="mb-3 text-primary">Default Checkpoint</h5>
|
||||
<div class="mb-3">
|
||||
<label for="default_checkpoint" class="form-label">Active Checkpoint</label>
|
||||
<div class="input-group">
|
||||
<select class="form-select" id="default_checkpoint">
|
||||
<option value="">— workflow default —</option>
|
||||
{% for ckpt in all_checkpoints %}
|
||||
<option value="{{ ckpt.checkpoint_path }}"{% if ckpt.checkpoint_path == default_checkpoint_path %} selected{% endif %}>{{ ckpt.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<span id="ckpt-save-status" class="input-group-text text-success" style="opacity:0;transition:opacity 0.5s">Saved</span>
|
||||
</div>
|
||||
<div class="form-text">Sets the checkpoint used for all generation requests. Saved immediately on change.</div>
|
||||
</div>
|
||||
|
||||
<div class="d-grid mt-4">
|
||||
<button type="submit" class="btn btn-primary btn-lg">Save All Settings</button>
|
||||
</div>
|
||||
@@ -152,6 +216,22 @@
|
||||
}
|
||||
});
|
||||
|
||||
// Default Checkpoint
|
||||
const defaultCkptSelect = document.getElementById('default_checkpoint');
|
||||
const ckptSaveStatus = document.getElementById('ckpt-save-status');
|
||||
if (defaultCkptSelect) {
|
||||
defaultCkptSelect.addEventListener('change', () => {
|
||||
fetch('/set_default_checkpoint', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
body: 'checkpoint_path=' + encodeURIComponent(defaultCkptSelect.value)
|
||||
}).then(() => {
|
||||
ckptSaveStatus.style.opacity = '1';
|
||||
setTimeout(() => { ckptSaveStatus.style.opacity = '0'; }, 1500);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Local Model Loading
|
||||
const connectLocalBtn = document.getElementById('connect-local-btn');
|
||||
const localModelSelect = document.getElementById('local_model');
|
||||
|
||||
Reference in New Issue
Block a user