Skip to content

Commit db0fc77

Browse files
okeefem2vikerman
authored andcommitted
feat(@angular/cli): Added support for multiselect list prompt (angular#13031)
* feat(@angular/cli): Added support for multiselect list prompt * If multiselect option is true use the checkbox inquirer prompt type, otherwise use list. * feat(@angular-devkit/core): Added support for multiselect list prompt * Added multiselect to PromptDefinition interface and usages
1 parent 1ad42db commit db0fc77

File tree

5 files changed

+82
-3
lines changed

5 files changed

+82
-3
lines changed

packages/angular/cli/models/schematic-command.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ export abstract class SchematicCommand<
309309
question.type = 'confirm';
310310
break;
311311
case 'list':
312-
question.type = 'list';
312+
question.type = !!definition.multiselect ? 'checkbox' : 'list';
313313
question.choices = definition.items && definition.items.map(item => {
314314
if (typeof item == 'string') {
315315
return item;

packages/angular_devkit/core/src/json/schema/interface.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,14 @@ export interface PromptDefinition {
9999
id: string;
100100
type: string;
101101
message: string;
102-
default?: string | number | boolean | null;
102+
default?: string | string[] | number | boolean | null;
103103
priority: number;
104104
validator?: (value: string) => boolean | string | Promise<boolean | string>;
105105

106106
items?: Array<string | { value: JsonValue, label: string }>;
107107

108108
raw?: string | JsonObject;
109+
multiselect?: boolean;
109110
}
110111

111112
export type PromptProvider = (definitions: Array<PromptDefinition>)

packages/angular_devkit/core/src/json/schema/prompt_spec.ts

+77
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,83 @@ describe('Prompt Provider', () => {
262262
.toPromise().then(done, done.fail);
263263
});
264264

265+
it('analyzes list with multiselect option and object items', done => {
266+
const registry = new CoreSchemaRegistry();
267+
const data: any = {};
268+
269+
registry.usePromptProvider(async definitions => {
270+
expect(definitions.length).toBe(1);
271+
expect(definitions[0].type).toBe('list');
272+
expect(definitions[0].multiselect).toBe(true);
273+
expect(definitions[0].items).toEqual([
274+
{ 'value': 'one', 'label': 'one' },
275+
{ 'value': 'two', 'label': 'two' },
276+
]);
277+
278+
return { [definitions[0].id]: { 'value': 'one', 'label': 'one' } };
279+
});
280+
281+
registry
282+
.compile({
283+
properties: {
284+
test: {
285+
type: 'array',
286+
'x-prompt': {
287+
'type': 'list',
288+
'multiselect': true,
289+
'items': [
290+
{ 'value': 'one', 'label': 'one' },
291+
{ 'value': 'two', 'label': 'two' },
292+
],
293+
'message': 'test-message',
294+
},
295+
},
296+
},
297+
})
298+
.pipe(
299+
mergeMap(validator => validator(data)),
300+
)
301+
.toPromise().then(done, done.fail);
302+
});
303+
304+
it('analyzes list without multiselect option and object items', done => {
305+
const registry = new CoreSchemaRegistry();
306+
const data: any = {};
307+
308+
registry.usePromptProvider(async definitions => {
309+
expect(definitions.length).toBe(1);
310+
expect(definitions[0].type).toBe('list');
311+
expect(definitions[0].multiselect).toBeUndefined();
312+
expect(definitions[0].items).toEqual([
313+
{ 'value': 'one', 'label': 'one' },
314+
{ 'value': 'two', 'label': 'two' },
315+
]);
316+
317+
return { [definitions[0].id]: { 'value': 'two', 'label': 'two' } };
318+
});
319+
320+
registry
321+
.compile({
322+
properties: {
323+
test: {
324+
type: 'array',
325+
'x-prompt': {
326+
'type': 'list',
327+
'items': [
328+
{ 'value': 'one', 'label': 'one' },
329+
{ 'value': 'two', 'label': 'two' },
330+
],
331+
'message': 'test-message',
332+
},
333+
},
334+
},
335+
})
336+
.pipe(
337+
mergeMap(validator => validator(data)),
338+
)
339+
.toPromise().then(done, done.fail);
340+
});
341+
265342
it('analyzes enums WITHOUT explicit list type', done => {
266343
const registry = new CoreSchemaRegistry();
267344
const data: any = {};

packages/angular_devkit/core/src/json/schema/registry.ts

+1
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,7 @@ export class CoreSchemaRegistry implements SchemaRegistry {
568568
priority: 0,
569569
raw: schema,
570570
items,
571+
multiselect: type === 'list' ? schema.multiselect : false,
571572
default: typeof parentSchema.default == 'object' ? undefined : parentSchema.default,
572573
async validator(data: string) {
573574
const result = it.self.validate(parentSchema, data);

packages/angular_devkit/schematics_cli/bin/schematics.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ function _createPromptProvider(): schema.PromptProvider {
9898
case 'list':
9999
return {
100100
...question,
101-
type: 'list',
101+
type: !!definition.multiselect ? 'checkbox' : 'list',
102102
choices: definition.items && definition.items.map(item => {
103103
if (typeof item == 'string') {
104104
return item;

0 commit comments

Comments
 (0)