mirror of
https://github.com/maputnik/editor.git
synced 2025-12-26 16:10:01 +00:00
104 lines
2.4 KiB
JavaScript
104 lines
2.4 KiB
JavaScript
import React from 'react'
|
|
import PropTypes from 'prop-types'
|
|
|
|
import InputBlock from '../inputs/InputBlock'
|
|
import Button from '../Button'
|
|
import {MdDelete, MdUndo} from 'react-icons/md'
|
|
import StringInput from '../inputs/StringInput'
|
|
|
|
import labelFromFieldName from './_labelFromFieldName'
|
|
import stringifyPretty from 'json-stringify-pretty-compact'
|
|
import JSONEditor from '../layers/JSONEditor'
|
|
|
|
|
|
function isLiteralExpression (value) {
|
|
return (Array.isArray(value) && value.length === 2 && value[0] === "literal");
|
|
}
|
|
|
|
export default class ExpressionProperty extends React.Component {
|
|
static propTypes = {
|
|
onDelete: PropTypes.func,
|
|
fieldName: PropTypes.string,
|
|
fieldSpec: PropTypes.object,
|
|
value: PropTypes.object,
|
|
error: PropTypes.object,
|
|
onChange: PropTypes.func,
|
|
}
|
|
|
|
constructor (props) {
|
|
super();
|
|
this.state = {
|
|
lastValue: props.value,
|
|
};
|
|
}
|
|
|
|
onChange = (jsonVal) => {
|
|
if (isLiteralExpression(jsonVal)) {
|
|
this.setState({
|
|
lastValue: jsonVal
|
|
});
|
|
}
|
|
|
|
this.props.onChange(jsonVal);
|
|
}
|
|
|
|
onReset = () => {
|
|
const {lastValue} = this.state;
|
|
const {value, fieldSpec} = this.props;
|
|
|
|
if (isLiteralExpression(value)) {
|
|
this.props.onDelete(value[1]);
|
|
}
|
|
else if (isLiteralExpression(lastValue)) {
|
|
this.props.onDelete(lastValue[1]);
|
|
}
|
|
}
|
|
|
|
onDelete = () => {
|
|
const {fieldSpec} = this.props;
|
|
this.props.onDelete(fieldSpec.default);
|
|
}
|
|
|
|
render() {
|
|
const {lastValue} = this.state;
|
|
const {value} = this.props;
|
|
|
|
const canUndo = isLiteralExpression(value) || isLiteralExpression(lastValue);
|
|
const deleteStopBtn = (
|
|
<>
|
|
<Button
|
|
onClick={this.onReset}
|
|
disabled={!canUndo}
|
|
className="maputnik-delete-stop"
|
|
>
|
|
<MdUndo />
|
|
</Button>
|
|
<Button
|
|
onClick={this.onDelete}
|
|
className="maputnik-delete-stop"
|
|
>
|
|
<MdDelete />
|
|
</Button>
|
|
</>
|
|
);
|
|
|
|
return <InputBlock
|
|
error={this.props.error}
|
|
fieldSpec={this.props.fieldSpec}
|
|
label={labelFromFieldName(this.props.fieldName)}
|
|
action={deleteStopBtn}
|
|
wideMode={true}
|
|
>
|
|
<JSONEditor
|
|
className="maputnik-expression-editor"
|
|
layer={value}
|
|
lineNumbers={false}
|
|
maxHeight={200}
|
|
lineWrapping={true}
|
|
getValue={(data) => stringifyPretty(data, {indent: 2, maxLength: 50})}
|
|
onChange={this.onChange}
|
|
/>
|
|
</InputBlock>
|
|
}
|
|
}
|