<!--输入搜索框用此组件,限制了中英文输入长度-->
<template>
    <div class="input-box">
        <!--普通输入框-->
        <el-input v-model="value" @input="searchInput($event)" :placeholder="placeholdertip" :maxlength="maxLen" :ref="inputName" v-if="mode == 'input'"></el-input>
        <!--搜索框,支持自动搜索-->
        <el-input v-if="mode == 'search' && openAutoSearch" :maxlength="maxLen" @compositionend.native="handlecompositionend" @compositionstart.native="handlecompositionstart" size="mini" class="console-tree-search" :placeholder="placeholdertip" suffix-icon="tree-search-icon" @click.native="handleClickOnTableSearchInput" @keyup.native="handleTreeEnter" v-model="value" @input="searchInput($event)" :ref="inputName">
            <i slot="suffix" v-if="value" @click="handleTreeEnter(value = '')" class="el-input__icon el-icon-circle-close el-input__clear" style="margin-right: 14px;"></i>
        </el-input>
        <!--搜索框,支持回车搜索-->
        <el-input v-if="mode == 'search' && !openAutoSearch" :maxlength="maxLen" size="mini" class="console-tree-search" :placeholder="placeholdertip" suffix-icon="tree-search-icon" @click.native="handleClickOnTableSearchInput" @keyup.enter.native="handleTreeEnter" v-model="value" @input="searchInput($event)" :ref="inputName">
            <i slot="suffix" v-if="value" @click="handleTreeEnter(value = '')" class="el-input__icon el-icon-circle-close el-input__clear" style="margin-right: 14px;"></i>
        </el-input>
    </div>
</template>

<script>
    module.exports = {
        data() {
            return {
                compositioning: false,
                searchTimer: null,
                keyStatus: null,
                value: ''
            }
        },
        
        props: {
            //输入框提示信息
            placeholdertip: {
                type: String,
            },
            //输入框模式 input 仅输入功能  search 输入并带搜索功能
            mode: {
                default: 'input',
                type: String
            },
            maxLen: {
                type: Number,
                default: 120
            },
            inputName: {
                type: String,
                default: 'searchInput'
            },
            //是否开启自动搜索
            openAutoSearch: {
                type: Boolean,
                default: false
            }
        },
        
        methods: {
            /**
            * @method searchInput 输入后把新的搜索值传给父组件,input模式输入后通知父组件
            */
            searchInput (value) {
                if (value.length > this.maxLen) value = value.slice(0, this.maxLen)
                value = value.trim()
                this.$emit('input', value)
            },
            /**
             * @method handlecompositionend() 中文输入法
            */
            handlecompositionstart() {
                this.compositioning = true
            },
            /**
             * @method handlecompositionend() 中文输入法输入结束
            */
            handlecompositionend() {
                this.compositioning = false
            },
            keydownEvent(e) {
                //当输入中文按下回车松开时,不会触发keyup事件
                if (e.code == 'Enter' || e.code == 'NumpadEnter') {
                    this.keyStatus = 'keyup'
                } else {
                    this.keyStatus = 'keydown'
                }
            },
            keyupEvent() {
                this.keyStatus = 'keyup'
            },
            /**
            * @method handleClickOnTableSearchInput table搜索框点击事件
            */
            handleClickOnTableSearchInput(e) {
                // 如果是点击在搜索图标上,就去查询
                if (e && e.target && e.target.className && e.target.className.includes('el-input__icon')) this.handleTreeEnter()
            },
            /**
             * @method handleTreeEnter 搜索方法,search模式输入后通知父组件
            */
            handleTreeEnter() {
                //输入防抖
                clearTimeout(this.searchTimer)
                //如果还在中文输入
                if(this.compositioning) return
                this.searchTimer = setTimeout(() => {
                    //如果键盘还是按下状态,持续输入
                    if(this.keyStatus == 'keydown') return
                    if (this.value.length > this.maxLen) this.value = this.value.slice(0, this.maxLen)
                    this.value = this.value.trim()
                    //把搜索值传到父组件
                    this.$emit('search', this.value)
                }, 600)
            }
        }
    }
</script>

<style scoped>
    .input-box {
        width: 100%;
        display: inline-block;
    }
    /deep/ i.tree-search-icon {
        top: 6px;
    }
    /deep/ .el-input--suffix .el-input__inner {
        padding-right: 40px;
    }
</style>