Skip to content

Commit ac2a84d

Browse files
committed
fix: enable individual opening when all states are collapsed
and vice-versa: individual closing when all states are opened
1 parent 30f9ff2 commit ac2a84d

File tree

1 file changed

+24
-3
lines changed

1 file changed

+24
-3
lines changed

widget/src/traceDisplay.tsx

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,16 +449,37 @@ const StateCard: React.FC<{
449449
forceOpen?: boolean | null; // null means use local state, true/false forces open/closed
450450
hiddenFields?: Set<string>;
451451
onHideField?: (fieldName: string) => void;
452-
}> = ({ st, highlighted = false, changes, showRemovals = false, forceOpen = null, hiddenFields, onHideField }) => {
452+
onResetForceOpen?: () => void; // Called when user clicks header while forceOpen is active
453+
}> = ({ st, highlighted = false, changes, showRemovals = false, forceOpen = null, hiddenFields, onHideField, onResetForceOpen }) => {
453454
const [localOpen, setLocalOpen] = React.useState(true);
455+
456+
// Sync local state when forceOpen changes - this ensures that when we
457+
// reset to individual control, each state keeps the forced value
458+
React.useEffect(() => {
459+
if (forceOpen !== null) {
460+
setLocalOpen(forceOpen);
461+
}
462+
}, [forceOpen]);
463+
454464
// Use forceOpen if set, otherwise use local state
455465
const open = forceOpen !== null ? forceOpen : localOpen;
466+
467+
const handleHeaderClick = () => {
468+
if (forceOpen !== null && onResetForceOpen) {
469+
// User clicked while in force mode - switch to individual control
470+
// Set local state to opposite of current forced state, then reset force
471+
setLocalOpen(!forceOpen);
472+
onResetForceOpen();
473+
} else {
474+
setLocalOpen(o => !o);
475+
}
476+
};
456477
// Filter out hidden fields
457478
const entries = Object.entries(st.fields).filter(([k]) => !hiddenFields?.has(k));
458479

459480
return (
460481
<div className={`state-card ${highlighted ? "is-highlighted" : ""}`}>
461-
<div className="state-header" onClick={() => setLocalOpen((o) => !o)}>
482+
<div className="state-header" onClick={handleHeaderClick}>
462483
<span className="action-chip" title={st.tag ?? ''}>
463484
{st.tag || '(no action)'}
464485
</span>
@@ -1189,7 +1210,7 @@ const ModelCheckerView: React.FC<ModelCheckerViewProps> = ({
11891210
{trace.map((s: ParsedState, idx: number) => {
11901211
const prev = idx > 0 ? trace[idx - 1].fields : undefined;
11911212
const changes = diffChanges(prev, s.fields);
1192-
return <StateCard key={s.index} st={s} changes={changes} showRemovals={showRemovals} forceOpen={allStatesOpen} hiddenFields={hiddenFields} onHideField={toggleFieldVisibility} />;
1213+
return <StateCard key={s.index} st={s} changes={changes} showRemovals={showRemovals} forceOpen={allStatesOpen} hiddenFields={hiddenFields} onHideField={toggleFieldVisibility} onResetForceOpen={() => setAllStatesOpen(null)} />;
11931214
})}
11941215
</div>
11951216

0 commit comments

Comments
 (0)