[maps] fix layer error in map embeddable error makes map unusable (#155885)

Fixes https://github.com/elastic/kibana/issues/155773

https://github.com/elastic/kibana/pull/134243 surfaced layer errors as
`output.error`. This was a mistake and caused map embeddable to render
only the layer error instead of the map
<img width="500" alt="Screen Shot 2023-04-26 at 7 27 00 AM"
src="https://user-images.githubusercontent.com/373691/234602920-4d063a4b-bc02-4fac-9037-0774a790b471.png">

PR resolves issue by no longer surfacing layer errors as `output.error`.
The map legend does a great job of surfacing individual layer errors and
still keeps the map usable.
<img width="500" alt="Screen Shot 2023-04-26 at 7 26 42 AM"
src="https://user-images.githubusercontent.com/373691/234603008-8c24674f-21ca-4046-88ed-b1f7b5a06b5b.png">

To test
* install web log sample data
* Add runtime geo point field to data view
* create and save map with runtime geo point field.
* remove runtime field from data view
* add map to dashboard. Verify map is displayed and error is surfaced in
map legend

---------

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Nathan Reese 2023-04-26 13:29:37 -06:00 committed by GitHub
parent 0a119b63bd
commit 1b64cfa641
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 6 additions and 17 deletions

View file

@ -408,7 +408,7 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource
if (!geoField) { if (!geoField) {
throw new Error( throw new Error(
i18n.translate('xpack.maps.source.esSource.noGeoFieldErrorMessage', { i18n.translate('xpack.maps.source.esSource.noGeoFieldErrorMessage', {
defaultMessage: `Data view "{indexPatternLabel}"" no longer contains the geo field "{geoField}"`, defaultMessage: `Data view "{indexPatternLabel}" no longer contains the geo field "{geoField}"`,
values: { indexPatternLabel: indexPattern.getName(), geoField: this.getGeoFieldName() }, values: { indexPatternLabel: indexPattern.getName(), geoField: this.getGeoFieldName() },
}) })
); );

View file

@ -794,7 +794,6 @@ export class MapEmbeddable
} }
const hiddenLayerIds = getHiddenLayerIds(this._savedMap.getStore().getState()); const hiddenLayerIds = getHiddenLayerIds(this._savedMap.getStore().getState());
if (!_.isEqual(this.input.hiddenLayers, hiddenLayerIds)) { if (!_.isEqual(this.input.hiddenLayers, hiddenLayerIds)) {
this.updateInput({ this.updateInput({
hiddenLayers: hiddenLayerIds, hiddenLayers: hiddenLayerIds,
@ -802,14 +801,7 @@ export class MapEmbeddable
} }
const isLoading = isMapLoading(this._savedMap.getStore().getState()); const isLoading = isMapLoading(this._savedMap.getStore().getState());
const firstLayerWithError = getLayerList(this._savedMap.getStore().getState()).find((layer) => { if (this.getOutput().loading !== isLoading) {
return layer.hasErrors();
});
const output = this.getOutput();
if (
output.loading !== isLoading ||
firstLayerWithError?.getErrors() !== output.error?.message
) {
/** /**
* Maps emit rendered when the data is loaded, as we don't have feedback from the maps rendering library atm. * Maps emit rendered when the data is loaded, as we don't have feedback from the maps rendering library atm.
* This means that the DASHBOARD_LOADED_EVENT event might be fired while a map is still rendering in some cases. * This means that the DASHBOARD_LOADED_EVENT event might be fired while a map is still rendering in some cases.
@ -817,13 +809,10 @@ export class MapEmbeddable
*/ */
this.updateOutput({ this.updateOutput({
loading: isLoading, loading: isLoading,
rendered: !isLoading && firstLayerWithError === undefined, rendered: !isLoading,
error: firstLayerWithError // do not surface layer errors as output.error
? { // output.error blocks entire embeddable display and prevents map from displaying
name: 'EmbeddableError', // layer errors are better surfaced in legend while still keeping the map usable
message: firstLayerWithError.getErrors(),
}
: undefined,
}); });
} }
} }