grafana/public/app/features/datasources/DataSourcesListPage.tsx

111 lines
3.5 KiB
TypeScript
Raw Normal View History

import React, { PureComponent } from 'react';
import { connect } from 'react-redux';
import { hot } from 'react-hot-loader';
2019-01-08 01:38:43 -06:00
import Page from 'app/core/components/Page/Page';
import OrgActionBar from 'app/core/components/OrgActionBar/OrgActionBar';
import EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';
import DataSourcesList from './DataSourcesList';
import { DataSource, NavModel, StoreState } from 'app/types';
2019-01-08 01:38:43 -06:00
import { LayoutMode } from 'app/core/components/LayoutSelector/LayoutSelector';
2018-10-03 02:43:10 -05:00
import { loadDataSources, setDataSourcesLayoutMode, setDataSourcesSearchQuery } from './state/actions';
2019-01-08 01:38:43 -06:00
import { getNavModel } from 'app/core/selectors/navModel';
2018-10-03 02:43:10 -05:00
import {
getDataSources,
getDataSourcesCount,
getDataSourcesLayoutMode,
getDataSourcesSearchQuery,
} from './state/selectors';
export interface Props {
navModel: NavModel;
dataSources: DataSource[];
2018-09-28 04:29:18 -05:00
dataSourcesCount: number;
layoutMode: LayoutMode;
2018-10-03 02:43:10 -05:00
searchQuery: string;
2018-10-11 04:49:34 -05:00
hasFetched: boolean;
loadDataSources: typeof loadDataSources;
2018-10-03 02:43:10 -05:00
setDataSourcesLayoutMode: typeof setDataSourcesLayoutMode;
setDataSourcesSearchQuery: typeof setDataSourcesSearchQuery;
}
const emptyListModel = {
title: 'There are no data sources defined yet',
buttonIcon: 'gicon gicon-add-datasources',
buttonLink: 'datasources/new',
buttonTitle: 'Add data source',
proTip: 'You can also define data sources through configuration files.',
proTipLink: 'http://docs.grafana.org/administration/provisioning/#datasources?utm_source=grafana_ds_list',
proTipLinkTitle: 'Learn more',
proTipTarget: '_blank',
};
export class DataSourcesListPage extends PureComponent<Props> {
componentDidMount() {
this.fetchDataSources();
}
async fetchDataSources() {
return await this.props.loadDataSources();
}
render() {
2018-10-03 02:43:10 -05:00
const {
dataSources,
dataSourcesCount,
navModel,
layoutMode,
searchQuery,
setDataSourcesSearchQuery,
setDataSourcesLayoutMode,
2018-10-11 04:49:34 -05:00
hasFetched,
2018-10-03 02:43:10 -05:00
} = this.props;
const linkButton = {
href: 'datasources/new',
title: 'Add data source',
};
return (
<Page title="Configuration: Data Sources">
2019-01-08 01:38:43 -06:00
<Page.Header model={navModel} />
<Page.Contents isLoading={!hasFetched}>
<>
{hasFetched && dataSourcesCount === 0 && <EmptyListCTA model={emptyListModel} />}
{hasFetched &&
dataSourcesCount > 0 && [
<OrgActionBar
layoutMode={layoutMode}
searchQuery={searchQuery}
onSetLayoutMode={mode => setDataSourcesLayoutMode(mode)}
setSearchQuery={query => setDataSourcesSearchQuery(query)}
linkButton={linkButton}
key="action-bar"
/>,
<DataSourcesList dataSources={dataSources} layoutMode={layoutMode} key="list" />,
]}
</>
</Page.Contents>
</Page>
);
}
}
function mapStateToProps(state: StoreState) {
return {
navModel: getNavModel(state.navIndex, 'datasources'),
dataSources: getDataSources(state.dataSources),
layoutMode: getDataSourcesLayoutMode(state.dataSources),
2018-09-28 04:29:18 -05:00
dataSourcesCount: getDataSourcesCount(state.dataSources),
2018-10-03 02:43:10 -05:00
searchQuery: getDataSourcesSearchQuery(state.dataSources),
2018-10-11 04:49:34 -05:00
hasFetched: state.dataSources.hasFetched,
};
}
const mapDispatchToProps = {
loadDataSources,
2018-10-03 02:43:10 -05:00
setDataSourcesSearchQuery,
setDataSourcesLayoutMode,
};
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(DataSourcesListPage));