Skip to content

Commit ae84dd0

Browse files
authored
fix(autocomplete): show correct selection text (#378)
1 parent 95f0d83 commit ae84dd0

File tree

4 files changed

+85
-6
lines changed

4 files changed

+85
-6
lines changed

.changeset/violet-hornets-turn.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@clack/prompts": patch
3+
---
4+
5+
Update key binding text to show tab/space when navigating, and tab otherwise.

packages/prompts/src/autocomplete.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ export const autocompleteMultiselect = <Value>(opts: AutocompleteMultiSelectOpti
275275
// Instructions
276276
const instructions = [
277277
`${color.dim('↑/↓')} to navigate`,
278-
`${color.dim('Space:')} select`,
278+
`${color.dim(this.isNavigating ? 'Space/Tab:' : 'Tab:')} select`,
279279
`${color.dim('Enter:')} confirm`,
280280
`${color.dim('Type:')} to search`,
281281
];
@@ -315,5 +315,5 @@ export const autocompleteMultiselect = <Value>(opts: AutocompleteMultiSelectOpti
315315
});
316316

317317
// Return the result or cancel symbol
318-
return prompt.prompt() as Promise<Value | symbol>;
318+
return prompt.prompt() as Promise<Value[] | symbol>;
319319
};

packages/prompts/test/__snapshots__/autocomplete.test.ts.snap

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,14 +298,69 @@ exports[`autocompleteMultiselect > can be aborted by a signal 1`] = `
298298
│ ◻ Cherry
299299
│ ◻ Grape
300300
│ ◻ Orange
301-
[36m│[39m [2m[2m↑/↓[22m[2m to navigate • [2mSpace:[22m[2m select • [2mEnter:[22m[2m confirm • [2mType:[22m[2m to search[22m
301+
[36m│[39m [2m[2m↑/↓[22m[2m to navigate • [2mTab:[22m[2m select • [2mEnter:[22m[2m confirm • [2mType:[22m[2m to search[22m
302302
└",
303303
"
304304
",
305305
"<cursor.show>",
306306
]
307307
`;
308308
309+
exports[`autocompleteMultiselect > can use navigation keys to select options 1`] = `
310+
[
311+
"<cursor.hide>",
312+
"│
313+
◆ Select fruits
314+
315+
│ Search: _
316+
│ ◻ Apple
317+
│ ◻ Banana
318+
│ ◻ Cherry
319+
│ ◻ Grape
320+
│ ◻ Orange
321+
│ ↑/↓ to navigate • Tab: select • Enter: confirm • Type: to search
322+
└",
323+
"<cursor.backward count=999><cursor.up count=10>",
324+
"<cursor.down count=3>",
325+
"<erase.down>",
326+
"│ Search: 
327+
│ ◻ Apple
328+
│ ◻ Banana
329+
│ ◻ Cherry
330+
│ ◻ Grape
331+
│ ◻ Orange
332+
│ ↑/↓ to navigate • Space/Tab: select • Enter: confirm • Type: to search
333+
└",
334+
"<cursor.backward count=999><cursor.up count=10>",
335+
"<cursor.down count=5>",
336+
"<erase.line><cursor.left count=1>",
337+
"│ ◼ Banana",
338+
"<cursor.down count=5>",
339+
"<cursor.backward count=999><cursor.up count=10>",
340+
"<cursor.down count=5>",
341+
"<erase.down>",
342+
"│ ◼ Banana
343+
│ ◻ Cherry
344+
│ ◻ Grape
345+
│ ◻ Orange
346+
│ ↑/↓ to navigate • Space/Tab: select • Enter: confirm • Type: to search
347+
└",
348+
"<cursor.backward count=999><cursor.up count=10>",
349+
"<cursor.down count=6>",
350+
"<erase.line><cursor.left count=1>",
351+
"│ ◼ Cherry",
352+
"<cursor.down count=4>",
353+
"<cursor.backward count=999><cursor.up count=10>",
354+
"<cursor.down count=1>",
355+
"<erase.down>",
356+
"◇ Select fruits
357+
│ 2 items selected",
358+
"
359+
",
360+
"<cursor.show>",
361+
]
362+
`;
363+
309364
exports[`autocompleteMultiselect > renders error when empty selection & required is true 1`] = `
310365
[
311366
"<cursor.hide>",
@@ -318,7 +373,7 @@ exports[`autocompleteMultiselect > renders error when empty selection & required
318373
│ ◻ Cherry
319374
│ ◻ Grape
320375
│ ◻ Orange
321-
[36m│[39m [2m[2m↑/↓[22m[2m to navigate • [2mSpace:[22m[2m select • [2mEnter:[22m[2m confirm • [2mType:[22m[2m to search[22m
376+
[36m│[39m [2m[2m↑/↓[22m[2m to navigate • [2mTab:[22m[2m select • [2mEnter:[22m[2m confirm • [2mType:[22m[2m to search[22m
322377
└",
323378
"<cursor.backward count=999><cursor.up count=10>",
324379
"<cursor.down count=1>",
@@ -332,7 +387,7 @@ exports[`autocompleteMultiselect > renders error when empty selection & required
332387
│ ◻ Cherry
333388
│ ◻ Grape
334389
│ ◻ Orange
335-
[36m│[39m [2m[2m↑/↓[22m[2m to navigate • [2mSpace:[22m[2m select • [2mEnter:[22m[2m confirm • [2mType:[22m[2m to search[22m
390+
[36m│[39m [2m[2m↑/↓[22m[2m to navigate • [2mTab:[22m[2m select • [2mEnter:[22m[2m confirm • [2mType:[22m[2m to search[22m
336391
└",
337392
"<cursor.backward count=999><cursor.up count=11>",
338393
"<cursor.down count=1>",
@@ -345,7 +400,7 @@ exports[`autocompleteMultiselect > renders error when empty selection & required
345400
│ ◻ Cherry
346401
│ ◻ Grape
347402
│ ◻ Orange
348-
[36m│[39m [2m[2m↑/↓[22m[2m to navigate • [2mSpace:[22m[2m select • [2mEnter:[22m[2m confirm • [2mType:[22m[2m to search[22m
403+
[36m│[39m [2m[2m↑/↓[22m[2m to navigate • [2mTab:[22m[2m select • [2mEnter:[22m[2m confirm • [2mType:[22m[2m to search[22m
349404
└",
350405
"<cursor.backward count=999><cursor.up count=10>",
351406
"<cursor.down count=1>",

packages/prompts/test/autocomplete.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,4 +221,23 @@ describe('autocompleteMultiselect', () => {
221221
expect(isCancel(value)).toBe(true);
222222
expect(output.buffer).toMatchSnapshot();
223223
});
224+
225+
test('can use navigation keys to select options', async () => {
226+
const result = autocompleteMultiselect({
227+
message: 'Select fruits',
228+
options: testOptions,
229+
input,
230+
output,
231+
});
232+
233+
input.emit('keypress', '', { name: 'down' });
234+
input.emit('keypress', '', { name: 'space' });
235+
input.emit('keypress', '', { name: 'down' });
236+
input.emit('keypress', '', { name: 'space' });
237+
input.emit('keypress', '', { name: 'return' });
238+
239+
const value = await result;
240+
expect(value).toEqual(['banana', 'cherry']);
241+
expect(output.buffer).toMatchSnapshot();
242+
});
224243
});

0 commit comments

Comments
 (0)