bobflux-monitor
Version:
Component for time travelling in bobflux/fun-model application state history.
77 lines (69 loc) • 2.07 kB
text/typescript
import * as b from 'bobril';
export const textareaStyles = {
default: {
resize: 'none'
},
copyState: b.styleDef({
width: 150,
height: 72
}),
intervalStyle: b.styleDef({
width: 150,
height: 24
})
};
export interface ITextareaData {
value?: string;
onKeyDown?: (event: b.IKeyDownUpEvent) => void;
onChange?: (value: string) => void;
style?: b.IBobrilStyle;
setFocus?: boolean;
float?: string;
placeholder?: string;
}
interface ICtx extends b.IBobrilCtx {
data: ITextareaData;
value: string;
}
function focus(ctx: ICtx, element: HTMLInputElement) {
if (ctx.data.setFocus) {
element.focus();
(<HTMLInputElement>element).select();
}
};
export const textarea = b.createComponent<ITextareaData>({
id: 'bobflux-monitor-textarea',
render(ctx: ICtx, me: b.IBobrilNode) {
if (ctx.data.value !== undefined && ctx.data.value !== null) {
ctx.value = ctx.data.value;
} else {
ctx.value = '';
}
me.tag = 'textarea';
me.attrs = {
rows: 1,
value: ctx.value,
placeholder: ctx.data.placeholder,
wrap: 'soft',
spellcheck: false
};
b.style(me, !!ctx.data.style && ctx.data.style, textareaStyles.default, { cssFloat: ctx.data.float });
},
postInitDom(ctx: ICtx, _me: b.IBobrilCacheNode, element: HTMLElement) {
focus(ctx, <HTMLInputElement>element);
},
postUpdateDom(ctx: ICtx, _me: b.IBobrilCacheNode, element: HTMLElement) {
focus(ctx, <HTMLInputElement>element);
},
onChange(ctx: ICtx, value: string) {
ctx.value = value;
if (ctx.data.onChange)
ctx.data.onChange(value);
},
onKeyDown(ctx: ICtx, event: b.IKeyDownUpEvent): boolean {
if (ctx.data.onKeyDown)
ctx.data.onKeyDown(event);
return false;
}
});
export default textarea;