/* * SPDX-License-Identifier: Apache-2.0 * * The OpenSearch Contributors require contributions made to * this file be licensed under the Apache-2.0 license or a * compatible open source license. * * Any modifications Copyright OpenSearch Contributors. See * GitHub history for details. */ /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch B.V. licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import React from 'react'; import { Subscription } from 'rxjs'; import { PanelState, EmbeddableStart } from '../../../../../embeddable/public'; import { DashboardContainer, DashboardReactContextValue } from '../dashboard_container'; import { DashboardGrid } from '../grid'; import { context } from '../../../../../opensearch_dashboards_react/public'; export interface DashboardViewportProps { container: DashboardContainer; PanelComponent: EmbeddableStart['EmbeddablePanel']; renderEmpty?: () => React.ReactNode; } interface State { isFullScreenMode: boolean; useMargins: boolean; title: string; description?: string; panels: { [key: string]: PanelState }; isEmbeddedExternally?: boolean; isEmptyState?: boolean; } export class DashboardViewport extends React.Component { static contextType = context; public readonly context!: DashboardReactContextValue; private subscription?: Subscription; private mounted: boolean = false; constructor(props: DashboardViewportProps) { super(props); const { isFullScreenMode, panels, useMargins, title, isEmbeddedExternally, isEmptyState, } = this.props.container.getInput(); this.state = { isFullScreenMode, panels, useMargins, title, isEmbeddedExternally, isEmptyState, }; } public componentDidMount() { this.mounted = true; this.subscription = this.props.container.getInput$().subscribe(() => { const { isFullScreenMode, useMargins, title, description, isEmbeddedExternally, isEmptyState, } = this.props.container.getInput(); if (this.mounted) { this.setState({ isFullScreenMode, description, useMargins, title, isEmbeddedExternally, isEmptyState, }); } }); } public componentWillUnmount() { this.mounted = false; if (this.subscription) { this.subscription.unsubscribe(); } } public onExitFullScreenMode = () => { this.props.container.updateInput({ isFullScreenMode: false, }); }; private renderEmptyScreen() { const { renderEmpty } = this.props; const { isEmbeddedExternally, isFullScreenMode } = this.state; return (
{isFullScreenMode && ( )} {renderEmpty && renderEmpty()}
); } private renderContainerScreen() { const { container, PanelComponent } = this.props; const { isEmbeddedExternally, isFullScreenMode, panels, title, description, useMargins, } = this.state; return (
{isFullScreenMode && ( )}
); } public render() { return ( {this.state.isEmptyState ? this.renderEmptyScreen() : null} {this.renderContainerScreen()} ); } }