/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React, { useEffect, useRef, useState } from 'react'; import { useParams } from 'react-router-dom'; import { Map as Maplibre } from 'maplibre-gl'; import classNames from 'classnames'; import { GeoShapeRelation } from '@opensearch-project/opensearch/api/types'; import { SimpleSavedObject } from '../../../../../src/core/public'; import { MapContainer } from '../map_container'; import { MapTopNavMenu } from '../map_top_nav'; import { MapServices } from '../../types'; import { useOpenSearchDashboards } from '../../../../../src/plugins/opensearch_dashboards_react/public'; import { MapSavedObjectAttributes } from '../../../common/map_saved_object_attributes'; import { DASHBOARDS_MAPS_LAYER_TYPE, MAP_LAYER_DEFAULT_NAME, OPENSEARCH_MAP_LAYER, } from '../../../common'; import { MapLayerSpecification } from '../../model/mapLayerType'; import { getLayerConfigMap, getInitialMapState } from '../../utils/getIntialConfig'; import { Filter, IndexPattern, RefreshInterval, TimeRange, Query, } from '../../../../../src/plugins/data/public'; import { MapState } from '../../model/mapState'; import { ConfigSchema } from '../../../common/config'; import { GeoShapeFilterMeta, ShapeFilter } from '../../../../../src/plugins/data/common'; import { buildGeoShapeFilterMeta } from '../../model/geo/filter'; import { FilterBar } from '../filter_bar/filter_bar'; interface MapPageProps { mapConfig: ConfigSchema; } export interface DashboardProps { timeRange?: TimeRange; refreshConfig?: RefreshInterval; filters?: Filter[]; query?: Query; } interface MapComponentProps { mapConfig: ConfigSchema; mapIdFromSavedObject: string; dashboardProps?: DashboardProps; } export const MapComponent = ({ mapIdFromSavedObject, mapConfig, dashboardProps, }: MapComponentProps) => { const { services } = useOpenSearchDashboards(); const { savedObjects: { client: savedObjectsClient }, } = services; const [layers, setLayers] = useState([]); const [savedMapObject, setSavedMapObject] = useState | null>(); const [layersIndexPatterns, setLayersIndexPatterns] = useState([]); const maplibreRef = useRef(null); const [mapState, setMapState] = useState(getInitialMapState()); const [isUpdatingLayerRender, setIsUpdatingLayerRender] = useState(true); const isReadOnlyMode = !!dashboardProps; useEffect(() => { if (mapIdFromSavedObject) { savedObjectsClient.get('map', mapIdFromSavedObject).then((res) => { setSavedMapObject(res); const layerList: MapLayerSpecification[] = JSON.parse(res.attributes.layerList as string); const savedMapState: MapState = JSON.parse(res.attributes.mapState as string); setMapState(savedMapState); setLayers(layerList); const savedIndexPatterns: IndexPattern[] = []; layerList.forEach(async (layer: MapLayerSpecification) => { if (layer.type === DASHBOARDS_MAPS_LAYER_TYPE.DOCUMENTS) { const indexPatternId = layer.source.indexPatternId; const indexPattern = await services.data.indexPatterns.get(indexPatternId); savedIndexPatterns.push(indexPattern); } }); setLayersIndexPatterns(savedIndexPatterns); }); } else { const initialDefaultLayer: MapLayerSpecification = getLayerConfigMap(mapConfig)[ OPENSEARCH_MAP_LAYER.type ] as MapLayerSpecification; initialDefaultLayer.name = MAP_LAYER_DEFAULT_NAME; setLayers([initialDefaultLayer]); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const addSpatialFilter = ( shape: ShapeFilter, label: string | null, relation: GeoShapeRelation ) => { const filterMeta: GeoShapeFilterMeta = buildGeoShapeFilterMeta(label, shape, relation); const geoShapeFilterMeta: GeoShapeFilterMeta[] = mapState.spatialMetaFilters || []; setMapState({ ...mapState, spatialMetaFilters: [...geoShapeFilterMeta, filterMeta], }); }; const onFiltersUpdated = (newFilters: GeoShapeFilterMeta[]) => { setMapState({ ...mapState, spatialMetaFilters: [...newFilters], }); }; const filterGroupClasses = classNames('globalFilterGroup__wrapper', { // eslint-disable-next-line @typescript-eslint/naming-convention 'globalFilterGroup__wrapper-isVisible': !!mapState.spatialMetaFilters?.length, }); return (
{isReadOnlyMode ? null : ( )} {!isReadOnlyMode && !!mapState.spatialMetaFilters?.length && (
)}
); }; export const MapPage = ({ mapConfig }: MapPageProps) => { const { id: mapId } = useParams<{ id: string }>(); return ; };