Two QoL tweaks:
- CANCEL button text → EXIT (clearer when paired with the new "stays open"
behavior — there's nothing to "cancel" after queuing).
- Generate New no longer closes the modal. The QUEUED! flash on the button
is enough confirmation. Users can keep tweaking sampler/cfg/prompt and
queueing additional revisions of the same image without re-opening.
Close manually via EXIT or Esc.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Four bugs in 111e24d:
1. Dropdown positions were zoom-dependent / offset because JS overrode
the HTML's "position: absolute; top: 100%" with "position: fixed" +
getBoundingClientRect() coords. Inside the dashboard iframe (with
Comfy's transformed canvas as ancestor), position:fixed becomes
relative to that ancestor instead of viewport. Fix: wrap button +
menus in a position:relative anchor div (#quick-filter-anchor), drop
all JS coord setting, let CSS handle positioning.
2. Click-outside handler stayed registered after items used
e.stopPropagation, so reopening required toggling another UI element
first. Fix: named _qfMenusOutsideHandler with explicit
_qfAttachOutsideHandler/_qfDetachOutsideHandler pair; capture phase
(third arg true) bypasses stopPropagation; _closeQuickFilterMenus
now calls _qfDetachOutsideHandler; addQuickFilter calls
_closeQuickFilterMenus upfront.
3. Value menu was anchored to a hidden element (type menu hidden BEFORE
value menu opened), so getBoundingClientRect returned zeros and value
menu rendered at viewport (0, 6). Fixed by Bug 1 (CSS positioning);
anchorEl param dropped from _openQuickFilterValueMenu.
4. lora_strength wasn't in _qfAllTypes / _qfFacetableTypes /
_qfTypeLabels / _qfExtractItemValue / _quickFilterMatches. Now
selectable: extracts first lora's first strength from item.lora,
compares with 1e-6 float tolerance.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a third filter mode alongside main buttons / search / logic.
User clicks "+ Add Quick Filter" -> picks a type (LoRA/CFG/etc.) ->
picks a value -> adds a chip. Each chip can be expanded to show
"sub-filters": values of OTHER filter types that exist within the
subset matching this chip's primary. Click a sub-filter button to
add it as another chip (ANDed with existing).
Designed as faceted search: drill-down by selecting facets one at
a time. Each chip is independent and ANDed with the others (matching
the GitHub discussion's "logical && between boxes" semantic).
LoRA matching handles stacks ("name1 + name2"), so a "DMD2"
quickFilter matches items where DMD2 is one of multiple stacked
loras. Numeric types (cfg/steps/denoise/seed) use 1e-6 float
tolerance matching the Logic Filter convention.
Reset All Filters and the R key both clear quickFilters along with
the other filter mechanisms.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Clicking a card image now opens the Revise modal as a lightbox. Adds a
navigation bar with prev/next buttons and a position counter. Arrow keys
(← →), Space/Shift+Space navigate between filtered items; 1-9 favorites
the current image. Grid keyboard shortcuts are suppressed while the modal
is open to prevent conflicts.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a Logic Filter panel in the filter modal with field/operator/value
dropdowns (supports lora_strength, cfg, steps, denoise, width, height,
seed). Multiple filters apply with AND logic. Chips display active filters
with one-click removal. Integrates into data pipeline via matchesLogicFilters()
helper. Reset All Filters also clears logic filters.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a 'Reset All' button to the filter modal header that re-selects all
filter buttons and clears search/logic filters. Updates the R key shortcut
to also reset the filter UI before reloading cards so visual state stays
consistent with the data.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a 'Delete All Rejected Items' button in the cog menu next to the
existing 'Delete All Non Favorited Items' button. Adds the matching
/config_tester/delete_rejected backend endpoint that removes rejected
item files and updates the manifest.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The GENERATE NEW button was only sending sampler/scheduler/steps/cfg/
denoise/lora — missing model, seed, prompts, and all advanced settings.
The generated image would use whatever the sampler node had as defaults
instead of the actual parameters from the source image.
Fixed triggerGen() to build a complete config entry:
- Model and seed from the (now editable) modal fields
- Positive and negative prompts from the modal textareas
- seed_behavior set to "fixed" so the exact seed is used
- All advanced settings carried from the source item: vae, clip_type,
model_type, text_encoders, attention_mode, clip_skip,
model_sampling_override + shift values, advanced_sampling,
flux_guidance, gguf_options
Also wraps output in {"configs": [...]} format (was sending bare array).
Template changes:
- Model input: removed disabled attribute + opacity
- Seed input: removed disabled attribute + opacity
Both are now editable so users can change model or seed before re-gen.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a button in the Dashboard's Export Favorites section that generates
a complete Config Builder JSON from all favorited items, ready to paste
into the Builder UI's lora_config widget.
How it works:
- Collects all favorited items from activeData
- Groups by unique (model, lora, positive, negative) combination
- Each group becomes a config array with all unique samplers,
schedulers, steps, cfg values from that group's favorites
- LoRA stacks ("lora1 + lora2") are preserved with combine=true
- Per-config prompts are set via use_custom_prompts + positive_prompt_groups
- Session name gets "_rerun" suffix
Output is copied to clipboard. User can then paste into the Config
Builder, adjust resolution/steps/other settings, and regenerate just
the favorited configurations with different parameters.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a new "Type" filter row to the filter panel that lets users toggle
between showing images and videos. Works alongside all existing filters
(sampler, scheduler, model, upscale, etc.).
- logic_state.js: new filters.mediaType Set
- logic_pipeline.js: filter check in both incrementalFilter and
executePipeline; included in getFilterKey() hash for cache
invalidation
- logic_ui.js initFilters(): populate mediaType values from
d.media_type (defaults to "image" for backwards compat)
- template.html: new .filter-row with #filter-mediaType container
Items without media_type still appear under "image" automatically.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Press 1-9 to toggle favorite on the Nth visible card in reading order
(left-to-right, top-to-bottom). Uses getBoundingClientRect() for
accurate card detection regardless of zoom, pan, or dynamic card sizes.
Visual feedback: green/red glow + number badge overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the simplified single-step config editor with renderPipelineEditor(),
a full pipeline/step UI matching the Builder UI feature set:
- Multiple pipelines with add/remove, active toggle, name, collapsible
- Multiple steps per pipeline with all settings (mode, resize, ratio,
denoise, hires steps, tiled sampling, tiled VAE, repeat)
- Multi-model selector with searchable dropdown and chips
- HiRes prompt adjustment section
- Iteration count display per step
Also fixes:
- Preset double-entry bug: save now deduplicates by name in both
Builder UI and dashboard modal
- Builder UI hires_force_uniform_tiles checkbox: || true -> !== false
(was always displaying as checked regardless of stored value)
- Model list fetch: GET instead of POST (matching the endpoint)
- Modal size: 600px wide, 90vh tall for better fit
- Cancel button: sends cancel request to server during active upscale
instead of just closing the modal
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Added R (reload), Shift+0-9 (columns), Ctrl+S (save), Escape (close),
Double-click (favorite). Fixed F description (fullscreen, not auto-fit).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Modal overlay with click-outside-to-close. JS file added to
html_generator.py load order after logic_ui.js.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the session <select> dropdown with a searchable scrollable list.
Sessions already come sorted by most recent from the backend. Added
search input that filters sessions by name in real time.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New filter buttons for Steps, CFG, and Upscale (combined mode + model
name). Applied in both the new-items filter path and the full
executePipeline filter path.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Slider in Label Mode settings (6-16px range) controls overlay text size.
Uses CSS custom property for instant updates. Persisted to localStorage.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace flat upscale configs with pipeline/steps/repeat architecture:
- Pipelines run independently from base image
- Steps chain sequentially within a pipeline
- Steps support repeat count for iterative refinement
Add "Save Pre-Upscaled Output" option to also keep the base image.
Add "Adjust Prompt During HiRes Fix" with prepend/append/replace
behaviors. HiRes-adjusted prompts are batch pre-encoded for efficiency.
Results written to manifest metadata and exposed as label overlays.
Fix fmtVal scoping error in buildLabelOverlay (was referenced outside
the upscale block where it was defined).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds color-coded metadata labels (model, lora, prompt, sampler,
scheduler, cfg, steps, seed, denoise) as image overlays in the
dashboard grid. Settings panel with per-field toggles and unique-only
mode that hides values shared by every card. Per-lora filtering skips
global loras while showing unique ones. Persisted via localStorage,
backwards compatible with older sessions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Topbar: Changed Load Session to Reload Session with refresh icon
- Settings cog: Added session picker dropdown in SESSION section
- New endpoint: GET /config_tester/list_sessions returns sessions with
metadata (name, item count, first image, modification time)
- Landing page: Shows session cards with thumbnails when no session loaded
- Click any card or use dropdown to load a session
- Landing page auto-hides when session data loads
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>