51 lines
1.6 KiB
JavaScript
51 lines
1.6 KiB
JavaScript
// License: LGPL-3.0-or-later
|
|
const h = require('virtual-dom/h')
|
|
const thunk = require('vdom-thunk')
|
|
const formToObj = require('../../common/form-to-object')
|
|
const flyd = require('flyd')
|
|
const filterStream = require('flyd/module/filter')
|
|
|
|
// Uses an immutable state object with 'page' and 'search' keys
|
|
// Will also use a 'loading' key for loading animations
|
|
// Optionally pass in a 'placeholder' key for the placeholder text
|
|
|
|
// Searches are streams of objects like {page: 1, search: 'xxyy'}
|
|
|
|
// Whenever they blank out the search field, immediately re-request
|
|
var $searchKeyups = flyd.stream()
|
|
var $clearOuts = flyd.map(
|
|
() => ({page: 1, search: ''}),
|
|
filterStream(
|
|
ev => !ev.target.value.length, // all blank values
|
|
$searchKeyups))
|
|
|
|
// Search form submissions
|
|
var $searchSubmits = flyd.stream()
|
|
flyd.on(ev => ev.preventDefault(), $searchSubmits)
|
|
var $searches = flyd.merge(
|
|
$clearOuts,
|
|
flyd.map(
|
|
ev => formToObj(ev.target),
|
|
$searchSubmits))
|
|
|
|
|
|
const root = state =>
|
|
h('form.table-meta-search', {
|
|
onsubmit: $searchSubmits
|
|
}, [
|
|
h('input', {type: 'hidden', name: 'page', value: 1}),
|
|
h('input', {
|
|
type: 'text',
|
|
name: 'search',
|
|
placeholder: state.get('placeholder') || 'Search',
|
|
value: state.get('search'),
|
|
onkeyup: $searchKeyups,
|
|
}),
|
|
h('button.button--input', {type: 'submit', disabled: state.get('loading')}, [
|
|
h('i.fa.fa-search', {style: {display: state.get('loading') ? 'none' : ''}}),
|
|
h('i.fa.fa-spin.fa-spinner', {style: {display: state.get('loading') ? '' : 'none'}})
|
|
])
|
|
])
|
|
|
|
module.exports = {root: root, $streams: {searches: $searches}}
|
|
|