Skip to content

Commit 08159ae

Browse files
authored
Merge pull request #3 from gkamradt/codex/center-terminal-number-selector-and-add-increment-buttons
Add +/-10 terminal controls
2 parents 41f05b5 + 2c3b841 commit 08159ae

File tree

2 files changed

+85
-5
lines changed

2 files changed

+85
-5
lines changed

src/components/ControlsPanel/ControlsPanel.tsx

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,26 @@ export function ControlsPanel({
2525
}
2626
};
2727

28+
const handleIncrementByTen = () => {
29+
if (terminalCount < maxTerminals) {
30+
const newCount = Math.min(terminalCount + 10, maxTerminals);
31+
onTerminalCountChange(newCount);
32+
}
33+
};
34+
2835
const handleDecrement = () => {
2936
if (terminalCount > minTerminals) {
3037
onTerminalCountChange(terminalCount - 1);
3138
}
3239
};
3340

41+
const handleDecrementByTen = () => {
42+
if (terminalCount > minTerminals) {
43+
const newCount = Math.max(terminalCount - 10, minTerminals);
44+
onTerminalCountChange(newCount);
45+
}
46+
};
47+
3448
const toggleVisibility = () => {
3549
setIsVisible(!isVisible);
3650
};
@@ -67,7 +81,17 @@ export function ControlsPanel({
6781
</div>
6882

6983
{/* Terminal Count Control */}
70-
<div className="flex items-center space-x-3">
84+
<div className="flex items-center justify-center space-x-3">
85+
<button
86+
onClick={handleDecrementByTen}
87+
disabled={terminalCount <= minTerminals}
88+
className="w-8 h-8 bg-red-600 hover:bg-red-700 disabled:bg-gray-600 disabled:cursor-not-allowed text-white rounded font-bold transition-colors border-0 p-0"
89+
style={{ backgroundColor: terminalCount <= minTerminals ? '#4b5563' : '#dc2626' }}
90+
aria-label="Remove ten terminals"
91+
>
92+
-10
93+
</button>
94+
7195
<button
7296
onClick={handleDecrement}
7397
disabled={terminalCount <= minTerminals}
@@ -77,11 +101,11 @@ export function ControlsPanel({
77101
>
78102
-
79103
</button>
80-
104+
81105
<span className="text-white font-mono text-sm min-w-[3rem] text-center">
82106
{terminalCount} terminal{terminalCount !== 1 ? 's' : ''}
83107
</span>
84-
108+
85109
<button
86110
onClick={handleIncrement}
87111
disabled={terminalCount >= maxTerminals}
@@ -91,6 +115,16 @@ export function ControlsPanel({
91115
>
92116
+
93117
</button>
118+
119+
<button
120+
onClick={handleIncrementByTen}
121+
disabled={terminalCount >= maxTerminals}
122+
className="w-8 h-8 bg-green-600 hover:bg-green-700 disabled:bg-gray-600 disabled:cursor-not-allowed text-white rounded font-bold transition-colors border-0 p-0"
123+
style={{ backgroundColor: terminalCount >= maxTerminals ? '#4b5563' : '#059669' }}
124+
aria-label="Add ten terminals"
125+
>
126+
+10
127+
</button>
94128
</div>
95129

96130
{/* Arrange Button */}

src/components/ControlsPanel/__tests__/ControlsPanel.test.tsx

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ describe('ControlsPanel', () => {
2929
expect(screen.getByText('1 terminal')).toBeInTheDocument();
3030
expect(screen.getByText('+')).toBeInTheDocument();
3131
expect(screen.getByText('-')).toBeInTheDocument();
32+
expect(screen.getByText('+10')).toBeInTheDocument();
33+
expect(screen.getByText('-10')).toBeInTheDocument();
3234
expect(screen.getByText('Arrange')).toBeInTheDocument();
3335
expect(screen.getByText(/Theme:/)).toBeInTheDocument();
3436
expect(screen.getByText(/Made with by/)).toBeInTheDocument();
@@ -57,6 +59,28 @@ describe('ControlsPanel', () => {
5759
expect(mockOnTerminalCountChange).toHaveBeenCalledWith(2);
5860
});
5961

62+
it('should call onTerminalCountChange when +10 button is clicked', () => {
63+
const mockOnTerminalCountChange = vi.fn();
64+
const mockOnArrangeTerminals = vi.fn();
65+
66+
render(
67+
<ThemeProvider>
68+
<AppProvider>
69+
<ControlsPanel
70+
terminalCount={1}
71+
onTerminalCountChange={mockOnTerminalCountChange}
72+
onArrangeTerminals={mockOnArrangeTerminals}
73+
/>
74+
</AppProvider>
75+
</ThemeProvider>
76+
);
77+
78+
const incrementTenButton = screen.getByText('+10');
79+
fireEvent.click(incrementTenButton);
80+
81+
expect(mockOnTerminalCountChange).toHaveBeenCalledWith(11);
82+
});
83+
6084
it('should call onArrangeTerminals when Arrange button is clicked', () => {
6185
const mockOnTerminalCountChange = vi.fn();
6286
const mockOnArrangeTerminals = vi.fn();
@@ -81,8 +105,30 @@ describe('ControlsPanel', () => {
81105

82106
it('should disable decrement button when at minimum (1)', () => {
83107
renderControlsPanel();
84-
108+
85109
const decrementButton = screen.getByText('-');
86110
expect(decrementButton).toBeDisabled();
87111
});
88-
});
112+
113+
it('should call onTerminalCountChange when -10 button is clicked', () => {
114+
const mockOnTerminalCountChange = vi.fn();
115+
const mockOnArrangeTerminals = vi.fn();
116+
117+
render(
118+
<ThemeProvider>
119+
<AppProvider>
120+
<ControlsPanel
121+
terminalCount={20}
122+
onTerminalCountChange={mockOnTerminalCountChange}
123+
onArrangeTerminals={mockOnArrangeTerminals}
124+
/>
125+
</AppProvider>
126+
</ThemeProvider>
127+
);
128+
129+
const decrementTenButton = screen.getByText('-10');
130+
fireEvent.click(decrementTenButton);
131+
132+
expect(mockOnTerminalCountChange).toHaveBeenCalledWith(10);
133+
});
134+
});

0 commit comments

Comments
 (0)