|
|
|
const { qs } = require('../utils')
|
|
|
|
|
|
|
|
module.exports = function initButtons (input) {
|
|
|
|
let container = qs('#action-buttons')
|
|
|
|
|
|
|
|
// button labels
|
|
|
|
let labels = []
|
|
|
|
|
|
|
|
// button elements
|
|
|
|
let buttons = []
|
|
|
|
|
|
|
|
// add a button element
|
|
|
|
let pushButton = function pushButton () {
|
|
|
|
let button = document.createElement('button')
|
|
|
|
button.classList.add('action-button')
|
|
|
|
button.setAttribute('data-n', buttons.length)
|
|
|
|
buttons.push(button)
|
|
|
|
container.appendChild(button)
|
|
|
|
|
|
|
|
button.addEventListener('click', e => {
|
|
|
|
// might as well use the attribute ¯\_(ツ)_/¯
|
|
|
|
let index = +button.getAttribute('data-n')
|
|
|
|
input.sendButton(index)
|
|
|
|
|
|
|
|
e.target.blur() // if it keeps focus, spacebar will push it
|
|
|
|
})
|
|
|
|
|
|
|
|
// this prevents button retaining focus after half-click/drag-away
|
|
|
|
button.addEventListener('mouseleave', e => {
|
|
|
|
e.target.blur()
|
|
|
|
})
|
|
|
|
|
|
|
|
return button
|
|
|
|
}
|
|
|
|
|
|
|
|
// remove a button element
|
|
|
|
let popButton = function popButton () {
|
|
|
|
let button = buttons.pop()
|
|
|
|
button.parentNode.removeChild(button)
|
|
|
|
}
|
|
|
|
|
|
|
|
// sync with DOM
|
|
|
|
let update = function updateButtons () {
|
|
|
|
if (labels.length > buttons.length) {
|
|
|
|
for (let i = buttons.length; i < labels.length; i++) {
|
|
|
|
pushButton()
|
|
|
|
}
|
|
|
|
} else if (buttons.length > labels.length) {
|
|
|
|
for (let i = labels.length; i <= buttons.length; i++) {
|
|
|
|
popButton()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (let i = 0; i < labels.length; i++) {
|
|
|
|
let label = labels[i].trim()
|
|
|
|
let button = buttons[i]
|
|
|
|
button.textContent = label || '\u00a0' // label or nbsp
|
|
|
|
if (!label) button.classList.add('inactive')
|
|
|
|
else button.classList.remove('inactive')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return { update, labels }
|
|
|
|
}
|