This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
cyber-narrator-cn-ui/src/components/advancedSearch/showhint/Hint/HintInfo.vue
2024-08-22 18:11:45 +08:00

211 lines
6.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="HintInfo" id="myHint" @mouseenter="onMouseenter">
<ul style="padding-left: 0;margin: -10px 0 0 0;min-width: calc(100% - 12px)">
<template v-for="(item,index) in hintList" :key="item.displayText">
<li :ref="'hint_'+index" class="relative-item CodeMirror-hint"
style="margin-bottom: 2px"
@click="handleSelect(item,index,hintList)"
:id="'filterItem'+index"
:class="{'CodeMirror-hint-active':index === activeIndex,[item.className]:true}"
>{{ item.displayText }}</li>
</template>
</ul>
</div>
</template>
<script>
export default {
name: 'HintInfo',
props: {
hintList: {
type: Array,
default () {
return []
}
},
columnList: {
type: Array
}
},
data () {
return {
active: true,
activeIndex: null,
currentIndex: -1
}
},
mounted () {
// this.handleFocus()
this.$emit('load', {
name: this.name,
label: this.name,
vm: this
})
document.addEventListener('keydown', this.initKeyDown)
},
methods: {
initKeyDown (event) {
const dom = document.getElementById('myHint')
const vm = this
if (dom) {
// 检测方向键
switch (event.key) {
case 'Enter':
// eslint-disable-next-line no-case-declarations
const item = vm.hintList[vm.currentIndex]
if (item) {
this.$emit('keydownEnter', 'Enter')
const obj = vm.columnList.find(d => d.label === item.displayText)
// 如果选中label数组更新光标处在第一行。如果选择操作符光标位置不变
if (obj) {
vm.handleSelect(item, vm.currentIndex, vm.hintList)
const itemDom = document.getElementById('filterItem' + vm.currentIndex)
if (itemDom) {
itemDom.style.backgroundColor = ''
}
vm.$nextTick(() => {
vm.currentIndex = 1
const itemDom1 = document.getElementById('filterItem1')
if (itemDom1) {
itemDom1.style.backgroundColor = 'var(--el-fill-color-dark)'
}
})
} else {
vm.handleSelect(item, vm.currentIndex, vm.hintList)
}
} else {
this.$emit('keydownEnter', null)
}
break
case 'ArrowUp': // 上方向键
// 上方向键被按下时的操作
if ((vm.currentIndex <= vm.hintList.length - 1) && vm.currentIndex > 0) {
vm.currentIndex -= 1
} else {
vm.currentIndex = vm.hintList.length - 1
}
vm.hintList.forEach((e, index) => {
if (index === vm.currentIndex) {
let realIndex = index
if (e.type === 'abstract') {
realIndex -= 1
vm.currentIndex -= 1
}
const itemDom = document.getElementById('filterItem' + realIndex)
if (itemDom) {
itemDom.style.backgroundColor = 'var(--el-fill-color-dark)'
itemDom.scrollIntoView(false)
}
} else {
const itemDom = document.getElementById('filterItem' + index)
if (itemDom) {
itemDom.style.backgroundColor = ''
}
}
})
break
case 'ArrowDown': // 下方向键
if (vm.currentIndex < vm.hintList.length - 1) {
vm.currentIndex += 1
} else {
vm.currentIndex = 0
}
vm.hintList.forEach((e, index) => {
if (index === vm.currentIndex) {
let realIndex = index
if (e.type === 'abstract') {
realIndex += 1
vm.currentIndex += 1
}
const itemDom = document.getElementById('filterItem' + realIndex)
if (itemDom) {
itemDom.style.backgroundColor = 'var(--el-fill-color-dark)'
itemDom.scrollIntoView(false)
}
} else {
const itemDom = document.getElementById('filterItem' + index)
if (itemDom) {
itemDom.style.backgroundColor = ''
}
}
})
break
default:
// 其他按键的操作
break
}
}
},
scrollToView (index = 0) {
// 移动到可视区域
const li = this.$refs['hint_' + index][0]
li && li.scrollIntoView(false)
},
handleDown () {
if (!this.active) {
this.hintActive()
return
}
let nextIndex = this.activeIndex + 1
let nextItem = this.hintList[nextIndex]
if (nextItem?.type === 'abstract') {
nextIndex++
nextItem = this.hintList[nextIndex]
}
if (nextItem?.type === 'abstract') {
nextIndex++
}
nextIndex >= this.hintList.length ? this.activeIndex = 1 : this.activeIndex = nextIndex
this.scrollToView(this.activeIndex)
},
handleUp () {
if (!this.active) {
this.hintActive()
return
}
let preIndex = this.activeIndex - 1
let preItem = this.hintList[preIndex]
if (preItem?.type === 'abstract') {
preIndex--
preItem = this.hintList[preIndex]
}
if (preItem?.type === 'abstract') {
preIndex--
}
preIndex > 0 ? this.activeIndex = preIndex : this.activeIndex = this.hintList.length - 1
this.scrollToView(this.activeIndex)
},
hintActive () {
this.active = true
this.activeIndex = 1
this.scrollToView(this.activeIndex)
},
hintDeactive () {
this.active = false
this.activeIndex = null
},
handleSelect (item, index) {
this.$emit('select', item, index, this.hintList)
},
triggerSelect () {
const index = this.activeIndex || 0
const item = this.hintList[index]
this.$emit('select', item, index, this.hintList)
},
onMouseenter () {
const itemDom = document.getElementById('filterItem' + this.currentIndex)
if (itemDom) {
itemDom.style.backgroundColor = ''
this.currentIndex = -1
}
}
},
unmounted () {
document.removeEventListener('keydown', this.initKeyDown)
}
}
</script>