mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-03-30 18:47:14 +02:00
Add:Support for pasting semicolon separated strings in multi select inputs #1198
This commit is contained in:
parent
b447cf5c1c
commit
db9d5c9d43
@ -11,7 +11,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{{ item }}
|
{{ item }}
|
||||||
</div>
|
</div>
|
||||||
<input v-show="!readonly" ref="input" v-model="textInput" :disabled="disabled" style="min-width: 40px; width: 40px" class="h-full bg-primary focus:outline-none px-1" @keydown="keydownInput" @focus="inputFocus" @blur="inputBlur" />
|
<input v-show="!readonly" ref="input" v-model="textInput" :disabled="disabled" style="min-width: 40px; width: 40px" class="h-full bg-primary focus:outline-none px-1" @keydown="keydownInput" @focus="inputFocus" @blur="inputBlur" @paste="inputPaste" />
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
@ -145,6 +145,31 @@ export default {
|
|||||||
this.menu.style.left = boundingBox.x + 'px'
|
this.menu.style.left = boundingBox.x + 'px'
|
||||||
this.menu.style.width = boundingBox.width + 'px'
|
this.menu.style.width = boundingBox.width + 'px'
|
||||||
},
|
},
|
||||||
|
inputPaste(evt) {
|
||||||
|
setTimeout(() => {
|
||||||
|
const pastedText = evt.target?.value || ''
|
||||||
|
console.log('Pasted text=', pastedText)
|
||||||
|
const pastedItems = [
|
||||||
|
...new Set(
|
||||||
|
pastedText
|
||||||
|
.split(';')
|
||||||
|
.map((i) => i.trim())
|
||||||
|
.filter((i) => i)
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
// Filter out items already selected
|
||||||
|
const itemsToAdd = pastedItems.filter((i) => !this.selected.some((_i) => _i.toLowerCase() === i.toLowerCase()))
|
||||||
|
if (pastedItems.length && !itemsToAdd.length) {
|
||||||
|
this.textInput = null
|
||||||
|
this.currentSearch = null
|
||||||
|
} else {
|
||||||
|
for (const itemToAdd of itemsToAdd) {
|
||||||
|
this.insertNewItem(itemToAdd)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 10)
|
||||||
|
},
|
||||||
inputFocus() {
|
inputFocus() {
|
||||||
if (!this.menu) {
|
if (!this.menu) {
|
||||||
this.unmountMountMenu()
|
this.unmountMountMenu()
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<div v-if="showEdit && !disabled" class="rounded-full cursor-pointer w-6 h-6 mx-0.5 bg-bg flex items-center justify-center">
|
<div v-if="showEdit && !disabled" class="rounded-full cursor-pointer w-6 h-6 mx-0.5 bg-bg flex items-center justify-center">
|
||||||
<span class="material-icons text-white hover:text-success pt-px pr-px" style="font-size: 1.1rem" @click.stop="addItem">add</span>
|
<span class="material-icons text-white hover:text-success pt-px pr-px" style="font-size: 1.1rem" @click.stop="addItem">add</span>
|
||||||
</div>
|
</div>
|
||||||
<input v-show="!readonly" ref="input" v-model="textInput" :disabled="disabled" style="min-width: 40px; width: 40px" class="h-full bg-primary focus:outline-none px-1" @keydown="keydownInput" @focus="inputFocus" @blur="inputBlur" />
|
<input v-show="!readonly" ref="input" v-model="textInput" :disabled="disabled" style="min-width: 40px; width: 40px" class="h-full bg-primary focus:outline-none px-1" @keydown="keydownInput" @focus="inputFocus" @blur="inputBlur" @paste="inputPaste" />
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
@ -112,6 +112,7 @@ export default {
|
|||||||
return !!this.selected.find((i) => i.id === itemValue)
|
return !!this.selected.find((i) => i.id === itemValue)
|
||||||
},
|
},
|
||||||
search() {
|
search() {
|
||||||
|
if (!this.textInput) return
|
||||||
this.currentSearch = this.textInput
|
this.currentSearch = this.textInput
|
||||||
const dataToSearch = this.filterData[this.filterKey] || []
|
const dataToSearch = this.filterData[this.filterKey] || []
|
||||||
|
|
||||||
@ -165,6 +166,34 @@ export default {
|
|||||||
this.menu.style.left = boundingBox.x + 'px'
|
this.menu.style.left = boundingBox.x + 'px'
|
||||||
this.menu.style.width = boundingBox.width + 'px'
|
this.menu.style.width = boundingBox.width + 'px'
|
||||||
},
|
},
|
||||||
|
inputPaste(evt) {
|
||||||
|
setTimeout(() => {
|
||||||
|
const pastedText = evt.target?.value || ''
|
||||||
|
console.log('Pasted text=', pastedText)
|
||||||
|
const pastedItems = [
|
||||||
|
...new Set(
|
||||||
|
pastedText
|
||||||
|
.split(';')
|
||||||
|
.map((i) => i.trim())
|
||||||
|
.filter((i) => i)
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
// Filter out items already selected
|
||||||
|
const itemsToAdd = pastedItems.filter((i) => !this.selected.some((_i) => _i[this.textKey].toLowerCase() === i.toLowerCase()))
|
||||||
|
if (pastedItems.length && !itemsToAdd.length) {
|
||||||
|
this.textInput = null
|
||||||
|
this.currentSearch = null
|
||||||
|
} else {
|
||||||
|
for (const [index, itemToAdd] of itemsToAdd.entries()) {
|
||||||
|
this.insertNewItem({
|
||||||
|
id: `new-${Date.now()}-${index}`,
|
||||||
|
name: itemToAdd
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 10)
|
||||||
|
},
|
||||||
inputFocus() {
|
inputFocus() {
|
||||||
if (!this.menu) {
|
if (!this.menu) {
|
||||||
this.unmountMountMenu()
|
this.unmountMountMenu()
|
||||||
|
Loading…
Reference in New Issue
Block a user