You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.2 KiB
109 lines
2.2 KiB
'use strict'; |
|
|
|
const BooleanPrompt = require('../types/boolean'); |
|
|
|
class TogglePrompt extends BooleanPrompt { |
|
async initialize() { |
|
await super.initialize(); |
|
this.value = this.initial = !!this.options.initial; |
|
this.disabled = this.options.disabled || 'no'; |
|
this.enabled = this.options.enabled || 'yes'; |
|
await this.render(); |
|
} |
|
|
|
reset() { |
|
this.value = this.initial; |
|
this.render(); |
|
} |
|
|
|
delete() { |
|
this.alert(); |
|
} |
|
|
|
toggle() { |
|
this.value = !this.value; |
|
this.render(); |
|
} |
|
|
|
enable() { |
|
if (this.value === true) return this.alert(); |
|
this.value = true; |
|
this.render(); |
|
} |
|
disable() { |
|
if (this.value === false) return this.alert(); |
|
this.value = false; |
|
this.render(); |
|
} |
|
|
|
up() { |
|
this.toggle(); |
|
} |
|
down() { |
|
this.toggle(); |
|
} |
|
right() { |
|
this.toggle(); |
|
} |
|
left() { |
|
this.toggle(); |
|
} |
|
next() { |
|
this.toggle(); |
|
} |
|
prev() { |
|
this.toggle(); |
|
} |
|
|
|
dispatch(ch = '', key) { |
|
switch (ch.toLowerCase()) { |
|
case ' ': |
|
return this.toggle(); |
|
case '1': |
|
case 'y': |
|
case 't': |
|
return this.enable(); |
|
case '0': |
|
case 'n': |
|
case 'f': |
|
return this.disable(); |
|
default: { |
|
return this.alert(); |
|
} |
|
} |
|
} |
|
|
|
format() { |
|
let active = str => this.styles.primary.underline(str); |
|
let value = [ |
|
this.value ? this.disabled : active(this.disabled), |
|
this.value ? active(this.enabled) : this.enabled |
|
]; |
|
return value.join(this.styles.muted(' / ')); |
|
} |
|
|
|
async render() { |
|
let { size } = this.state; |
|
|
|
let header = await this.header(); |
|
let prefix = await this.prefix(); |
|
let separator = await this.separator(); |
|
let message = await this.message(); |
|
|
|
let output = await this.format(); |
|
let help = (await this.error()) || (await this.hint()); |
|
let footer = await this.footer(); |
|
|
|
let prompt = [prefix, message, separator, output].join(' '); |
|
this.state.prompt = prompt; |
|
|
|
if (help && !prompt.includes(help)) prompt += ' ' + help; |
|
|
|
this.clear(size); |
|
this.write([header, prompt, footer].filter(Boolean).join('\n')); |
|
this.write(this.margin[2]); |
|
this.restore(); |
|
} |
|
} |
|
|
|
module.exports = TogglePrompt;
|
|
|