remix-ide
Version:
Minimalistic browser-based Solidity IDE
128 lines (121 loc) • 4.11 kB
JavaScript
var yo = require('yo-yo')
var EventManager = require('../../lib/events')
// -------------- styling ----------------------
var css = require('./styles/dropdown-styles')
/* USAGE:
var dropdown = new Dropdown({
options: [
'knownTransaction',
'unknownTransaction',
'log',
'info',
'error'
],
defaults: ['knownTransaction']
})
dropdown.event.register('deselect', function (label) { })
dropdown.event.register('select', function (label) { })
*/
class Dropdown {
constructor (opts = {}) {
var self = this
self.event = new EventManager()
self.data = {
_options: opts.options || [],
_dependencies: opts.dependencies || [],
selected: opts.defaults || [],
_elements: []
}
self._view = {}
self._api = opts.api
self._events = opts.events
}
render () {
var self = this
if (self._view.el) return self._view.el
self._view.selected = yo`
<div class=${css.selectbox}>
<span class=${css.selected}> [${self.data.selected.length}] ${self.data.selected.join(', ')}</span>
<i class="${css.icon} fas fa-caret-down"></i>
</div>
`
self._view.el = yo`
<div name="dropdown" class="${css.dropdown} form-control form-control-sm" onclick=${show}>
${self._view.selected}
<div class="${css.options} bg-light" style="display: none;}">
${self.data._options.map(label => {
let index = self.data._elements.length
var input = yo`
<input
data-idx=${index}
onchange=${emit}
type="${index === 2 ? 'checkbox' : 'radio'}"
id="${label}"
/>
`
if (self.data.selected.indexOf(label) !== -1) {
input.checked = true
self.event.trigger('select', [label])
}
self.data._elements.push(input)
return yo`
<div class=${css.option}>
${input}
<label class="text-dark" for="${label}">${label}</label>
</div>
`
})}
</div>
</div>
`
return self._view.el
function emit (event) {
var input = event.currentTarget
var label = input.nextSibling.innerText
if (input.checked) {
self.data.selected.push(label)
if (event.type === 'change') {
self.event.trigger('select', [label])
updateDependencies(label)
}
} else {
var idx = self.data.selected.indexOf(label)
self.data.selected.splice(idx, 1)
if (event.type === 'change') {
self.event.trigger('deselect', [label])
updateDependencies(label)
}
}
self._view.selected.children[0].innerText = `[${self.data.selected.length}] ${self.data.selected.join(', ')}`
}
function updateDependencies (changed) {
if (self.data._dependencies[changed]) {
for (var dep in self.data._dependencies[changed]) {
var label = self.data._dependencies[changed][dep]
var el = self.data._elements[self.data._options.indexOf(label)]
el.checked = !el.checked
emit({currentTarget: el, type: 'changeDependencies'})
}
}
}
function show (event) {
event.stopPropagation()
var options = event.currentTarget.children[1]
var parent = event.target.parentElement
var isOption = parent === options || parent.parentElement === options
if (isOption) return
if (options.style.display === 'none') {
options.style.display = ''
document.body.addEventListener('click', handler)
} else {
options.style.display = 'none'
document.body.removeEventListener('click', handler)
}
function handler (event) {
options.style.display = 'none'
document.body.removeEventListener('click', handler)
}
}
}
}
module.exports = Dropdown