/* jslint node: true */ 'use strict'; const View = require('./view.js').View; const valueWithDefault = require('./misc_util.js').valueWithDefault; const isPrintable = require('./string_util.js').isPrintable; const stylizeString = require('./string_util.js').stylizeString; const _ = require('lodash'); module.exports = class KeyEntryView extends View { constructor(options) { options.acceptsFocus = valueWithDefault(options.acceptsFocus, true); options.acceptsInput = valueWithDefault(options.acceptsInput, true); super(options); this.eatTabKey = options.eatTabKey || true; this.caseInsensitive = options.caseInsensitive || true; if (Array.isArray(options.keys)) { if (this.caseInsensitive) { this.keys = options.keys.map(k => k.toUpperCase()); } else { this.keys = options.keys; } } } onKeyPress(ch, key) { const drawKey = ch; if (ch && this.caseInsensitive) { ch = ch.toUpperCase(); } if ( drawKey && isPrintable(drawKey) && (!this.keys || this.keys.indexOf(ch) > -1) ) { this.redraw(); // sets position this.client.term.write(stylizeString(ch, this.textStyle)); } this.keyEntered = ch || key.name; if (key && 'tab' === key.name && !this.eatTabKey) { return this.emit('action', 'next', key); } this.emit('action', 'accept'); // NOTE: we don't call super here. KeyEntryView is a special snowflake. } setPropertyValue(propName, propValue) { switch (propName) { case 'eatTabKey': if (_.isBoolean(propValue)) { this.eatTabKey = propValue; } break; case 'caseInsensitive': if (_.isBoolean(propValue)) { this.caseInsensitive = propValue; } break; case 'keys': if (Array.isArray(propValue)) { this.keys = propValue; } break; } super.setPropertyValue(propName, propValue); } getData() { return this.keyEntered; } };