Merge pull request #864 from Imperial-Dragon/development
Autofill Searchbar
This commit is contained in:
commit
301af24da1
|
@ -82,3 +82,26 @@
|
||||||
.forceTextColor .inputAction:active {
|
.forceTextColor .inputAction:active {
|
||||||
background-color: var(--primary-color-active);
|
background-color: var(--primary-color-active);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.list {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 5px 0;
|
||||||
|
border-radius: 0 0 5px 5px;
|
||||||
|
border: 1px #ccc solid;
|
||||||
|
background-color: white;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list li {
|
||||||
|
display: block;
|
||||||
|
padding: 0px 15px;
|
||||||
|
line-height: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hover {
|
||||||
|
background-color: #ccc;
|
||||||
|
/* color: white; */
|
||||||
|
}
|
|
@ -43,7 +43,12 @@ export default Vue.extend({
|
||||||
data: function () {
|
data: function () {
|
||||||
return {
|
return {
|
||||||
id: '',
|
id: '',
|
||||||
inputData: ''
|
inputData: '',
|
||||||
|
searchState: {
|
||||||
|
showOptions: false,
|
||||||
|
selectedOption: -1,
|
||||||
|
isPointerInList: false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -72,10 +77,15 @@ export default Vue.extend({
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleClick: function () {
|
handleClick: function () {
|
||||||
|
this.searchState.showOptions = false
|
||||||
|
this.$emit('input', this.inputData)
|
||||||
this.$emit('click', this.inputData)
|
this.$emit('click', this.inputData)
|
||||||
},
|
},
|
||||||
|
|
||||||
handleInput: function () {
|
handleInput: function () {
|
||||||
|
if (this.isSearch &&
|
||||||
|
this.searchState.selectedOption !== -1 &&
|
||||||
|
this.inputData === this.dataList[this.searchState.selectedOption]) { return }
|
||||||
this.$emit('input', this.inputData)
|
this.$emit('input', this.inputData)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -89,6 +99,37 @@ export default Vue.extend({
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
handleOptionClick: function (index) {
|
||||||
|
this.searchState.showOptions = false
|
||||||
|
this.inputData = this.dataList[index]
|
||||||
|
this.$emit('input', this.inputData)
|
||||||
|
this.handleClick()
|
||||||
|
},
|
||||||
|
|
||||||
|
handleKeyDown: function (keyCode) {
|
||||||
|
if (this.dataList.length === 0) { return }
|
||||||
|
|
||||||
|
// Update selectedOption based on arrow key pressed
|
||||||
|
if (keyCode === 40) {
|
||||||
|
this.searchState.selectedOption = (this.searchState.selectedOption + 1) % this.dataList.length
|
||||||
|
} else if (keyCode === 38) {
|
||||||
|
if (this.searchState.selectedOption === -1) {
|
||||||
|
this.searchState.selectedOption = this.dataList.length - 1
|
||||||
|
} else {
|
||||||
|
this.searchState.selectedOption--
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.searchState.selectedOption = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update Input box value if arrow keys were pressed
|
||||||
|
if ((keyCode === 40 || keyCode === 38) && this.searchState.selectedOption !== -1) { this.inputData = this.dataList[this.searchState.selectedOption] }
|
||||||
|
},
|
||||||
|
|
||||||
|
handleInputBlur: function () {
|
||||||
|
if (!this.searchState.isPointerInList) { this.searchState.showOptions = false }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
@input="e => handleInput(e.target.value)"
|
@input="e => handleInput(e.target.value)"
|
||||||
|
@focus="searchState.showOptions = true"
|
||||||
|
@blur="handleInputBlur"
|
||||||
|
@keydown="e => handleKeyDown(e.keyCode)"
|
||||||
>
|
>
|
||||||
<font-awesome-icon
|
<font-awesome-icon
|
||||||
v-if="showArrow"
|
v-if="showArrow"
|
||||||
|
@ -34,16 +37,26 @@
|
||||||
class="inputAction"
|
class="inputAction"
|
||||||
@click="handleClick"
|
@click="handleClick"
|
||||||
/>
|
/>
|
||||||
<datalist
|
|
||||||
v-if="dataList.length > 0"
|
<div class="options">
|
||||||
|
<ul
|
||||||
|
v-if="inputData !== '' && dataList.length > 0 && searchState.showOptions"
|
||||||
:id="idDataList"
|
:id="idDataList"
|
||||||
|
:class="'list'"
|
||||||
|
@mouseenter="searchState.isPointerInList = true"
|
||||||
|
@mouseleave="searchState.isPointerInList = false"
|
||||||
>
|
>
|
||||||
<option
|
<li
|
||||||
v-for="(list, index) in dataList"
|
v-for="(list, index) in dataList"
|
||||||
:key="index"
|
:key="index"
|
||||||
:value="list"
|
:class="searchState.selectedOption == index ? 'hover': ''"
|
||||||
/>
|
@click="handleOptionClick(index)"
|
||||||
</datalist>
|
@mouseenter="searchState.selectedOption = index"
|
||||||
|
>
|
||||||
|
{{ list }}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue