forked from elastic/kibana
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathembeddable_child_panel.tsx
114 lines (100 loc) · 3.64 KB
/
embeddable_child_panel.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
* 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 classNames from 'classnames';
import React from 'react';
import { EuiLoadingChart } from '@elastic/eui';
import { Subscription } from 'rxjs';
import { CoreStart } from 'src/core/public';
import { UiActionsService } from 'src/plugins/ui_actions/public';
import { Start as InspectorStartContract } from 'src/plugins/inspector/public';
import { ErrorEmbeddable, IEmbeddable } from '../embeddables';
import { EmbeddablePanel } from '../panel';
import { IContainer } from './i_container';
import { EmbeddableStart } from '../../plugin';
export interface EmbeddableChildPanelProps {
embeddableId: string;
className?: string;
container: IContainer;
getActions: UiActionsService['getTriggerCompatibleActions'];
getEmbeddableFactory: EmbeddableStart['getEmbeddableFactory'];
getAllEmbeddableFactories: EmbeddableStart['getEmbeddableFactories'];
overlays: CoreStart['overlays'];
notifications: CoreStart['notifications'];
application: CoreStart['application'];
inspector: InspectorStartContract;
SavedObjectFinder: React.ComponentType<any>;
}
interface State {
loading: boolean;
}
/**
* This component can be used by embeddable containers using react to easily render children. It waits
* for the child to be initialized, showing a loading indicator until that is complete.
*/
export class EmbeddableChildPanel extends React.Component<EmbeddableChildPanelProps, State> {
[panel: string]: any;
public mounted: boolean;
public embeddable!: IEmbeddable | ErrorEmbeddable;
private subscription?: Subscription;
constructor(props: EmbeddableChildPanelProps) {
super(props);
this.state = {
loading: true,
};
this.mounted = false;
}
public async componentDidMount() {
this.mounted = true;
const { container } = this.props;
this.embeddable = await container.untilEmbeddableLoaded(this.props.embeddableId);
if (this.mounted) {
this.setState({ loading: false });
}
}
public componentWillUnmount() {
this.mounted = false;
if (this.subscription) {
this.subscription.unsubscribe();
}
}
public render() {
const classes = classNames('embPanel', {
'embPanel-isLoading': this.state.loading,
});
return (
<div className={classes}>
{this.state.loading || !this.embeddable ? (
<EuiLoadingChart size="l" mono />
) : (
<EmbeddablePanel
embeddable={this.embeddable}
getActions={this.props.getActions}
getEmbeddableFactory={this.props.getEmbeddableFactory}
getAllEmbeddableFactories={this.props.getAllEmbeddableFactories}
overlays={this.props.overlays}
application={this.props.application}
notifications={this.props.notifications}
inspector={this.props.inspector}
SavedObjectFinder={this.props.SavedObjectFinder}
/>
)}
</div>
);
}
}