ff-dashboard
Version:
Flimflam dashboard component comprised of a main panel and two side panels
82 lines (66 loc) • 2.24 kB
JavaScript
import h from 'snabbdom/h'
import flyd from 'flyd'
import flydFilter from 'flyd/module/filter'
import mergeAll from 'flyd/module/mergeall'
import R from 'ramda'
import render from 'flimflam-render'
import snabbdom from 'snabbdom'
import cereal from 'form-serialize'
import dashboard from '../lib/index'
import main from './main'
import details from './details'
import data from './data'
import header from './header'
import filter from './filter'
const init = _ => {
const state = {}
state.showFilters$ = flyd.stream()
state.dataId$ = flyd.stream()
state.showMain$ = flyd.stream()
state.dataDetails$ = flyd.merge(
flyd.stream({})
, flyd.map(i => R.find(R.propEq('id', i), data), state.dataId$))
state.filterInput$ = flyd.stream()
state.filterBy$ = flyd.merge(flyd.stream({}), flyd.map(inputToFilter, state.filterInput$))
state.dataMain$ = flyd.map(filterData, state.filterBy$)
const displayPanel$ = mergeAll([
flyd.map(R.always('left'), state.showFilters$)
, flyd.map(R.always('main'), state.showMain$)
, flyd.map(x => x.name ? 'right' : undefined , state.dataDetails$)
])
state.dashboard = dashboard.init({displayPanel$})
return state
}
const inputToFilter = x => cereal(x.target.parentElement, {hash: true})
const filterByPersonnel = searchNames =>
R.filter(d => {
let names = R.pluck('name', d.personnel)
if (R.intersection(searchNames, names).length) return d
}
, data)
const filterData = filterBy => {
if(!R.keys(filterBy).length) return data
let filteredData = []
if(filterBy.personnel) {
filteredData = R.concat(filteredData, filterByPersonnel(filterBy.personnel))
}
return filteredData
}
const view = state =>
h('div', [
dashboard.view(state.dashboard, {
header: header(state)
, mainPanel: main(state)
, rightPanel: details(state)
, leftPanel: filter(state)
})
])
const patch = snabbdom.init([
require('snabbdom/modules/class')
, require('snabbdom/modules/props')
, require('snabbdom/modules/style')
, require('snabbdom/modules/eventlisteners')
, require('snabbdom/modules/attributes')
])
let container = document.querySelector('#container')
render({patch, container, view, state: init()})