import {InputItem} from "./base";
import {deep_copy, make_set} from "../../utils"
import {state} from "../../state";
const datalist_tpl = `
{{#datalist}}
{{/datalist}}`;
const common_input_tpl = `
`;
export class Input extends InputItem {
static accept_input_types: string[] = ["text", "password", "number", "float", "color", "date", "range", "time", "email", "url"];
constructor(spec: any, task_id: string, on_input_event: (event_name: string, input_item: InputItem) => void) {
super(spec, task_id, on_input_event);
}
create_element(): JQuery {
let spec = deep_copy(this.spec);
const id_name = spec.name + '-' + Math.floor(Math.random() * Math.floor(9999));
spec['id_name'] = id_name;
if (spec['type'] == 'float') spec['type'] = 'text';
let html = Mustache.render(common_input_tpl, spec);
this.element = $(html);
this.element.find(`#${id_name}_action_btn`).on('click', function (e) {
let btn = $(this);
state.CurrentSession.send_message({
event: "callback",
task_id: btn.data('callbackid') as string,
data: null
});
});
let input_elem = this.element.find('input');
if (spec.onblur) {
// blur事件时,发送当前值到服务器
input_elem.on("blur", (e) => {
if (this.get_value())
this.on_input_event("blur", this);
});
}
if (spec.onchange) {
input_elem.on("input", (e) => {
this.on_input_event("change", this);
});
}
// 将额外的html参数加到input标签上
const ignore_keys = make_set(['action', 'type', 'label', 'invalid_feedback', 'valid_feedback', 'help_text',
'options', 'datalist', 'multiple', 'onchange', 'onblur']);
for (let key in this.spec) {
if (key in ignore_keys) continue;
input_elem.attr(key, this.spec[key]);
}
return this.element;
}
update_input(spec: any): any {
let attributes = spec.attributes;
if ('datalist' in attributes) {
const datalist_html = Mustache.render(datalist_tpl, {datalist: attributes.datalist});
this.element.find('datalist').empty().append(datalist_html);
delete attributes['datalist'];
}
this.update_input_helper(-1, attributes);
}
get_value(): any {
let val = this.element.find('input').val();
if (this.spec['type'] == 'number')
val = parseInt(val as string);
else if (this.spec['type'] == 'float')
val = parseFloat(val as string);
return val;
}
}