mirror of
https://github.com/maputnik/editor.git
synced 2025-12-24 15:10:01 +00:00
## Launch Checklist This PR adds back the error panel which was under the map for some reason. It also highlights problematic layers in the layers list (which already worked). It also highlights the field that has an error related to it. It fixes the error types throughout the code. Before: <img width="1141" height="665" alt="image" src="https://github.com/user-attachments/assets/c0593d6c-8f14-41b3-8a51-bc359446656d" /> After: <img width="1141" height="665" alt="image" src="https://github.com/user-attachments/assets/1ffeebb7-31ea-4ed5-97f4-fc5f907a6aea" /> - [x] Briefly describe the changes in this PR. - [x] Include before/after visuals or gifs if this PR includes visual changes. - [x] Write tests for all new functionality. - [x] Add an entry to `CHANGELOG.md` under the `## main` section. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
77 lines
2.4 KiB
TypeScript
77 lines
2.4 KiB
TypeScript
import React from "react";
|
|
|
|
import FieldFunction from "./FieldFunction";
|
|
import type {LayerSpecification} from "maplibre-gl";
|
|
import { type MappedLayerErrors } from "../libs/definitions";
|
|
|
|
const iconProperties = ["background-pattern", "fill-pattern", "line-pattern", "fill-extrusion-pattern", "icon-image"];
|
|
|
|
/** Extract field spec by {@fieldName} from the {@layerType} in the
|
|
* style specification from either the paint or layout group */
|
|
function getFieldSpec(spec: any, layerType: LayerSpecification["type"], fieldName: string) {
|
|
const groupName = getGroupName(spec, layerType, fieldName);
|
|
const group = spec[groupName + "_" + layerType];
|
|
const fieldSpec = group[fieldName];
|
|
if(iconProperties.indexOf(fieldName) >= 0) {
|
|
return {
|
|
...fieldSpec,
|
|
values: spec.$root.sprite.values
|
|
};
|
|
}
|
|
if(fieldName === "text-font") {
|
|
return {
|
|
...fieldSpec,
|
|
values: spec.$root.glyphs.values
|
|
};
|
|
}
|
|
return fieldSpec;
|
|
}
|
|
|
|
function getGroupName(spec: any, layerType: LayerSpecification["type"], fieldName: string): "paint" | "layout" {
|
|
const paint = spec["paint_" + layerType] || {};
|
|
return (fieldName in paint) ? "paint" : "layout";
|
|
}
|
|
|
|
type PropertyGroupProps = {
|
|
layer: LayerSpecification
|
|
groupFields: string[]
|
|
onChange(...args: unknown[]): unknown
|
|
spec: any
|
|
errors?: MappedLayerErrors
|
|
};
|
|
|
|
export default class PropertyGroup extends React.Component<PropertyGroupProps> {
|
|
onPropertyChange = (property: string, newValue: any) => {
|
|
const group = getGroupName(this.props.spec, this.props.layer.type, property);
|
|
this.props.onChange(group ,property, newValue);
|
|
};
|
|
|
|
render() {
|
|
const {errors} = this.props;
|
|
const fields = this.props.groupFields.map(fieldName => {
|
|
const fieldSpec = getFieldSpec(this.props.spec, this.props.layer.type, fieldName);
|
|
|
|
const paint = this.props.layer.paint || {};
|
|
const layout = this.props.layer.layout || {};
|
|
const fieldValue = fieldName in paint
|
|
? paint[fieldName as keyof typeof paint]
|
|
: layout[fieldName as keyof typeof layout];
|
|
const fieldType = fieldName in paint ? "paint" : "layout";
|
|
|
|
return <FieldFunction
|
|
errors={errors}
|
|
onChange={this.onPropertyChange}
|
|
key={fieldName}
|
|
fieldName={fieldName}
|
|
value={fieldValue}
|
|
fieldType={fieldType}
|
|
fieldSpec={fieldSpec}
|
|
/>;
|
|
});
|
|
|
|
return <div className="maputnik-property-group">
|
|
{fields}
|
|
</div>;
|
|
}
|
|
}
|