var yo = require('yo-yo')
var csjs = require('csjs-inject')
const styleguide = require('../ui/styles-guide/theme-chooser')
const styles = styleguide.chooser()
const EventEmitter = require('events')
class PluginManagerComponent {
constructor () {
this.event = new EventEmitter()
this.views = {
root: null,
items: {}
}
}
profile () {
return {
name: 'plugin manager',
methods: [],
events: [],
icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNzU1IDQ1M3EzNyAzOCAzNyA5MC41dC0zNyA5MC41bC00MDEgNDAwIDE1MCAxNTAtMTYwIDE2MHEtMTYzIDE2My0zODkuNSAxODYuNXQtNDExLjUtMTAwLjVsLTM2MiAzNjJoLTE4MXYtMTgxbDM2Mi0zNjJxLTEyNC0xODUtMTAwLjUtNDExLjV0MTg2LjUtMzg5LjVsMTYwLTE2MCAxNTAgMTUwIDQwMC00MDFxMzgtMzcgOTEtMzd0OTAgMzcgMzcgOTAuNS0zNyA5MC41bC00MDAgNDAxIDIzNCAyMzQgNDAxLTQwMHEzOC0zNyA5MS0zN3Q5MCAzN3oiLz48L3N2Zz4=',
description: 'start/stop services, modules and plugins'
}
}
setApp (appManager) {
this.appManager = appManager
}
setStore (store) {
this.store = store
this.store.event.on('activate', (name) => { this.reRender() })
this.store.event.on('deactivate', (name) => { this.reRender() })
this.store.event.on('add', (name) => { this.reRender() })
this.store.event.on('remove', (name) => { this.reRender() })
}
render () {
let activeMods = yo`
Active Modules
`
let inactiveMods = yo`
Inactive Modules
`
let searchbox = yo`
`
var rootView = yo`
Plugin Manager
${searchbox}
${activeMods}
${inactiveMods}
`
searchbox.addEventListener('keyup', (event) => { this.filterPlugins(event) })
var modulesActive = this.store.getActives()
modulesActive.sort(function (a, b) {
var textA = a.profile.name.toUpperCase()
var textB = b.profile.name.toUpperCase()
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0
})
modulesActive.forEach((mod) => {
activeMods.appendChild(this.renderItem(mod.profile.name))
})
var modulesAll = this.store.getAll()
modulesAll.sort()
modulesAll.forEach((mod) => {
if (!modulesActive.includes(mod)) {
inactiveMods.appendChild(this.renderItem(mod.profile.name))
}
})
if (!this.views.root) {
this.views.root = rootView
}
return rootView
}
renderItem (item) {
let ctrBtns
const mod = this.store.getOne(item)
if (!mod) return
let action = () => {
if (this.store.isActive(item)) {
this.appManager.deactivateOne(item)
} else {
this.appManager.activateOne(item)
}
}
ctrBtns = yo`
`
return yo`
${mod.profile.name}
${mod.profile.description}
${ctrBtns}
`
}
reRender () {
if (this.views.root) {
yo.update(this.views.root, this.render())
}
}
filterPlugins (event) {
let filterOn = event.target.value.toUpperCase()
var nodes = this.views.root.querySelectorAll(`.${css.plugin}`)
nodes.forEach((node) => {
let h = node.querySelector('h3')
let txtValue = h.textContent || h.innerText
if (txtValue.toLowerCase().indexOf(filterOn.toLowerCase()) !== -1) {
node.style.display = 'block'
} else {
node.style.display = 'none'
}
})
}
}
module.exports = PluginManagerComponent
const css = csjs`
.plugins_settings h2 {
font-size: 1em;
border-bottom: 1px ${styles.appProperties.solidBorderBox_BorderColor} solid;
padding: 10px 20px;
font-size: 10px;
padding: 10px 20px;
text-transform: uppercase;
font-weight: normal;
background-color: white;
margin-bottom: 0;
}
.plugin {
${styles.rightPanel.compileTab.box_CompileContainer};
margin: 0;
margin-bottom: 2%;
border-bottom: 1px ${styles.appProperties.solidBorderBox_BorderColor} solid;
padding: 0px 20px 10px;
}
.plugin h3 {
margin-bottom: 5px;
font-size: 12px;
margin-top: 9px;
}
.plugin button {
${styles.rightPanel.settingsTab.button_LoadPlugin};
cursor: pointer;
font-size: 10px;
}
.activePlugins {
}
.inactivePlugins {
}
.plugins_settings input {
margin: 10px;
}
`