From 97f7a7fbba392958a50753d437a8313b0ce89866 Mon Sep 17 00:00:00 2001 From: Johannes Schill Date: Tue, 20 Nov 2018 16:33:26 +0100 Subject: [PATCH] react-panel: Add data source "options". Needs UX, WIP. --- .../dashboard/dashgrid/DataSourceOption.tsx | 31 ++++++++ .../dashboard/dashgrid/EditorTabBody.tsx | 6 +- .../dashboard/dashgrid/QueriesTab.tsx | 74 ++++++++++++++++++- public/app/features/dashboard/panel_model.ts | 1 + 4 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 public/app/features/dashboard/dashgrid/DataSourceOption.tsx diff --git a/public/app/features/dashboard/dashgrid/DataSourceOption.tsx b/public/app/features/dashboard/dashgrid/DataSourceOption.tsx new file mode 100644 index 00000000000..0adfc4abe16 --- /dev/null +++ b/public/app/features/dashboard/dashgrid/DataSourceOption.tsx @@ -0,0 +1,31 @@ +import React, { SFC } from 'react'; +import Tooltip from 'app/core/components/Tooltip/Tooltip'; + +interface Props { + label: string; + placeholder?: string; + name?: string; + value?: string; + onChange?: (evt: any) => void; + tooltipInfo?: any; +} + +export const DataSourceOptions: SFC = ({ label, placeholder, name, value, onChange, tooltipInfo }) => { + const dsOption = ( +
+ + onChange(evt.target.value)} + /> +
+ ); + + return tooltipInfo ? {dsOption} : dsOption; +}; + +export default DataSourceOptions; diff --git a/public/app/features/dashboard/dashgrid/EditorTabBody.tsx b/public/app/features/dashboard/dashgrid/EditorTabBody.tsx index cba75aef979..f9f96b748f7 100644 --- a/public/app/features/dashboard/dashgrid/EditorTabBody.tsx +++ b/public/app/features/dashboard/dashgrid/EditorTabBody.tsx @@ -14,7 +14,7 @@ export interface EditorToolBarView { icon?: string; disabled?: boolean; onClick?: () => void; - render: (closeFunction: any) => JSX.Element; + render: (closeFunction: any) => JSX.Element | JSX.Element[]; } interface State { @@ -42,7 +42,9 @@ export class EditorTabBody extends PureComponent { static getDerivedStateFromProps(props, state) { if (state.openView) { - const activeToolbarItem = props.toolbarItems.find(item => item.title === state.openView.title); + const activeToolbarItem = props.toolbarItems.find( + item => item.title === state.openView.title && item.icon === state.openView.icon + ); if (activeToolbarItem) { return { ...state, diff --git a/public/app/features/dashboard/dashgrid/QueriesTab.tsx b/public/app/features/dashboard/dashgrid/QueriesTab.tsx index 80db1e5fca4..878472094dc 100644 --- a/public/app/features/dashboard/dashgrid/QueriesTab.tsx +++ b/public/app/features/dashboard/dashgrid/QueriesTab.tsx @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; - +import DataSourceOption from './DataSourceOption'; import { getAngularLoader, AngularComponent } from 'app/core/services/AngularLoader'; import { EditorTabBody } from './EditorTabBody'; import { DataSourcePicker } from './DataSourcePicker'; @@ -139,11 +139,71 @@ export class QueriesTab extends PureComponent { } }; + renderOptions = close => { + const { currentDatasource } = this.state; + const { queryOptions } = currentDatasource.meta; + const { panel } = this.props; + + const onChangeFn = (panelKey: string) => { + return (value: string | number) => { + panel[panelKey] = value; + panel.refresh(); + }; + }; + + const allOptions = { + cacheTimeout: { + label: 'Cache timeout', + placeholder: '60', + name: 'cacheTimeout', + value: panel.cacheTimeout, + tooltipInfo: ( + <> + If your time series store has a query cache this option can override the default cache timeout. Specify a + numeric value in seconds. + + ), + }, + maxDataPoints: { + label: 'Max data points', + placeholder: 'auto', + name: 'maxDataPoints', + value: panel.maxDataPoints, + tooltipInfo: ( + <> + The maximum data points the query should return. For graphs this is automatically set to one data point per + pixel. + + ), + }, + minInterval: { + label: 'Min time interval', + placeholder: '0', + name: 'minInterval', + value: panel.interval, + panelKey: 'interval', + tooltipInfo: ( + <> + A lower limit for the auto group by time interval. Recommended to be set to write frequency, for example{' '} + 1m if your data is written every minute. Access auto interval via variable{' '} + $__interval for time range string and $__interval_ms for numeric variable that can + be used in math expressions. + + ), + }, + }; + + return Object.keys(queryOptions).map(key => { + const options = allOptions[key]; + return ; + }); + }; + render() { const { currentDatasource } = this.state; const { helpHtml } = this.state.help; - const { hasQueryHelp } = currentDatasource.meta; - + const { hasQueryHelp, queryOptions } = currentDatasource.meta; + const hasQueryOptions = !!queryOptions; const dsInformation = { title: currentDatasource.name, imgSrc: currentDatasource.meta.info.logos.small, @@ -171,8 +231,14 @@ export class QueriesTab extends PureComponent { render: () => helpHtml, }; + const options = { + title: 'Options', + disabled: !hasQueryOptions, + render: this.renderOptions, + }; + return ( - +
(this.element = element)} style={{ width: '100%' }} /> ); diff --git a/public/app/features/dashboard/panel_model.ts b/public/app/features/dashboard/panel_model.ts index 692edaf666d..9643c23dbc1 100644 --- a/public/app/features/dashboard/panel_model.ts +++ b/public/app/features/dashboard/panel_model.ts @@ -94,6 +94,7 @@ export class PanelModel { isEditing: boolean; hasRefreshed: boolean; events: Emitter; + cacheTimeout?: any; constructor(model) { this.events = new Emitter();