neo-neo-bblessed
Version:
A fork of neo-blessed (which is a fork of blessed) with bug fixes and maintenance.
224 lines (189 loc) • 4.9 kB
text/typescript
/**
* prompt.js - prompt element for blessed
* Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).
* https://github.com/chjj/blessed
*/
/**
* Modules
*/
import Node from './node.js';
import boxFactory from './box.js';
const Box = boxFactory.Box;
import buttonFactory from './button.js';
const Button = buttonFactory.Button;
import textboxFactory from './textbox.js';
const Textbox = textboxFactory.Textbox;
/**
* Type definitions
*/
interface PromptOptions {
hidden?: boolean;
[key: string]: any;
}
interface PromptCallback {
(err: Error | null, data?: string): void;
}
interface PromptButton {
on(event: string, listener: () => void): void;
removeListener(event: string, listener: () => void): void;
}
interface PromptTextbox {
value: string;
submit(): void;
cancel(): void;
readInput(callback: PromptCallback): void;
}
interface PromptScreen {
saveFocus(): void;
restoreFocus(): void;
render(): void;
}
interface PromptInterface extends Box {
type: string;
_: {
input: PromptTextbox;
okay: PromptButton;
cancel: PromptButton;
};
screen: PromptScreen;
show(): void;
hide(): void;
setContent(content: string): void;
input(text: string, value: string, callback: PromptCallback): void;
input(text: string, callback: PromptCallback): void;
setInput(text: string, value: string, callback: PromptCallback): void;
setInput(text: string, callback: PromptCallback): void;
readInput(text: string, value: string, callback: PromptCallback): void;
readInput(text: string, callback: PromptCallback): void;
}
/**
* Prompt - Modern ES6 Class
*/
class Prompt extends Box {
type = 'prompt';
_: {
input: PromptTextbox;
okay: PromptButton;
cancel: PromptButton;
};
constructor(options?: PromptOptions) {
// Handle malformed options gracefully
if (!options || typeof options !== 'object' || Array.isArray(options)) {
options = {};
}
// Force hidden to true for modal behavior
options.hidden = true;
super(options);
// Initialize the internal objects container
this._ = {} as any;
// Create input textbox
this._.input = new Textbox({
parent: this,
top: 3,
height: 1,
left: 2,
right: 2,
bg: 'black',
});
// Create okay button
this._.okay = new Button({
parent: this,
top: 5,
height: 1,
left: 2,
width: 6,
content: 'Okay',
align: 'center',
bg: 'black',
hoverBg: 'blue',
autoFocus: false,
mouse: true,
});
// Create cancel button
this._.cancel = new Button({
parent: this,
top: 5,
height: 1,
shrink: true,
left: 10,
width: 8,
content: 'Cancel',
align: 'center',
bg: 'black',
hoverBg: 'blue',
autoFocus: false,
mouse: true,
});
}
input(text: string, value: string, callback: PromptCallback): void;
input(text: string, callback: PromptCallback): void;
input(
text: string,
value?: string | PromptCallback,
callback?: PromptCallback
): void {
let okay: () => void, cancel: () => void;
if (!callback) {
callback = value as PromptCallback;
value = '';
}
// Keep above:
// var parent = this.parent;
// this.detach();
// parent.append(this);
this.show();
this.setContent(' ' + text);
this._.input.value = value as string;
this.screen.saveFocus();
this._.okay.on(
'press',
(okay = () => {
this._.input.submit();
})
);
this._.cancel.on(
'press',
(cancel = () => {
this._.input.cancel();
})
);
this._.input.readInput((err: Error | null, data?: string) => {
this.hide();
this.screen.restoreFocus();
this._.okay.removeListener('press', okay);
this._.cancel.removeListener('press', cancel);
return (callback as PromptCallback)(err, data);
});
this.screen.render();
}
setInput(text: string, value: string, callback: PromptCallback): void;
setInput(text: string, callback: PromptCallback): void;
setInput(
text: string,
value?: string | PromptCallback,
callback?: PromptCallback
): void {
return this.input(text, value as any, callback);
}
readInput(text: string, value: string, callback: PromptCallback): void;
readInput(text: string, callback: PromptCallback): void;
readInput(
text: string,
value?: string | PromptCallback,
callback?: PromptCallback
): void {
return this.input(text, value as any, callback);
}
}
/**
* Factory function for backward compatibility
*/
function prompt(options?: PromptOptions): PromptInterface {
return new Prompt(options) as PromptInterface;
}
// Attach the class as a property for direct access
prompt.Prompt = Prompt;
/**
* Expose
*/
export default prompt;