refactor(decnet_web/DeckyFleet): move IntervalEditor out
Verbatim move of the per-decky mutation-interval modal (~60 LOC) into its own file. Saves null when the toggle is off, minutes otherwise. - New DeckyFleet/IntervalEditor.tsx - IntervalEditor.test.tsx covers null-current disabled path, numeric-current enabled path, and CANCEL not firing onSave. - src/test/fixtures/decky.ts now derives DeckyFixture from the canonical Decky type (the fixture's loose swarm shape was missing host_address/host_status; aligning to Decky catches that statically).
This commit is contained in:
@@ -1004,67 +1004,7 @@ const DeployWizard: React.FC<DeployWizardProps> = ({
|
||||
);
|
||||
};
|
||||
|
||||
// ─── Interval editor modal ───────────────────────────────────────────────
|
||||
|
||||
interface IntervalEditorProps {
|
||||
open: boolean;
|
||||
deckyName: string;
|
||||
current: number | null;
|
||||
onClose: () => void;
|
||||
onSave: (minutes: number | null) => void;
|
||||
}
|
||||
|
||||
const IntervalEditor: React.FC<IntervalEditorProps> = ({ open, deckyName, current, onClose, onSave }) => {
|
||||
const [enabled, setEnabled] = useState<boolean>(current !== null);
|
||||
const [minutes, setMinutes] = useState<number>(current ?? 30);
|
||||
|
||||
return (
|
||||
<Modal
|
||||
open={open}
|
||||
onClose={onClose}
|
||||
title={`MUTATION INTERVAL · ${deckyName}`}
|
||||
icon={RefreshCw}
|
||||
accent="violet"
|
||||
footer={
|
||||
<>
|
||||
<button className="btn ghost" onClick={onClose}>CANCEL</button>
|
||||
<button className="btn violet" onClick={() => onSave(enabled ? minutes : null)}>SAVE</button>
|
||||
</>
|
||||
}
|
||||
>
|
||||
<div className="modal-body">
|
||||
<div style={{ display: 'flex', gap: 10, alignItems: 'center', padding: 14, border: '1px solid var(--border)' }}>
|
||||
<input
|
||||
id="interval-enable"
|
||||
type="checkbox"
|
||||
checked={enabled}
|
||||
onChange={(e) => setEnabled(e.target.checked)}
|
||||
style={{ accentColor: 'var(--matrix)' }}
|
||||
/>
|
||||
<label htmlFor="interval-enable" style={{ fontSize: '0.8rem', letterSpacing: 1 }}>
|
||||
ENABLE PERIODIC MUTATION
|
||||
</label>
|
||||
</div>
|
||||
{enabled && (
|
||||
<div className="tweak-group">
|
||||
<label>INTERVAL ({minutes} minutes)</label>
|
||||
<input
|
||||
type="range"
|
||||
min={5}
|
||||
max={240}
|
||||
step={5}
|
||||
value={minutes}
|
||||
onChange={(e) => setMinutes(parseInt(e.target.value, 10))}
|
||||
/>
|
||||
<div className="dim" style={{ fontSize: '0.65rem', letterSpacing: 1 }}>
|
||||
Applied on the next mutation cycle.
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
import { IntervalEditor } from './DeckyFleet/IntervalEditor';
|
||||
|
||||
// ─── Fleet page ──────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
Reference in New Issue
Block a user