From 7fae257130d5b4ec30bc5be3c21105d0cf7674c0 Mon Sep 17 00:00:00 2001 From: Lukas Martinelli Date: Sat, 17 Dec 2016 17:40:44 +0100 Subject: [PATCH] Support displaying basic zoom fields --- src/fields/spec.jsx | 200 ++++++++++++++++++++++++++++---------------- 1 file changed, 127 insertions(+), 73 deletions(-) diff --git a/src/fields/spec.jsx b/src/fields/spec.jsx index 5cec027d..81813c1f 100644 --- a/src/fields/spec.jsx +++ b/src/fields/spec.jsx @@ -1,94 +1,148 @@ import React from 'react' import Immutable from 'immutable' +import color from 'color' + import GlSpec from 'mapbox-gl-style-spec/reference/latest.min.js' import NumberField from './number' import EnumField from './enum' import ColorField from './color' import StringField from './string' +import inputStyle from './input.js' +import theme from '../theme.js' -class SpecField extends React.Component { - static propTypes = { - onChange: React.PropTypes.func.isRequired, - fieldName: React.PropTypes.string.isRequired, - fieldSpec: React.PropTypes.object.isRequired, - value: React.PropTypes.oneOfType([ +function isZoomField(value) { + return Immutable.Map.isMap(value) +} + +const specFieldProps = { + onChange: React.PropTypes.func.isRequired, + fieldName: React.PropTypes.string.isRequired, + fieldSpec: React.PropTypes.object.isRequired, +} + +/** Supports displaying spec field for zoom function objects + * https://www.mapbox.com/mapbox-gl-style-spec/#types-function-zoom-property + */ +class ZoomSpecField extends React.Component { + static propTypes = { + ...specFieldProps, + value: React.PropTypes.oneOfType([ React.PropTypes.object, React.PropTypes.string, React.PropTypes.number, - ]).isRequired, + ]), } - onValueChanged(property, value) { - return this.props.onChange(property, value) - } + render() { + if(isZoomField(this.props.value)) { + const zoomFields = this.props.value.get('stops').map(stop => { + console.log(stop) + const zoomLevel = stop.get(0) + const value = stop.get(1) + console.log(zoomLevel, value) - render() { - switch(this.props.fieldSpec.type) { - case 'number': return ( - - ) - case 'enum': return ( - - ) - case 'string': return ( - - ) - case 'color': return ( - - ) - default: return null - } - } + return
+ Zoom Level {zoomLevel} + +
+ }).toSeq() + return
+ {zoomFields} +
+ } else { + return + } + } +} + +/** Display any field from the Mapbox GL style spec and + * choose the correct field component based on the @{fieldSpec} + * to display @{value}. */ +class SpecField extends React.Component { + static propTypes = { + ...specFieldProps, + value: React.PropTypes.oneOfType([ + React.PropTypes.string, + React.PropTypes.number, + ]), + } + + onValueChanged(property, value) { + return this.props.onChange(property, value) + } + + render() { + switch(this.props.fieldSpec.type) { + case 'number': return ( + + ) + case 'enum': return ( + + ) + case 'string': return ( + + ) + case 'color': return ( + + ) + default: return null + } + } } export class PropertyGroup extends React.Component { - static propTypes = { + static propTypes = { onChange: React.PropTypes.func.isRequired, - properties: React.PropTypes.instanceOf(Immutable.Map).isRequired, - layerType: React.PropTypes.oneOf(['fill', 'background', 'line', 'symbol']).isRequired, - groupType: React.PropTypes.oneOf(['paint', 'layout']).isRequired, + properties: React.PropTypes.instanceOf(Immutable.Map).isRequired, + layerType: React.PropTypes.oneOf(['fill', 'background', 'line', 'symbol']).isRequired, + groupType: React.PropTypes.oneOf(['paint', 'layout']).isRequired, } - render() { - const layerTypeSpec = GlSpec[this.props.groupType + "_" + this.props.layerType] - const specFields = Object.keys(layerTypeSpec).map(propName => { - const fieldSpec = layerTypeSpec[propName] - const propValue = this.props.properties.get(propName) - return - }) - return
- {specFields} -
- } + render() { + const layerTypeSpec = GlSpec[this.props.groupType + "_" + this.props.layerType] + const specFields = Object.keys(layerTypeSpec).map(propName => { + const fieldSpec = layerTypeSpec[propName] + const propValue = this.props.properties.get(propName) + return + }) + return
+ {specFields} +
+ } }