import React, { PureComponent } from 'react'; import { connect } from 'react-redux'; import { hot } from 'react-hot-loader'; import { ExploreId } from 'app/types/explore'; import { DataSourceSelectItem, RawTimeRange, TimeRange, ClickOutsideWrapper } from '@grafana/ui'; import { DataSourcePicker } from 'app/core/components/Select/DataSourcePicker'; import { StoreState } from 'app/types/store'; import { changeDatasource, clearQueries, splitClose, runQueries, splitOpen, changeRefreshInterval, } from './state/actions'; import TimePicker from './TimePicker'; import { RefreshPicker, SetInterval } from '@grafana/ui'; enum IconSide { left = 'left', right = 'right', } const createResponsiveButton = (options: { splitted: boolean; title: string; onClick: () => void; buttonClassName?: string; iconClassName?: string; iconSide?: IconSide; }) => { const defaultOptions = { iconSide: IconSide.left, }; const props = { ...options, defaultOptions }; const { title, onClick, buttonClassName, iconClassName, splitted, iconSide } = props; return ( ); }; interface OwnProps { exploreId: ExploreId; timepickerRef: React.RefObject; onChangeTime: (range: TimeRange, changedByScanner?: boolean) => void; } interface StateProps { datasourceMissing: boolean; exploreDatasources: DataSourceSelectItem[]; loading: boolean; range: RawTimeRange; selectedDatasource: DataSourceSelectItem; splitted: boolean; refreshInterval: string; } interface DispatchProps { changeDatasource: typeof changeDatasource; clearAll: typeof clearQueries; runQueries: typeof runQueries; closeSplit: typeof splitClose; split: typeof splitOpen; changeRefreshInterval: typeof changeRefreshInterval; } type Props = StateProps & DispatchProps & OwnProps; export class UnConnectedExploreToolbar extends PureComponent { constructor(props: Props) { super(props); } onChangeDatasource = async option => { this.props.changeDatasource(this.props.exploreId, option.value); }; onClearAll = () => { this.props.clearAll(this.props.exploreId); }; onRunQuery = () => { return this.props.runQueries(this.props.exploreId); }; onCloseTimePicker = () => { this.props.timepickerRef.current.setState({ isOpen: false }); }; onChangeRefreshInterval = (item: string) => { const { changeRefreshInterval, exploreId } = this.props; changeRefreshInterval(exploreId, item); }; render() { const { datasourceMissing, exploreDatasources, closeSplit, exploreId, loading, range, selectedDatasource, splitted, timepickerRef, refreshInterval, onChangeTime, split, } = this.props; return (
{exploreId === 'left' && ( Explore )}
{splitted && ( closeSplit(exploreId)}> )}
{!datasourceMissing ? (
) : null} {exploreId === 'left' && !splitted ? (
{createResponsiveButton({ splitted, title: 'Split', onClick: split, iconClassName: 'fa fa-fw fa-columns icon-margin-right', iconSide: IconSide.left, })}
) : null}
{refreshInterval && }
{createResponsiveButton({ splitted, title: 'Run Query', onClick: this.onRunQuery, buttonClassName: 'navbar-button--secondary', iconClassName: loading ? 'fa fa-spinner fa-fw fa-spin run-icon' : 'fa fa-level-down fa-fw run-icon', iconSide: IconSide.right, })}
); } } const mapStateToProps = (state: StoreState, { exploreId }: OwnProps): StateProps => { const splitted = state.explore.split; const exploreItem = state.explore[exploreId]; const { datasourceInstance, datasourceMissing, exploreDatasources, queryTransactions, range, refreshInterval, } = exploreItem; const selectedDatasource = datasourceInstance ? exploreDatasources.find(datasource => datasource.name === datasourceInstance.name) : undefined; const loading = queryTransactions.some(qt => !qt.done); return { datasourceMissing, exploreDatasources, loading, range, selectedDatasource, splitted, refreshInterval, }; }; const mapDispatchToProps: DispatchProps = { changeDatasource, changeRefreshInterval, clearAll: clearQueries, runQueries, closeSplit: splitClose, split: splitOpen, }; export const ExploreToolbar = hot(module)( connect( mapStateToProps, mapDispatchToProps )(UnConnectedExploreToolbar) );