mirror of https://github.com/grafana/grafana
Table: migrate old-table config to new table config (#30142)
* feat(tablepanel): add migration button to old table panel config * feat(tablepanel): migrate old table transformations * feat(tablepanel): migrate old styles to config overrides * feat(tablepanel): migrate catch all style override to panel defaults * refactor(tablepanel): clean up typings * refactor(tablepanel): base threshold as -Infinity * feat(tablepanel): migrate align to new table config overrides * feat(tablepanel): migrate links to new table overrides * refactor(tabelpanel): clean up threshold migrations * feat(tablepanel): introduce table transform to merge * feat(tablepanel): add note informing user to manually update links with cell valuespull/30302/head
parent
5088e2044a
commit
c14c7b6874
@ -0,0 +1,219 @@ |
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP |
||||||
|
|
||||||
|
exports[`Table Migrations migrates styles to field config overrides and defaults 1`] = ` |
||||||
|
Object { |
||||||
|
"fieldConfig": Object { |
||||||
|
"defaults": Object { |
||||||
|
"custom": Object { |
||||||
|
"align": "right", |
||||||
|
"displayMode": undefined, |
||||||
|
}, |
||||||
|
"decimals": 2, |
||||||
|
"displayName": "", |
||||||
|
"unit": "short", |
||||||
|
}, |
||||||
|
"overrides": Array [ |
||||||
|
Object { |
||||||
|
"matcher": Object { |
||||||
|
"id": "byName", |
||||||
|
"options": "Time", |
||||||
|
}, |
||||||
|
"properties": Array [ |
||||||
|
Object { |
||||||
|
"id": "displayName", |
||||||
|
"value": "Time", |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"id": "unit", |
||||||
|
"value": "time: YYYY-MM-DD HH:mm:ss", |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"id": "custom.align", |
||||||
|
"value": null, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"matcher": Object { |
||||||
|
"id": "byName", |
||||||
|
"options": "ColorCell", |
||||||
|
}, |
||||||
|
"properties": Array [ |
||||||
|
Object { |
||||||
|
"id": "unit", |
||||||
|
"value": "currencyUSD", |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"id": "decimals", |
||||||
|
"value": 2, |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"id": "custom.displayMode", |
||||||
|
"value": "color-background", |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"id": "custom.align", |
||||||
|
"value": "left", |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"id": "thresholds", |
||||||
|
"value": Object { |
||||||
|
"mode": "absolute", |
||||||
|
"steps": Array [ |
||||||
|
Object { |
||||||
|
"color": "rgba(245, 54, 54, 0.9)", |
||||||
|
"value": -Infinity, |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"color": "rgba(237, 129, 40, 0.89)", |
||||||
|
"value": 5, |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"color": "rgba(50, 172, 45, 0.97)", |
||||||
|
"value": 10, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"matcher": Object { |
||||||
|
"id": "byName", |
||||||
|
"options": "ColorValue", |
||||||
|
}, |
||||||
|
"properties": Array [ |
||||||
|
Object { |
||||||
|
"id": "unit", |
||||||
|
"value": "Bps", |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"id": "decimals", |
||||||
|
"value": 2, |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"id": "links", |
||||||
|
"value": Array [ |
||||||
|
Object { |
||||||
|
"targetBlank": true, |
||||||
|
"title": "", |
||||||
|
"url": "http://www.grafana.com", |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"id": "custom.displayMode", |
||||||
|
"value": "color-text", |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"id": "custom.align", |
||||||
|
"value": null, |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"id": "thresholds", |
||||||
|
"value": Object { |
||||||
|
"mode": "absolute", |
||||||
|
"steps": Array [ |
||||||
|
Object { |
||||||
|
"color": "rgba(245, 54, 54, 0.9)", |
||||||
|
"value": -Infinity, |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"color": "rgba(237, 129, 40, 0.89)", |
||||||
|
"value": 5, |
||||||
|
}, |
||||||
|
Object { |
||||||
|
"color": "rgba(50, 172, 45, 0.97)", |
||||||
|
"value": 10, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
"transformations": Array [], |
||||||
|
} |
||||||
|
`; |
||||||
|
|
||||||
|
exports[`Table Migrations migrates transform out to core transforms 1`] = ` |
||||||
|
Object { |
||||||
|
"fieldConfig": Object { |
||||||
|
"defaults": Object { |
||||||
|
"custom": Object {}, |
||||||
|
}, |
||||||
|
"overrides": Array [], |
||||||
|
}, |
||||||
|
"transformations": Array [ |
||||||
|
Object { |
||||||
|
"id": "seriesToColumns", |
||||||
|
"options": Object { |
||||||
|
"reducers": Array [], |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
} |
||||||
|
`; |
||||||
|
|
||||||
|
exports[`Table Migrations migrates transform out to core transforms 2`] = ` |
||||||
|
Object { |
||||||
|
"fieldConfig": Object { |
||||||
|
"defaults": Object { |
||||||
|
"custom": Object {}, |
||||||
|
}, |
||||||
|
"overrides": Array [], |
||||||
|
}, |
||||||
|
"transformations": Array [ |
||||||
|
Object { |
||||||
|
"id": "seriesToRows", |
||||||
|
"options": Object { |
||||||
|
"reducers": Array [], |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
} |
||||||
|
`; |
||||||
|
|
||||||
|
exports[`Table Migrations migrates transform out to core transforms 3`] = ` |
||||||
|
Object { |
||||||
|
"fieldConfig": Object { |
||||||
|
"defaults": Object { |
||||||
|
"custom": Object {}, |
||||||
|
}, |
||||||
|
"overrides": Array [], |
||||||
|
}, |
||||||
|
"transformations": Array [ |
||||||
|
Object { |
||||||
|
"id": "reduce", |
||||||
|
"options": Object { |
||||||
|
"includeTimeField": false, |
||||||
|
"reducers": Array [ |
||||||
|
"mean", |
||||||
|
"max", |
||||||
|
"last", |
||||||
|
], |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
} |
||||||
|
`; |
||||||
|
|
||||||
|
exports[`Table Migrations migrates transform out to core transforms 4`] = ` |
||||||
|
Object { |
||||||
|
"fieldConfig": Object { |
||||||
|
"defaults": Object { |
||||||
|
"custom": Object {}, |
||||||
|
}, |
||||||
|
"overrides": Array [], |
||||||
|
}, |
||||||
|
"transformations": Array [ |
||||||
|
Object { |
||||||
|
"id": "merge", |
||||||
|
"options": Object { |
||||||
|
"reducers": Array [], |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
} |
||||||
|
`; |
||||||
@ -0,0 +1,132 @@ |
|||||||
|
import { PanelModel } from '@grafana/data'; |
||||||
|
import { tablePanelChangedHandler } from './migrations'; |
||||||
|
|
||||||
|
describe('Table Migrations', () => { |
||||||
|
it('migrates transform out to core transforms', () => { |
||||||
|
const toColumns = { |
||||||
|
angular: { |
||||||
|
columns: [], |
||||||
|
styles: [], |
||||||
|
transform: 'timeseries_to_columns', |
||||||
|
options: {}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
const toRows = { |
||||||
|
angular: { |
||||||
|
columns: [], |
||||||
|
styles: [], |
||||||
|
transform: 'timeseries_to_rows', |
||||||
|
options: {}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
const aggregations = { |
||||||
|
angular: { |
||||||
|
columns: [ |
||||||
|
{ |
||||||
|
text: 'Avg', |
||||||
|
value: 'avg', |
||||||
|
$$hashKey: 'object:82', |
||||||
|
}, |
||||||
|
{ |
||||||
|
text: 'Max', |
||||||
|
value: 'max', |
||||||
|
$$hashKey: 'object:83', |
||||||
|
}, |
||||||
|
{ |
||||||
|
text: 'Current', |
||||||
|
value: 'current', |
||||||
|
$$hashKey: 'object:84', |
||||||
|
}, |
||||||
|
], |
||||||
|
styles: [], |
||||||
|
transform: 'timeseries_aggregations', |
||||||
|
options: {}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
const table = { |
||||||
|
angular: { |
||||||
|
columns: [], |
||||||
|
styles: [], |
||||||
|
transform: 'table', |
||||||
|
options: {}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
|
||||||
|
const columnsPanel = {} as PanelModel; |
||||||
|
tablePanelChangedHandler(columnsPanel, 'table-old', toColumns); |
||||||
|
expect(columnsPanel).toMatchSnapshot(); |
||||||
|
const rowsPanel = {} as PanelModel; |
||||||
|
tablePanelChangedHandler(rowsPanel, 'table-old', toRows); |
||||||
|
expect(rowsPanel).toMatchSnapshot(); |
||||||
|
const aggregationsPanel = {} as PanelModel; |
||||||
|
tablePanelChangedHandler(aggregationsPanel, 'table-old', aggregations); |
||||||
|
expect(aggregationsPanel).toMatchSnapshot(); |
||||||
|
const tablePanel = {} as PanelModel; |
||||||
|
tablePanelChangedHandler(tablePanel, 'table-old', table); |
||||||
|
expect(tablePanel).toMatchSnapshot(); |
||||||
|
}); |
||||||
|
|
||||||
|
it('migrates styles to field config overrides and defaults', () => { |
||||||
|
const oldStyles = { |
||||||
|
angular: { |
||||||
|
columns: [], |
||||||
|
styles: [ |
||||||
|
{ |
||||||
|
alias: 'Time', |
||||||
|
align: 'auto', |
||||||
|
dateFormat: 'YYYY-MM-DD HH:mm:ss', |
||||||
|
pattern: 'Time', |
||||||
|
type: 'date', |
||||||
|
$$hashKey: 'object:195', |
||||||
|
}, |
||||||
|
{ |
||||||
|
alias: '', |
||||||
|
align: 'left', |
||||||
|
colorMode: 'cell', |
||||||
|
colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'], |
||||||
|
dateFormat: 'YYYY-MM-DD HH:mm:ss', |
||||||
|
decimals: 2, |
||||||
|
mappingType: 1, |
||||||
|
pattern: 'ColorCell', |
||||||
|
thresholds: ['5', '10'], |
||||||
|
type: 'number', |
||||||
|
unit: 'currencyUSD', |
||||||
|
$$hashKey: 'object:196', |
||||||
|
}, |
||||||
|
{ |
||||||
|
alias: '', |
||||||
|
align: 'auto', |
||||||
|
colorMode: 'value', |
||||||
|
colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'], |
||||||
|
dateFormat: 'YYYY-MM-DD HH:mm:ss', |
||||||
|
decimals: 2, |
||||||
|
link: true, |
||||||
|
linkTargetBlank: true, |
||||||
|
linkTooltip: '', |
||||||
|
linkUrl: 'http://www.grafana.com', |
||||||
|
mappingType: 1, |
||||||
|
pattern: 'ColorValue', |
||||||
|
thresholds: ['5', '10'], |
||||||
|
type: 'number', |
||||||
|
unit: 'Bps', |
||||||
|
$$hashKey: 'object:197', |
||||||
|
}, |
||||||
|
{ |
||||||
|
unit: 'short', |
||||||
|
type: 'number', |
||||||
|
alias: '', |
||||||
|
decimals: 2, |
||||||
|
colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'], |
||||||
|
colorMode: null, |
||||||
|
pattern: '/.*/', |
||||||
|
thresholds: [], |
||||||
|
align: 'right', |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
}; |
||||||
|
const panel = {} as PanelModel; |
||||||
|
tablePanelChangedHandler(panel, 'table-old', oldStyles); |
||||||
|
expect(panel).toMatchSnapshot(); |
||||||
|
}); |
||||||
|
}); |
||||||
Loading…
Reference in new issue