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>
68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import React from "react";
|
|
import {formatLayerId} from "../libs/format";
|
|
import {type LayerSpecification, type StyleSpecification} from "maplibre-gl";
|
|
import { Trans, type WithTranslation, withTranslation } from "react-i18next";
|
|
import { type MappedError } from "../libs/definitions";
|
|
|
|
type AppMessagePanelInternalProps = {
|
|
errors?: MappedError[]
|
|
infos?: string[]
|
|
mapStyle?: StyleSpecification
|
|
onLayerSelect?(index: number): void;
|
|
currentLayer?: LayerSpecification
|
|
selectedLayerIndex?: number
|
|
} & WithTranslation;
|
|
|
|
class AppMessagePanelInternal extends React.Component<AppMessagePanelInternalProps> {
|
|
static defaultProps = {
|
|
onLayerSelect: () => {},
|
|
};
|
|
|
|
render() {
|
|
const {t, selectedLayerIndex} = this.props;
|
|
const errors = this.props.errors?.map((error, idx) => {
|
|
let content;
|
|
if (error.parsed && error.parsed.type === "layer") {
|
|
const {parsed} = error;
|
|
const layerId = this.props.mapStyle?.layers[parsed.data.index].id;
|
|
content = (
|
|
<>
|
|
<Trans t={t}>
|
|
Layer <span>{formatLayerId(layerId)}</span>: {parsed.data.message}
|
|
</Trans>
|
|
{selectedLayerIndex !== parsed.data.index &&
|
|
<>
|
|
—
|
|
<button
|
|
className="maputnik-message-panel__switch-button"
|
|
onClick={() => this.props.onLayerSelect!(parsed.data.index)}
|
|
>
|
|
{t("switch to layer")}
|
|
</button>
|
|
</>
|
|
}
|
|
</>
|
|
);
|
|
}
|
|
else {
|
|
content = error.message;
|
|
}
|
|
return <p key={"error-"+idx} className="maputnik-message-panel-error">
|
|
{content}
|
|
</p>;
|
|
});
|
|
|
|
const infos = this.props.infos?.map((m, i) => {
|
|
return <p key={"info-"+i}>{m}</p>;
|
|
});
|
|
|
|
return <div className="maputnik-message-panel">
|
|
{errors}
|
|
{infos}
|
|
</div>;
|
|
}
|
|
}
|
|
|
|
const AppMessagePanel = withTranslation()(AppMessagePanelInternal);
|
|
export default AppMessagePanel;
|