Candlestick: Migrate to schema (#62113)

Co-authored-by: nmarrs <nathanielmarrs@gmail.com>
pull/70364/head
Zoltán Bedi 2 years ago committed by GitHub
parent cc65b4d46a
commit 39433b5b9a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 250
      docs/sources/developers/kinds/composable/candlestick/panelcfg/schema-reference.md
  2. 89
      docs/sources/developers/kinds/composable/candlestickpanelcfg/schema-reference.md
  3. 105
      packages/grafana-schema/src/raw/composable/candlestick/panelcfg/x/CandlestickPanelCfg_types.gen.ts
  4. 26
      pkg/kindsysreport/codegen/report.json
  5. 1
      pkg/plugins/pfs/corelist/corelist_load_gen.go
  6. 1
      public/app/plugins/gen.go
  7. 6
      public/app/plugins/panel/candlestick/CandlestickPanel.tsx
  8. 16
      public/app/plugins/panel/candlestick/fields.test.ts
  9. 6
      public/app/plugins/panel/candlestick/fields.ts
  10. 74
      public/app/plugins/panel/candlestick/models.gen.ts
  11. 17
      public/app/plugins/panel/candlestick/module.tsx
  12. 52
      public/app/plugins/panel/candlestick/panelcfg.cue
  13. 106
      public/app/plugins/panel/candlestick/panelcfg.gen.ts
  14. 4
      public/app/plugins/panel/candlestick/suggestions.ts
  15. 37
      public/app/plugins/panel/candlestick/types.ts
  16. 2
      public/app/plugins/panel/candlestick/utils.ts

@ -0,0 +1,250 @@
---
keywords:
- grafana
- schema
title: CandlestickPanelCfg kind
---
> Both documentation generation and kinds schemas are in active development and subject to change without prior notice.
## CandlestickPanelCfg
#### Maturity: [experimental](../../../maturity/#experimental)
#### Version: 0.0
| Property | Type | Required | Default | Description |
|-----------------------|---------------------------------------|----------|---------|-------------------------------------------------------------|
| `CandleStyle` | string | **Yes** | | Possible values are: `candles`, `ohlcbars`. |
| `CandlestickColors` | [object](#candlestickcolors) | **Yes** | | |
| `CandlestickFieldMap` | [object](#candlestickfieldmap) | **Yes** | | |
| `ColorStrategy` | string | **Yes** | | Possible values are: `open-close`, `close-close`. |
| `FieldConfig` | [GraphFieldConfig](#graphfieldconfig) | **Yes** | | TODO docs |
| `Options` | [object](#options) | **Yes** | | |
| `VizDisplayMode` | string | **Yes** | | Possible values are: `candles+volume`, `candles`, `volume`. |
### CandlestickColors
| Property | Type | Required | Default | Description |
|----------|--------|----------|---------|-------------|
| `down` | string | **Yes** | `red` | |
| `flat` | string | **Yes** | `gray` | |
| `up` | string | **Yes** | `green` | |
### CandlestickFieldMap
| Property | Type | Required | Default | Description |
|----------|--------|----------|---------|------------------------------------------------------------------------------|
| `close` | string | No | | Corresponds to the final (end) value of the given period |
| `high` | string | No | | Corresponds to the highest value of the given period |
| `low` | string | No | | Corresponds to the lowest value of the given period |
| `open` | string | No | | Corresponds to the starting value of the given period |
| `volume` | string | No | | Corresponds to the sample count in the given period. (e.g. number of trades) |
### GraphFieldConfig
TODO docs
It extends [LineConfig](#lineconfig) and [FillConfig](#fillconfig) and [PointsConfig](#pointsconfig) and [AxisConfig](#axisconfig) and [BarConfig](#barconfig) and [StackableFieldConfig](#stackablefieldconfig) and [HideableFieldConfig](#hideablefieldconfig).
| Property | Type | Required | Default | Description |
|---------------------|-----------------------------------------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `axisCenteredZero` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* |
| `axisColorMode` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*<br/>TODO docs<br/>Possible values are: `text`, `series`. |
| `axisGridShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* |
| `axisLabel` | string | No | | *(Inherited from [AxisConfig](#axisconfig))* |
| `axisPlacement` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*<br/>TODO docs<br/>Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. |
| `axisSoftMax` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* |
| `axisSoftMin` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* |
| `axisWidth` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* |
| `barAlignment` | integer | No | | *(Inherited from [BarConfig](#barconfig))*<br/>TODO docs<br/>Possible values are: `-1`, `0`, `1`. |
| `barMaxWidth` | number | No | | *(Inherited from [BarConfig](#barconfig))* |
| `barWidthFactor` | number | No | | *(Inherited from [BarConfig](#barconfig))* |
| `drawStyle` | string | No | | TODO docs<br/>Possible values are: `line`, `bars`, `points`. |
| `fillBelowTo` | string | No | | *(Inherited from [FillConfig](#fillconfig))* |
| `fillColor` | string | No | | *(Inherited from [FillConfig](#fillconfig))* |
| `fillOpacity` | number | No | | *(Inherited from [FillConfig](#fillconfig))* |
| `gradientMode` | string | No | | TODO docs<br/>Possible values are: `none`, `opacity`, `hue`, `scheme`. |
| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [HideableFieldConfig](#hideablefieldconfig))*<br/>TODO docs |
| `lineColor` | string | No | | *(Inherited from [LineConfig](#lineconfig))* |
| `lineInterpolation` | string | No | | *(Inherited from [LineConfig](#lineconfig))*<br/>TODO docs<br/>Possible values are: `linear`, `smooth`, `stepBefore`, `stepAfter`. |
| `lineStyle` | [LineStyle](#linestyle) | No | | *(Inherited from [LineConfig](#lineconfig))*<br/>TODO docs |
| `lineWidth` | number | No | | *(Inherited from [LineConfig](#lineconfig))* |
| `pointColor` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))* |
| `pointSize` | number | No | | *(Inherited from [PointsConfig](#pointsconfig))* |
| `pointSymbol` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))* |
| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | *(Inherited from [AxisConfig](#axisconfig))*<br/>TODO docs |
| `showPoints` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))*<br/>TODO docs<br/>Possible values are: `auto`, `never`, `always`. |
| `spanNulls` | | No | | *(Inherited from [LineConfig](#lineconfig))*<br/>Indicate if null values should be treated as gaps or connected.<br/>When the value is a number, it represents the maximum delta in the<br/>X axis that should be considered connected. For timeseries, this is milliseconds |
| `stacking` | [StackingConfig](#stackingconfig) | No | | *(Inherited from [StackableFieldConfig](#stackablefieldconfig))*<br/>TODO docs |
| `thresholdsStyle` | [GraphThresholdsStyleConfig](#graphthresholdsstyleconfig) | No | | TODO docs |
| `transform` | string | No | | TODO docs<br/>Possible values are: `constant`, `negative-Y`. |
### AxisConfig
TODO docs
| Property | Type | Required | Default | Description |
|---------------------|-----------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------|
| `axisCenteredZero` | boolean | No | | |
| `axisColorMode` | string | No | | TODO docs<br/>Possible values are: `text`, `series`. |
| `axisGridShow` | boolean | No | | |
| `axisLabel` | string | No | | |
| `axisPlacement` | string | No | | TODO docs<br/>Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. |
| `axisSoftMax` | number | No | | |
| `axisSoftMin` | number | No | | |
| `axisWidth` | number | No | | |
| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | TODO docs |
### ScaleDistributionConfig
TODO docs
| Property | Type | Required | Default | Description |
|-------------------|--------|----------|---------|--------------------------------------------------------------------------|
| `type` | string | **Yes** | | TODO docs<br/>Possible values are: `linear`, `log`, `ordinal`, `symlog`. |
| `linearThreshold` | number | No | | |
| `log` | number | No | | |
### BarConfig
TODO docs
| Property | Type | Required | Default | Description |
|------------------|---------|----------|---------|----------------------------------------------------|
| `barAlignment` | integer | No | | TODO docs<br/>Possible values are: `-1`, `0`, `1`. |
| `barMaxWidth` | number | No | | |
| `barWidthFactor` | number | No | | |
### FillConfig
TODO docs
| Property | Type | Required | Default | Description |
|---------------|--------|----------|---------|-------------|
| `fillBelowTo` | string | No | | |
| `fillColor` | string | No | | |
| `fillOpacity` | number | No | | |
### GraphThresholdsStyleConfig
TODO docs
| Property | Type | Required | Default | Description |
|----------|--------|----------|---------|-----------------------------------------------------------------------------------------------------------|
| `mode` | string | **Yes** | | TODO docs<br/>Possible values are: `off`, `line`, `dashed`, `area`, `line+area`, `dashed+area`, `series`. |
### HideSeriesConfig
TODO docs
| Property | Type | Required | Default | Description |
|-----------|---------|----------|---------|-------------|
| `legend` | boolean | **Yes** | | |
| `tooltip` | boolean | **Yes** | | |
| `viz` | boolean | **Yes** | | |
### HideableFieldConfig
TODO docs
| Property | Type | Required | Default | Description |
|------------|---------------------------------------|----------|---------|-------------|
| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs |
### LineConfig
TODO docs
| Property | Type | Required | Default | Description |
|---------------------|-------------------------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `lineColor` | string | No | | |
| `lineInterpolation` | string | No | | TODO docs<br/>Possible values are: `linear`, `smooth`, `stepBefore`, `stepAfter`. |
| `lineStyle` | [LineStyle](#linestyle) | No | | TODO docs |
| `lineWidth` | number | No | | |
| `spanNulls` | | No | | Indicate if null values should be treated as gaps or connected.<br/>When the value is a number, it represents the maximum delta in the<br/>X axis that should be considered connected. For timeseries, this is milliseconds |
### LineStyle
TODO docs
| Property | Type | Required | Default | Description |
|----------|----------|----------|---------|--------------------------------------------------------|
| `dash` | number[] | No | | |
| `fill` | string | No | | Possible values are: `solid`, `dash`, `dot`, `square`. |
### PointsConfig
TODO docs
| Property | Type | Required | Default | Description |
|---------------|--------|----------|---------|---------------------------------------------------------------|
| `pointColor` | string | No | | |
| `pointSize` | number | No | | |
| `pointSymbol` | string | No | | |
| `showPoints` | string | No | | TODO docs<br/>Possible values are: `auto`, `never`, `always`. |
### StackableFieldConfig
TODO docs
| Property | Type | Required | Default | Description |
|------------|-----------------------------------|----------|---------|-------------|
| `stacking` | [StackingConfig](#stackingconfig) | No | | TODO docs |
### StackingConfig
TODO docs
| Property | Type | Required | Default | Description |
|----------|--------|----------|---------|-----------------------------------------------------------------|
| `group` | string | No | | |
| `mode` | string | No | | TODO docs<br/>Possible values are: `none`, `normal`, `percent`. |
### Options
It extends [OptionsWithLegend](#optionswithlegend).
| Property | Type | Required | Default | Description |
|--------------------|-----------------------------------------|----------|---------|--------------------------------------------------------------------------|
| `candleStyle` | string | **Yes** | | Sets the style of the candlesticks |
| `colorStrategy` | string | **Yes** | | Sets the color strategy for the candlesticks |
| `colors` | [CandlestickColors](#candlestickcolors) | **Yes** | | |
| `fields` | [object](#fields) | **Yes** | `map[]` | Map fields to appropriate dimension |
| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | *(Inherited from [OptionsWithLegend](#optionswithlegend))*<br/>TODO docs |
| `mode` | string | **Yes** | | Sets which dimensions are used for the visualization |
| `includeAllFields` | boolean | No | `false` | When enabled, all fields will be sent to the graph |
### OptionsWithLegend
TODO docs
| Property | Type | Required | Default | Description |
|----------|---------------------------------------|----------|---------|-------------|
| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | TODO docs |
### VizLegendOptions
TODO docs
| Property | Type | Required | Default | Description |
|---------------|----------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `calcs` | string[] | **Yes** | | |
| `displayMode` | string | **Yes** | | TODO docs<br/>Note: "hidden" needs to remain as an option for plugins compatibility<br/>Possible values are: `list`, `table`, `hidden`. |
| `placement` | string | **Yes** | | TODO docs<br/>Possible values are: `bottom`, `right`. |
| `showLegend` | boolean | **Yes** | | |
| `asTable` | boolean | No | | |
| `isVisible` | boolean | No | | |
| `sortBy` | string | No | | |
| `sortDesc` | boolean | No | | |
| `width` | number | No | | |
### Fields
Map fields to appropriate dimension
| Property | Type | Required | Default | Description |
|----------|-----------------------------------|----------|---------|-------------|
| `object` | Possible types are: [](#), [](#). | | |

@ -0,0 +1,89 @@
---
keywords:
- grafana
- schema
title: CandlestickPanelCfg kind
---
> Both documentation generation and kinds schemas are in active development and subject to change without prior notice.
# CandlestickPanelCfg kind
## Maturity: experimental
## Version: 0.0
## Properties
| Property | Type | Required | Description |
|-----------------------|--------------------------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `CandleStyle` | string | **Yes** | TODO docs Possible values are: `candles`, `ohlcbars`. |
| `CandlestickColors` | [object](#candlestickcolors) | **Yes** | TODO docs |
| `CandlestickFieldMap` | [object](#candlestickfieldmap) | **Yes** | TODO docs |
| `ColorStrategy` | string | **Yes** | TODO docs<br/>"open-close": up/down color depends on current close vs current open<br/>filled always<br/>"close-close": up/down color depends on current close vs prior close<br/>filled/hollow depends on current close vs current open Possible values are: `open-close`, `close-close`. |
| `PanelFieldConfig` | [object](#panelfieldconfig) | **Yes** | |
| `PanelOptions` | [object](#paneloptions) | **Yes** | |
| `VizDisplayMode` | string | **Yes** | TODO docs Possible values are: `candles+volume`, `candles`, `volume`. |
## CandlestickColors
TODO docs
### Properties
| Property | Type | Required | Description |
|----------|--------|----------|-------------------|
| `down` | string | **Yes** | Default: `red`. |
| `flat` | string | **Yes** | Default: `gray`. |
| `up` | string | **Yes** | Default: `green`. |
## CandlestickFieldMap
TODO docs
### Properties
| Property | Type | Required | Description |
|----------|--------|----------|-------------|
| `close` | string | No | |
| `high` | string | No | |
| `low` | string | No | |
| `open` | string | No | |
| `volume` | string | No | |
## PanelFieldConfig
| Property | Type | Required | Description |
|----------|------|----------|-------------|
## PanelOptions
### Properties
| Property | Type | Required | Description |
|--------------------|-----------------------------------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `candleStyle` | string | No | TODO docs Possible values are: `candles`, `ohlcbars`. |
| `colorStrategy` | string | No | TODO docs<br/>"open-close": up/down color depends on current close vs current open<br/>filled always<br/>"close-close": up/down color depends on current close vs prior close<br/>filled/hollow depends on current close vs current open Possible values are: `open-close`, `close-close`. |
| `colors` | [CandlestickColors](#candlestickcolors) | No | TODO docs |
| `fields` | [object](#fields) | No | TODO docs Default: `map[]`. |
| `includeAllFields` | boolean | No | When enabled, all fields will be sent to the graph Default: `false`. |
| `mode` | string | No | TODO docs Possible values are: `candles+volume`, `candles`, `volume`. |
### CandlestickColors
TODO docs
#### Properties
| Property | Type | Required | Description |
|----------|--------|----------|-------------------|
| `down` | string | **Yes** | Default: `red`. |
| `flat` | string | **Yes** | Default: `gray`. |
| `up` | string | **Yes** | Default: `green`. |
### fields
TODO docs
The default value is: `map[]`.
| Property | Type | Required | Description |
|----------|------|----------|-------------|

@ -0,0 +1,105 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// public/app/plugins/gen.go
// Using jennies:
// TSTypesJenny
// LatestMajorsOrXJenny
// PluginEachMajorJenny
//
// Run 'make gen-cue' from repository root to regenerate.
import * as common from '@grafana/schema';
export enum VizDisplayMode {
Candles = 'candles',
CandlesVolume = 'candles+volume',
Volume = 'volume',
}
export enum CandleStyle {
Candles = 'candles',
OHLCBars = 'ohlcbars',
}
export enum ColorStrategy {
CloseClose = 'close-close',
OpenClose = 'open-close',
}
export interface CandlestickFieldMap {
/**
* Corresponds to the final (end) value of the given period
*/
close?: string;
/**
* Corresponds to the highest value of the given period
*/
high?: string;
/**
* Corresponds to the lowest value of the given period
*/
low?: string;
/**
* Corresponds to the starting value of the given period
*/
open?: string;
/**
* Corresponds to the sample count in the given period. (e.g. number of trades)
*/
volume?: string;
}
export interface CandlestickColors {
down: string;
flat: string;
up: string;
}
export const defaultCandlestickColors: Partial<CandlestickColors> = {
down: 'red',
flat: 'gray',
up: 'green',
};
export interface Options extends common.OptionsWithLegend {
/**
* Sets the style of the candlesticks
*/
candleStyle: CandleStyle;
/**
* Sets the color strategy for the candlesticks
*/
colorStrategy: ColorStrategy;
/**
* Set which colors are used when the price movement is up or down
*/
colors: CandlestickColors;
/**
* Map fields to appropriate dimension
*/
fields: CandlestickFieldMap;
/**
* When enabled, all fields will be sent to the graph
*/
includeAllFields?: boolean;
/**
* Sets which dimensions are used for the visualization
*/
mode: VizDisplayMode;
}
export const defaultOptions: Partial<Options> = {
candleStyle: CandleStyle.Candles,
colorStrategy: ColorStrategy.OpenClose,
colors: {
down: 'red',
up: 'green',
flat: 'gray',
},
fields: {},
includeAllFields: false,
mode: VizDisplayMode.CandlesVolume,
};
export interface FieldConfig extends common.GraphFieldConfig {}

@ -263,6 +263,30 @@
"pluralName": "BarGaugePanelCfgs",
"schemaInterface": "PanelCfg"
},
"candlestickpanelcfg": {
"category": "composable",
"codeowners": [
"grafana/grafana-edge-squad"
],
"currentVersion": [
0,
0
],
"grafanaMaturityCount": 0,
"lineageIsGroup": true,
"links": {
"docs": "https://grafana.com/docs/grafana/next/developers/kinds/composable/candlestickpanelcfg/schema-reference",
"go": "n/a",
"schema": "https://github.com/grafana/grafana/tree/main/public/app/plugins/panel/candlestick/panelcfg.cue",
"ts": "https://github.com/grafana/grafana/tree/main/public/app/plugins/panel/candlestick/panelcfg.gen.ts"
},
"machineName": "candlestickpanelcfg",
"maturity": "experimental",
"name": "CandlestickPanelCfg",
"pluralMachineName": "candlestickpanelcfgs",
"pluralName": "CandlestickPanelCfgs",
"schemaInterface": "PanelCfg"
},
"cloudwatchdataquery": {
"category": "composable",
"codeowners": [
@ -2087,6 +2111,7 @@
"azuremonitordatasourcecfg",
"barchartpanelcfg",
"bargaugepanelcfg",
"candlestickpanelcfg",
"cloudwatchdataquery",
"cloudwatchdatasourcecfg",
"dashboarddataquery",
@ -2181,6 +2206,7 @@
"annotationslistpanelcfg",
"barchartpanelcfg",
"bargaugepanelcfg",
"candlestickpanelcfg",
"cloudwatchdataquery",
"dashboard",
"dashboardlistpanelcfg",

@ -56,6 +56,7 @@ func corePlugins(rt *thema.Runtime) []pfs.ParsedPlugin {
parsePluginOrPanic("public/app/plugins/panel/annolist", "annolist", rt),
parsePluginOrPanic("public/app/plugins/panel/barchart", "barchart", rt),
parsePluginOrPanic("public/app/plugins/panel/bargauge", "bargauge", rt),
parsePluginOrPanic("public/app/plugins/panel/candlestick", "candlestick", rt),
parsePluginOrPanic("public/app/plugins/panel/canvas", "canvas", rt),
parsePluginOrPanic("public/app/plugins/panel/dashlist", "dashlist", rt),
parsePluginOrPanic("public/app/plugins/panel/datagrid", "datagrid", rt),

@ -24,7 +24,6 @@ import (
)
var skipPlugins = map[string]bool{
"candlestick": true,
"influxdb": true, // plugin.json fails validation (defaultMatchFormat)
"mixed": true, // plugin.json fails validation (mixed)
"opentsdb": true, // plugin.json fails validation (defaultMatchFormat)

@ -21,10 +21,10 @@ import { OutsideRangePlugin } from '../timeseries/plugins/OutsideRangePlugin';
import { ThresholdControlsPlugin } from '../timeseries/plugins/ThresholdControlsPlugin';
import { prepareCandlestickFields } from './fields';
import { CandlestickOptions, defaultColors, VizDisplayMode } from './models.gen';
import { Options, defaultCandlestickColors, VizDisplayMode } from './types';
import { drawMarkers, FieldIndices } from './utils';
interface CandlestickPanelProps extends PanelProps<CandlestickOptions> {}
interface CandlestickPanelProps extends PanelProps<Options> {}
export const CandlestickPanel = ({
data,
@ -76,7 +76,7 @@ export const CandlestickPanel = ({
}
const { mode, candleStyle, colorStrategy } = options;
const colors = { ...defaultColors, ...options.colors };
const colors = { ...defaultCandlestickColors, ...options.colors };
let { open, high, low, close, volume } = fieldMap; // names from matched fields
if (open == null || close == null) {

@ -1,12 +1,12 @@
import { createTheme, toDataFrame } from '@grafana/data';
import { prepareCandlestickFields } from './fields';
import { CandlestickOptions, VizDisplayMode } from './models.gen';
import { Options, VizDisplayMode } from './types';
const theme = createTheme();
describe('Candlestick data', () => {
const options: CandlestickOptions = {} as CandlestickOptions;
const options = {} as Options;
it('require a time field', () => {
const info = prepareCandlestickFields(
@ -122,10 +122,10 @@ describe('Candlestick data', () => {
});
it('will unmap high & low fields in volume-only mode', () => {
const options: CandlestickOptions = {
const options = {
mode: VizDisplayMode.Volume,
includeAllFields: true,
} as CandlestickOptions;
} as Options;
const info = prepareCandlestickFields(
[
@ -184,10 +184,10 @@ describe('Candlestick data', () => {
});
it('will unmap volume field in candles-only mode', () => {
const options: CandlestickOptions = {
const options = {
mode: VizDisplayMode.Candles,
includeAllFields: false,
} as CandlestickOptions;
} as Options;
const info = prepareCandlestickFields(
[
@ -246,10 +246,10 @@ describe('Candlestick data', () => {
});
it("will not remove open field from frame when it's also mapped to high in volume-only mode", () => {
const options: CandlestickOptions = {
const options = {
mode: VizDisplayMode.Volume,
includeAllFields: false,
} as CandlestickOptions;
} as Options;
const info = prepareCandlestickFields(
[

@ -12,7 +12,7 @@ import { findField } from 'app/features/dimensions';
import { prepareGraphableFields } from '../timeseries/utils';
import { CandlestickOptions, CandlestickFieldMap, VizDisplayMode } from './models.gen';
import { Options, CandlestickFieldMap, VizDisplayMode } from './types';
export interface FieldPickerInfo {
/** property name */
@ -96,7 +96,7 @@ function findFieldOrAuto(frame: DataFrame, info: FieldPickerInfo, options: Candl
export function prepareCandlestickFields(
series: DataFrame[] | undefined,
options: CandlestickOptions,
options: Partial<Options>,
theme: GrafanaTheme2,
timeRange?: TimeRange
): CandlestickData | null {
@ -119,7 +119,7 @@ export function prepareCandlestickFields(
const data: CandlestickData = { aligned, frame: aligned, names: {} };
// Apply same filter as everythign else in timeseries
// Apply same filter as everything else in timeseries
const timeSeriesFrames = prepareGraphableFields([aligned], theme, timeRange);
if (!timeSeriesFrames) {
return null;

@ -1,74 +0,0 @@
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// NOTE: This file will be auto generated from models.cue
// It is currenty hand written but will serve as the target for cuetsy
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import { LegendDisplayMode, OptionsWithLegend } from '@grafana/schema';
export const modelVersion = Object.freeze([1, 0]);
export enum VizDisplayMode {
CandlesVolume = 'candles+volume',
Candles = 'candles',
Volume = 'volume',
}
export enum CandleStyle {
Candles = 'candles',
OHLCBars = 'ohlcbars',
}
export enum ColorStrategy {
// up/down color depends on current close vs current open
// filled always
OpenClose = 'open-close',
// up/down color depends on current close vs prior close
// filled/hollow depends on current close vs current open
CloseClose = 'close-close',
}
export interface CandlestickFieldMap {
open?: string;
high?: string;
low?: string;
close?: string;
volume?: string;
}
export interface CandlestickColors {
up: string;
down: string;
flat: string;
}
export const defaultColors: CandlestickColors = {
up: 'green',
down: 'red',
flat: 'gray',
};
export interface CandlestickOptions extends OptionsWithLegend {
mode: VizDisplayMode;
candleStyle: CandleStyle;
colorStrategy: ColorStrategy;
fields: CandlestickFieldMap;
colors: CandlestickColors;
// When enabled, all fields will be sent to the graph
includeAllFields?: boolean;
}
export const defaultOptions: CandlestickOptions = {
mode: VizDisplayMode.CandlesVolume,
candleStyle: CandleStyle.Candles,
colorStrategy: ColorStrategy.OpenClose,
colors: defaultColors,
fields: {},
legend: {
displayMode: LegendDisplayMode.List,
showLegend: true,
placement: 'bottom',
calcs: [],
},
includeAllFields: false,
};

@ -14,15 +14,8 @@ import { defaultGraphConfig, getGraphFieldConfig } from '../timeseries/config';
import { CandlestickPanel } from './CandlestickPanel';
import { CandlestickData, candlestickFieldsInfo, FieldPickerInfo, prepareCandlestickFields } from './fields';
import {
defaultColors,
CandlestickOptions,
VizDisplayMode,
ColorStrategy,
defaultOptions,
CandleStyle,
} from './models.gen';
import { CandlestickSuggestionsSupplier } from './suggestions';
import { defaultCandlestickColors, defaultOptions, Options, VizDisplayMode, ColorStrategy, CandleStyle } from './types';
const modeOptions = [
{ label: 'Candles', value: VizDisplayMode.Candles },
@ -43,7 +36,7 @@ const colorStrategies = [
const numericFieldFilter = (f: Field) => f.type === FieldType.number;
function addFieldPicker(
builder: PanelOptionsEditorBuilder<CandlestickOptions>,
builder: PanelOptionsEditorBuilder<Options>,
info: FieldPickerInfo,
data: CandlestickData | null
) {
@ -74,7 +67,7 @@ function addFieldPicker(
});
}
export const plugin = new PanelPlugin<CandlestickOptions, GraphFieldConfig>(CandlestickPanel)
export const plugin = new PanelPlugin<Options, GraphFieldConfig>(CandlestickPanel)
.useFieldConfig(getGraphFieldConfig(defaultGraphConfig))
.setPanelOptions((builder, context) => {
const opts = context.options ?? defaultOptions;
@ -112,12 +105,12 @@ export const plugin = new PanelPlugin<CandlestickOptions, GraphFieldConfig>(Cand
.addColorPicker({
path: 'colors.up',
name: 'Up color',
defaultValue: defaultColors.up,
defaultValue: defaultCandlestickColors.up,
})
.addColorPicker({
path: 'colors.down',
name: 'Down color',
defaultValue: defaultColors.down,
defaultValue: defaultCandlestickColors.down,
});
addFieldPicker(builder, candlestickFieldsInfo.open, info);

@ -1,4 +1,4 @@
// Copyright 2021 Grafana Labs
// Copyright 2023 Grafana Labs
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@ -14,17 +14,57 @@
package grafanaplugin
composableKinds: PanelCfg: lineage: {
import (
"github.com/grafana/grafana/packages/grafana-schema/src/common"
)
composableKinds: PanelCfg: {
maturity: "experimental"
lineage: {
schemas: [{
version: [0, 0]
schema: {
Options: {
...
VizDisplayMode: "candles+volume" | "candles" | "volume" @cuetsy(kind="enum", memberNames="CandlesVolume|Candles|Volume")
CandleStyle: "candles" | "ohlcbars" @cuetsy(kind="enum", memberNames="Candles|OHLCBars")
ColorStrategy: "open-close" | "close-close" @cuetsy(kind="enum", memberNames="OpenClose|CloseClose")
CandlestickFieldMap: {
// Corresponds to the starting value of the given period
open?: string
// Corresponds to the highest value of the given period
high?: string
// Corresponds to the lowest value of the given period
low?: string
// Corresponds to the final (end) value of the given period
close?: string
// Corresponds to the sample count in the given period. (e.g. number of trades)
volume?: string
} @cuetsy(kind="interface")
FieldConfig: {
...
CandlestickColors: {
up: string | *"green"
down: string | *"red"
flat: string | *"gray"
} @cuetsy(kind="interface")
Options: {
common.OptionsWithLegend
// Sets which dimensions are used for the visualization
mode: VizDisplayMode & (*"candles+volume" | _)
// Sets the style of the candlesticks
candleStyle: CandleStyle & (*"candles" | _)
// Sets the color strategy for the candlesticks
colorStrategy: ColorStrategy & (*"open-close" | _)
// Map fields to appropriate dimension
fields: CandlestickFieldMap | *{}
// Set which colors are used when the price movement is up or down
colors: CandlestickColors | *{down: "red", up: "green", flat: "gray"}
// When enabled, all fields will be sent to the graph
includeAllFields?: bool | *false
} @cuetsy(kind="interface")
FieldConfig: common.GraphFieldConfig & {} @cuetsy(kind="interface")
}
}]
lenses: []
}
}

@ -0,0 +1,106 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// public/app/plugins/gen.go
// Using jennies:
// TSTypesJenny
// PluginTSTypesJenny
//
// Run 'make gen-cue' from repository root to regenerate.
import * as common from '@grafana/schema';
export const PanelCfgModelVersion = Object.freeze([0, 0]);
export enum VizDisplayMode {
Candles = 'candles',
CandlesVolume = 'candles+volume',
Volume = 'volume',
}
export enum CandleStyle {
Candles = 'candles',
OHLCBars = 'ohlcbars',
}
export enum ColorStrategy {
CloseClose = 'close-close',
OpenClose = 'open-close',
}
export interface CandlestickFieldMap {
/**
* Corresponds to the final (end) value of the given period
*/
close?: string;
/**
* Corresponds to the highest value of the given period
*/
high?: string;
/**
* Corresponds to the lowest value of the given period
*/
low?: string;
/**
* Corresponds to the starting value of the given period
*/
open?: string;
/**
* Corresponds to the sample count in the given period. (e.g. number of trades)
*/
volume?: string;
}
export interface CandlestickColors {
down: string;
flat: string;
up: string;
}
export const defaultCandlestickColors: Partial<CandlestickColors> = {
down: 'red',
flat: 'gray',
up: 'green',
};
export interface Options extends common.OptionsWithLegend {
/**
* Sets the style of the candlesticks
*/
candleStyle: CandleStyle;
/**
* Sets the color strategy for the candlesticks
*/
colorStrategy: ColorStrategy;
/**
* Set which colors are used when the price movement is up or down
*/
colors: CandlestickColors;
/**
* Map fields to appropriate dimension
*/
fields: CandlestickFieldMap;
/**
* When enabled, all fields will be sent to the graph
*/
includeAllFields?: boolean;
/**
* Sets which dimensions are used for the visualization
*/
mode: VizDisplayMode;
}
export const defaultOptions: Partial<Options> = {
candleStyle: CandleStyle.Candles,
colorStrategy: ColorStrategy.OpenClose,
colors: {
down: 'red',
up: 'green',
flat: 'gray',
},
fields: {},
includeAllFields: false,
mode: VizDisplayMode.CandlesVolume,
};
export interface FieldConfig extends common.GraphFieldConfig {}

@ -3,7 +3,7 @@ import { config } from '@grafana/runtime';
import { SuggestionName } from 'app/types/suggestions';
import { prepareCandlestickFields } from './fields';
import { CandlestickOptions, defaultOptions } from './models.gen';
import { defaultOptions, Options } from './types';
export class CandlestickSuggestionsSupplier {
getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {
@ -29,7 +29,7 @@ export class CandlestickSuggestionsSupplier {
return;
}
const list = builder.getListAppender<CandlestickOptions, {}>({
const list = builder.getListAppender<Options, {}>({
name: '',
pluginId: 'candlestick',
options: {},

@ -0,0 +1,37 @@
import { LegendDisplayMode } from '@grafana/schema';
import {
defaultOptions as defaultOptionsBase,
defaultCandlestickColors,
Options,
CandlestickColors,
CandleStyle,
ColorStrategy,
VizDisplayMode,
CandlestickFieldMap,
FieldConfig,
PanelCfgModelVersion,
} from './panelcfg.gen';
export const defaultOptions: Partial<Options> = {
...defaultOptionsBase,
// TODO: This should be included in the cue schema in the future.
legend: {
displayMode: LegendDisplayMode.List,
showLegend: true,
placement: 'bottom',
calcs: [],
},
};
export {
Options,
CandlestickColors,
defaultCandlestickColors,
CandleStyle,
ColorStrategy,
VizDisplayMode,
CandlestickFieldMap,
FieldConfig,
PanelCfgModelVersion,
};

@ -2,7 +2,7 @@ import uPlot from 'uplot';
import { colorManipulator } from '@grafana/data';
import { VizDisplayMode, ColorStrategy, CandleStyle } from './models.gen';
import { VizDisplayMode, ColorStrategy, CandleStyle } from './types';
const { alpha } = colorManipulator;

Loading…
Cancel
Save