Skip to content

Commit 0c5c97f

Browse files
committed
settings tab refactored
1 parent e50253e commit 0c5c97f

File tree

8 files changed

+248
-52
lines changed

8 files changed

+248
-52
lines changed

src/view/Vfield/VfieldSelect.jsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ export default class VfieldSelect extends React.Component {
88
type: PropTypes.string.isRequired,
99
label: PropTypes.string,
1010
name: PropTypes.string.isRequired,
11-
value: PropTypes.string,
11+
value: PropTypes.oneOfType([
12+
PropTypes.string,
13+
PropTypes.number
14+
]),
1215
placeholder: PropTypes.string,
1316
helper: PropTypes.string,
1417
options: PropTypes.array,

src/view/Vlayer/VlayerGroup/VlayerGroupPaint.jsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,6 @@ export default class VlayerGroupPaint extends React.Component {
3535
render (){
3636
const {layer, handle, focus, error} = this.props;
3737

38-
const typeOptions = Mlayer.getTypes();
39-
const sourceOptions = Msource.getOptions();
40-
41-
const sourceLayerOptions = (layer.get('source'))? Msource.getLayerOptions(layer.get('source')):
42-
null;
43-
4438
const spec = this.state.spec;
4539

4640
const layerGroup = layer.get(group);

src/view/Vlayer/VlayerGroup/VlayerGroupSettings.jsx

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,6 @@ export default class VlayerGroupSettings extends React.Component {
3636
render (){
3737
const {layer, handle, focus, error} = this.props;
3838

39-
const typeOptions = Mlayer.getTypes();
40-
const sourceOptions = Msource.getOptions();
41-
42-
const sourceLayerOptions = (layer.get('source'))? Msource.getLayerOptions(layer.get('source')):
43-
null;
44-
4539
const layerId = layer.get('id');
4640

4741
const spec = styleSpec.latest.layer;
@@ -64,11 +58,6 @@ export default class VlayerGroupSettings extends React.Component {
6458
}
6559
if (!layer.has('source')) delete addSpec['source-layer'];
6660

67-
console.log('addSpec:',addSpec);
68-
69-
//console.log('source options:',sourceOptions);
70-
// loop through editable layer props and display edit interface for each
71-
7261
return <div className="">
7362
{layer.keySeq().map((key)=>{
7463
if (!addSpec[key]) return;

src/view/Vproperty/VpropertyExpression/index.jsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ export default class VpropertyExpression extends React.Component {
4545
value: PropTypes.object,
4646
placeholder: PropTypes.string,
4747
helper: PropTypes.string,
48-
error: PropTypes.string,
48+
error: PropTypes.oneOfType([
49+
PropTypes.string,
50+
PropTypes.object
51+
]),
4952
controlled: PropTypes.boolean,
5053
inputClass: PropTypes.string,
5154
inputNoAC: PropTypes.boolean,

src/view/Vproperty/VpropertyFunction/index.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ export default class VpropertyFunction extends React.Component {
114114
let name = property.name+'.'+key;
115115
let error = (property.error && property.error.get)? property.error.get(key): null;
116116
//console.log('function error:',error);
117+
118+
//console.log('function key:',key);
117119
if (key === 'stops'){
118120
funcs.push(<VpropertyFunctionStops key={key} func={{
119121
type:key,
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
import {List,fromJS} from 'immutable';
4+
5+
import Vfield from '../../Vfield';
6+
7+
import VpropertyAdd from '../VpropertyAdd';
8+
9+
import styleSpec from '../../../vendor/style-spec/style-spec';
10+
11+
export default class VpropertyMetadata extends React.Component {
12+
13+
static propTypes = {
14+
property: PropTypes.shape({
15+
type: PropTypes.string.isRequired,
16+
name: PropTypes.string.isRequired, // string of position . separated
17+
value: PropTypes.object,
18+
placeholder: PropTypes.string,
19+
error: PropTypes.oneOfType([
20+
PropTypes.string,
21+
PropTypes.object
22+
]),
23+
specType: PropTypes.string
24+
}),
25+
focus: PropTypes.string,
26+
handle: PropTypes.object
27+
}
28+
29+
constructor(props) {
30+
super(props);
31+
const {handle, property} = this.props;
32+
33+
//console.log('handle:',handle);
34+
35+
// convert value into array of arrays [[k,v],[k,v]]
36+
let valAry = [];
37+
property.value.keySeq().toArray().forEach((key)=>{
38+
let val = property.value.get(key);
39+
if (val === true) val = 'true';
40+
else if (val === false) val = 'false';
41+
valAry.push([key,val]);
42+
});
43+
44+
this.state = {
45+
valAry:fromJS(valAry)
46+
};
47+
48+
this.handle = {
49+
add:()=>{
50+
this.setState({valAry:this.state.valAry.push(List([]))});
51+
}
52+
};
53+
54+
for (let i in this.handle){
55+
this.handle[i] = this.handle[i].bind(this);
56+
}
57+
58+
this.fieldHandle = {
59+
...handle,
60+
backout:(f)=>{
61+
let setIn = f.name.split('.').map((v)=>{
62+
return Number(v);
63+
});
64+
if (setIn[1] === 1){ // value backed out of
65+
const keyName = [setIn[0],0].join('.');
66+
handle.focus(keyName);
67+
return;
68+
}
69+
if (setIn[1] === 0){ // key backed out of
70+
const newValAry = this.state.valAry.remove(setIn[0]);
71+
this.setState({valAry:newValAry});
72+
73+
this.fieldHandle.commit(newValAry);
74+
75+
if (setIn[0] > 0){
76+
const prevName = [setIn[0]-1,1].join('.');
77+
handle.focus(prevName);
78+
}
79+
}
80+
},
81+
change:(f)=>{
82+
// split name
83+
let setIn = f.name.split('.').map((v)=>{
84+
return Number(v);
85+
});
86+
const newValAry = this.state.valAry.setIn(setIn,f.value);
87+
88+
this.setState({valAry:newValAry});
89+
90+
this.fieldHandle.commit(newValAry);
91+
},
92+
commit:(newValAry)=>{
93+
let value = {};
94+
95+
newValAry.keySeq().toArray().forEach((key)=>{
96+
let val = newValAry.getIn([key,1]);
97+
if (val === undefined) val = '';
98+
else if (val === 'true') val = true;
99+
else if (val === 'false') val = false;
100+
else if (val.match && val.match(/^[0-9]+$/)) val = Number(val);
101+
value[newValAry.getIn([key,0])] = val;
102+
});
103+
104+
handle.change({
105+
name:property.name,
106+
value:fromJS(value)
107+
});
108+
}
109+
};
110+
111+
for (let i in this.fieldHandle){
112+
this.fieldHandle[i] = this.fieldHandle[i].bind(this);
113+
}
114+
115+
}
116+
117+
render (){
118+
const {property, focus} = this.props;
119+
120+
let rows = [], ind = 0;
121+
this.state.valAry.keySeq().toArray().forEach((key)=>{
122+
123+
const keyName = key+'.0';
124+
const valueName = key+'.1';
125+
126+
const error = (property.error && property.error.get)? property.error.get(key): null;
127+
//console.log('function error:',error);
128+
129+
const keyFocus = (keyName === focus)? true: false;
130+
const valueFocus = (valueName === focus)? true: false;
131+
132+
let value = this.state.valAry.getIn([key,1]);
133+
if (value === true) value = 'true';
134+
else if (value === false) value = 'false';
135+
136+
rows.push(
137+
<div key={key} className="row">
138+
<div className="col-sm-6 pr-1">
139+
<Vfield key={keyName} field={{
140+
type:'string',
141+
name:keyName,
142+
value:this.state.valAry.getIn([key,0]),
143+
controlled:false,
144+
autoFocus:keyFocus
145+
}} handle={this.fieldHandle}/>
146+
</div>
147+
<div className="col-sm-6 pl-0">
148+
<Vfield key={valueName} field={{
149+
type:'string',
150+
name:valueName,
151+
value:value,
152+
controlled:false,
153+
autoFocus:valueFocus
154+
}} handle={this.fieldHandle}/>
155+
</div>
156+
</div>
157+
);
158+
159+
ind++;
160+
});
161+
162+
return <div className="form-group mb-0">
163+
<div className="mt-2 p-2 func-border position-relative">
164+
{rows}
165+
166+
<div className="mt-2">
167+
<div onClick={this.handle.add} className="btn btn-xs btn-light">
168+
<i className="material-icons md-14">add</i>
169+
</div>
170+
</div>
171+
</div>
172+
</div>
173+
}
174+
};

src/view/Vproperty/index.jsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Vfield from '../Vfield';
77

88
import VpropertyArray from './VpropertyArray';
99
import VpropertyExpression from './VpropertyExpression';
10+
import VpropertyMetadata from './VpropertyMetadata';
1011
import VpropertyFunction from './VpropertyFunction';
1112
import VpropertyInfo from './VpropertyInfo';
1213

@@ -151,6 +152,18 @@ export default class Vproperty extends React.Component {
151152
specType:specType
152153
}} focus={focus} handle={handle}/>
153154
</div>;
155+
} else if (spec.type === '*'){
156+
mode = 'metadata';
157+
elem = <div>
158+
<VpropertyMetadata property={{
159+
pos:[0],
160+
type:'array',
161+
name:property.name,
162+
value:property.value,
163+
placeholder:doc,
164+
error:property.error
165+
}} focus={focus} handle={handle}/>
166+
</div>;
154167
} else if (List.isList(property.value)){
155168
//console.log('expression');
156169

src/view/Vsetting/index.jsx

Lines changed: 51 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,19 @@ import React from 'react';
22

33
import Mstyle from '../../model/Mstyle';
44

5-
import Vfield from '../Vfield';
5+
import styleSpec from '../../vendor/style-spec/style-spec';
6+
7+
import Vproperty from '../Vproperty';
8+
import VpropertyAdd from '../Vproperty/VpropertyAdd';
69

710
export default class Vsetting extends React.Component {
811
constructor(props) {
912
super(props);
1013
const {style, handle} = props;
1114

1215
this.state = {
13-
deleteShow:false
16+
deleteShow:false,
17+
focus:null
1418
};
1519

1620
console.log('style',style.get('name'));
@@ -30,6 +34,10 @@ export default class Vsetting extends React.Component {
3034
},
3135
deleteHide:()=>{
3236
this.setState({deleteShow:false});
37+
},
38+
focus:(pos)=>{
39+
//console.log('focus:',pos);
40+
this.setState({focus:pos});
3341
}
3442
};
3543
for (let i in this.handle){
@@ -38,7 +46,25 @@ export default class Vsetting extends React.Component {
3846
}
3947

4048
render (){
41-
const {style} = this.props;
49+
const {style, error} = this.props;
50+
51+
const spec = styleSpec.latest.$root;
52+
53+
let addSpec = {
54+
version:spec.version,
55+
name:spec.name,
56+
metadata:spec.metadata,
57+
center:spec.center,
58+
zoom:spec.zoom,
59+
bearing:spec.bearing,
60+
pitch:spec.pitch,
61+
light:spec.light,
62+
sprite:spec.sprite,
63+
glyphs:spec.glyphs,
64+
transition:spec.transition
65+
};
66+
67+
console.log('spec:',spec);
4268

4369
return <div className="h-100">
4470
<div className="p-1">
@@ -49,35 +75,26 @@ export default class Vsetting extends React.Component {
4975
</div>
5076
</h2>
5177
<div className="p-2">
52-
<div className="">
53-
<Vfield key="name" field={{
54-
type:'string',
55-
label:'Name',
56-
name:'name',
57-
value:style.get('name'),
58-
placeholder:'name of this style',
59-
controlled:false
60-
}} handle={this.handle}/>
61-
</div>
62-
<div className="mt-2">
63-
<Vfield key="sprite" field={{
64-
type:'string',
65-
label:'Sprite URL',
66-
name:'sprite',
67-
value:style.get('sprite'),
68-
placeholder:'points to the style sprites',
69-
controlled:false
70-
}} handle={this.handle}/>
71-
</div>
72-
<div className="mt-2">
73-
<Vfield key="glyphs" field={{
74-
type:'string',
75-
label:'Glyph URL',
76-
name:'glyphs',
77-
value:style.get('glyphs'),
78-
placeholder:'points to the style glyphs',
79-
controlled:false
80-
}} handle={this.handle}/>
78+
{style.keySeq().map((key)=>{
79+
//console.log('styleSpec key:',key);
80+
if (!addSpec[key]) return;
81+
82+
return <Vproperty key={key} property={{
83+
name:key,
84+
label:key,
85+
spec:addSpec[key],
86+
value:style.get(key),
87+
error:error && error.get && error.get(key),
88+
required:addSpec[key].required
89+
}} focus={this.state.focus} handle={this.handle}/>
90+
})}
91+
92+
<div className="property">
93+
<VpropertyAdd
94+
spec={addSpec}
95+
layerGroup={style}
96+
focus={this.state.focus}
97+
handle={this.handle}/>
8198
</div>
8299

83100
{this.state.deleteShow ?
@@ -98,6 +115,7 @@ export default class Vsetting extends React.Component {
98115
}
99116
</div>
100117
</div>
101-
</div>
118+
</div>;
119+
102120
}
103121
};

0 commit comments

Comments
 (0)