import {InputItem} from "./base"; import {Session} from "../../session"; import {deep_copy} from "../../utils" const options_tpl = ` {{#options}} {{/options}} `; const select_input_tpl = `
{{#label}}{{/label}}
{{invalid_feedback}}
{{valid_feedback}}
{{help_text}}
`; export class Select extends InputItem { static accept_input_types: string[] = ["select"]; constructor(session: Session, task_id: string, spec: any) { super(session, task_id, spec); } 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; let html = Mustache.render(select_input_tpl, spec); this.element = $(html); this.setup_select_options(this.element, spec.options); if(spec.onblur) { // blur事件时,发送当前值到服务器 this.element.find('select').on("blur", (e) => { this.send_value_listener(this, e); }); } if(spec.onchange){ this.element.find('select').on("change", (e) => { this.send_value_listener(this, e); }); } return this.element; } setup_select_options(elem: JQuery, options: any) { let input_elem = elem.find('select'); let opts = input_elem.find('option'); for (let idx = 0; idx < options.length; idx++) opts.eq(idx).val(JSON.stringify(options[idx].value)); // 将额外的html参数加到input标签上 const ignore_keys = { 'type': '', 'label': '', 'invalid_feedback': '', 'valid_feedback': '', 'help_text': '', 'options': '', 'datalist': '', 'multiple': '' }; for (let key in this.spec) { if (key in ignore_keys) continue; input_elem.attr(key, this.spec[key]); } } update_input(spec: any): any { let attributes = spec.attributes; if ('options' in attributes) { const opts_html = Mustache.render(options_tpl, {options: attributes.options}); this.element.find('select').empty().append(opts_html); this.setup_select_options(this.element, attributes.options); delete attributes['options']; } this.update_input_helper(-1, attributes); } get_value(): any { let raw_val = this.element.find('select').val(); if (this.spec.multiple) { let res: any[] = []; for (let i of (raw_val as string[])) res.push(JSON.parse(i)); return res; } else { return JSON.parse(raw_val as string); } } }