mirror of
https://github.com/a-nyx/maputnik-with-pmtiles.git
synced 2024-11-10 09:57:45 +01:00
Filter out combining operator select
This commit is contained in:
parent
ba0a94f3ad
commit
fed530f5f2
4 changed files with 87 additions and 64 deletions
41
src/components/filter/CombiningOperatorSelect.jsx
Normal file
41
src/components/filter/CombiningOperatorSelect.jsx
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
import React from 'react'
|
||||||
|
import SelectInput from '../inputs/SelectInput'
|
||||||
|
|
||||||
|
import input from '../../config/input.js'
|
||||||
|
import { margins } from '../../config/scales.js'
|
||||||
|
|
||||||
|
class CombiningOperatorSelect extends React.Component {
|
||||||
|
static propTypes = {
|
||||||
|
value: React.PropTypes.string.isRequired,
|
||||||
|
onChange: React.PropTypes.func.isRequired,
|
||||||
|
style: React.PropTypes.object,
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return <div style={{
|
||||||
|
display: 'inline-block',
|
||||||
|
width: '50%',
|
||||||
|
}}>
|
||||||
|
<SelectInput
|
||||||
|
value={this.props.value}
|
||||||
|
options={['all', 'any', 'none']}
|
||||||
|
onChange={this.props.onChange}
|
||||||
|
style={{
|
||||||
|
display: 'block',
|
||||||
|
width: '100%',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<label style={{
|
||||||
|
...input.label,
|
||||||
|
width: 'auto',
|
||||||
|
marginLeft: margins[2],
|
||||||
|
display: 'block',
|
||||||
|
width: '100%',
|
||||||
|
}}>
|
||||||
|
of the filters match
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CombiningOperatorSelect
|
|
@ -3,11 +3,13 @@ import GlSpec from 'mapbox-gl-style-spec/reference/latest.js'
|
||||||
|
|
||||||
import input from '../../config/input.js'
|
import input from '../../config/input.js'
|
||||||
import colors from '../../config/colors.js'
|
import colors from '../../config/colors.js'
|
||||||
import { margins } from '../../config/scales.js'
|
import { margins, fontSizes } from '../../config/scales.js'
|
||||||
|
|
||||||
|
import CombiningOperatorSelect from './CombiningOperatorSelect'
|
||||||
import DocLabel from '../fields/DocLabel'
|
import DocLabel from '../fields/DocLabel'
|
||||||
import Button from '../Button'
|
import Button from '../Button'
|
||||||
import SelectInput from '../inputs/SelectInput'
|
import SelectInput from '../inputs/SelectInput'
|
||||||
|
import MultiButtonInput from '../inputs/MultiButtonInput'
|
||||||
import StringInput from '../inputs/StringInput'
|
import StringInput from '../inputs/StringInput'
|
||||||
import AutocompleteInput from '../inputs/AutocompleteInput'
|
import AutocompleteInput from '../inputs/AutocompleteInput'
|
||||||
|
|
||||||
|
@ -32,45 +34,6 @@ function hasNestedCombiningFilter(filter) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
class CombiningOperatorSelect extends React.Component {
|
|
||||||
static propTypes = {
|
|
||||||
value: React.PropTypes.string.isRequired,
|
|
||||||
onChange: React.PropTypes.func.isRequired,
|
|
||||||
style: React.PropTypes.object,
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const options = combiningFilterOps.map(op => {
|
|
||||||
return <option key={op} value={op}>{op}</option>
|
|
||||||
})
|
|
||||||
|
|
||||||
return <div
|
|
||||||
style={{
|
|
||||||
marginTop: margins[1],
|
|
||||||
marginBottom: margins[1],
|
|
||||||
...this.props.style
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<select
|
|
||||||
style={{
|
|
||||||
...input.select,
|
|
||||||
width: '20.5%',
|
|
||||||
}}
|
|
||||||
value={this.props.value}
|
|
||||||
onChange={e => this.props.onChange(e.target.value)}
|
|
||||||
>
|
|
||||||
{options}
|
|
||||||
</select>
|
|
||||||
<label style={{
|
|
||||||
...input.label,
|
|
||||||
width: '60%',
|
|
||||||
marginLeft: margins[0],
|
|
||||||
}}>
|
|
||||||
of the filters matches
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class OperatorSelect extends React.Component {
|
class OperatorSelect extends React.Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
|
@ -194,16 +157,18 @@ export default class CombiningFilterEditor extends React.Component {
|
||||||
|
|
||||||
const filterEditors = filters.map((f, idx) => {
|
const filterEditors = filters.map((f, idx) => {
|
||||||
return <div>
|
return <div>
|
||||||
|
<div style={{display: 'inline-block', width: '25%'}}>
|
||||||
<Button
|
<Button
|
||||||
style={{backgroundColor: null}}
|
style={{backgroundColor: null}}
|
||||||
onClick={this.deleteFilterItem.bind(this, idx)}
|
onClick={this.deleteFilterItem.bind(this, idx)}
|
||||||
>
|
>
|
||||||
<DeleteIcon />
|
<DeleteIcon />
|
||||||
</Button>
|
</Button>
|
||||||
|
</div>
|
||||||
<SingleFilterEditor
|
<SingleFilterEditor
|
||||||
style={{
|
style={{
|
||||||
display: 'inline-block',
|
display: 'inline-block',
|
||||||
width: '80%'
|
width: '75%'
|
||||||
}}
|
}}
|
||||||
key={idx}
|
key={idx}
|
||||||
properties={this.props.properties}
|
properties={this.props.properties}
|
||||||
|
@ -219,22 +184,30 @@ export default class CombiningFilterEditor extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
return <div>
|
return <div>
|
||||||
|
<div style={{
|
||||||
|
width: '50%',
|
||||||
|
verticalAlign: 'top',
|
||||||
|
display: 'inline-block',
|
||||||
|
}}>
|
||||||
<DocLabel
|
<DocLabel
|
||||||
label={"Filter"}
|
label={"Filter"}
|
||||||
doc={GlSpec.layer.filter.doc}
|
doc={GlSpec.layer.filter.doc}
|
||||||
style={{
|
style={{
|
||||||
width: '42.25%',
|
display: 'block',
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
<div>
|
||||||
|
<Button onClick={this.addFilterItem.bind(this)}>Add filter</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<CombiningOperatorSelect
|
<CombiningOperatorSelect
|
||||||
value={combiningOp}
|
value={combiningOp}
|
||||||
onChange={this.onFilterPartChanged.bind(this, 0)}
|
onChange={this.onFilterPartChanged.bind(this, 0)}
|
||||||
style={{
|
style={{
|
||||||
display: 'inline-block',
|
display: 'inline-block',
|
||||||
width: '80%'
|
width: '50%'
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Button onClick={this.addFilterItem.bind(this)}>Add filter</Button>
|
|
||||||
{filterEditors}
|
{filterEditors}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,21 +15,29 @@ class MultiButtonInput extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const selectedValue = this.props.value || this.props.options[0][0]
|
let options = this.props.options
|
||||||
const buttons = this.props.options.map(([val, label])=> {
|
if(options.length > 0 && !Array.isArray(options[0])) {
|
||||||
|
options = options.map(v => [v, v])
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedValue = this.props.value || options[0][0]
|
||||||
|
const buttons = options.map(([val, label])=> {
|
||||||
return <Button
|
return <Button
|
||||||
key={val}
|
key={val}
|
||||||
|
onClick={e => this.props.onChange(val)}
|
||||||
style={{
|
style={{
|
||||||
marginRight: margins[0],
|
marginRight: margins[0],
|
||||||
backgroundColor: val === selectedValue ? colors.midgray : colors.gray,
|
backgroundColor: val === selectedValue ? colors.midgray : colors.gray,
|
||||||
}}
|
}}
|
||||||
onClick={e => this.props.onChange(val)}
|
|
||||||
>
|
>
|
||||||
{label}
|
{label}
|
||||||
</Button>
|
</Button>
|
||||||
})
|
})
|
||||||
|
|
||||||
return <div style={{display: 'inline-block'}}>
|
return <div style={{
|
||||||
|
display: 'inline-block',
|
||||||
|
...this.props.style,
|
||||||
|
}}>
|
||||||
{buttons}
|
{buttons}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,9 +11,10 @@ class SelectInput extends React.Component {
|
||||||
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const options = this.props.options.map(([val, label])=> {
|
let options = this.props.options
|
||||||
return <option key={val} value={val}>{label}</option>
|
if(options.length > 0 && !Array.isArray(options[0])) {
|
||||||
})
|
options = options.map(v => [v, v])
|
||||||
|
}
|
||||||
|
|
||||||
return <select
|
return <select
|
||||||
style={{
|
style={{
|
||||||
|
@ -23,7 +24,7 @@ class SelectInput extends React.Component {
|
||||||
value={this.props.value}
|
value={this.props.value}
|
||||||
onChange={e => this.props.onChange(e.target.value)}
|
onChange={e => this.props.onChange(e.target.value)}
|
||||||
>
|
>
|
||||||
{options}
|
{ options.map(([val, label]) => <option key={val} value={val}>{label}</option>) }
|
||||||
</select>
|
</select>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue