| '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; |