grafana/public/app/plugins/panel/icon/IconPanel.tsx
Josh Hunt 3c6e0e8ef8
Chore: ESlint import order (#44959)
* Add and configure eslint-plugin-import

* Fix the lint:ts npm command

* Autofix + prettier all the files

* Manually fix remaining files

* Move jquery code in jest-setup to external file to safely reorder imports

* Resolve issue caused by circular dependencies within Prometheus

* Update .betterer.results

* Fix missing // @ts-ignore

* ignore iconBundle.ts

* Fix missing // @ts-ignore
2022-04-22 14:33:13 +01:00

88 lines
2.6 KiB
TypeScript

import React, { Component } from 'react';
import { PanelProps } from '@grafana/data';
import { HorizontalConstraint, VerticalConstraint } from 'app/features/canvas';
import { iconItem } from 'app/features/canvas/elements/icon';
import { ElementState } from 'app/features/canvas/runtime/element';
import {
ColorDimensionConfig,
DimensionContext,
getColorDimensionFromData,
getResourceDimensionFromData,
getScalarDimensionFromData,
getScaleDimensionFromData,
getTextDimensionFromData,
ResourceDimensionConfig,
ScalarDimensionConfig,
ScaleDimensionConfig,
TextDimensionConfig,
} from 'app/features/dimensions';
import { PanelOptions } from './models.gen';
interface Props extends PanelProps<PanelOptions> {}
export class IconPanel extends Component<Props> {
private element: ElementState;
constructor(props: Props) {
super(props);
this.element = this.initElement(props);
}
initElement = (props: Props) => {
this.element = new ElementState(iconItem, props.options.root as any);
this.updateSize(props);
this.element.updateData(this.dims);
return this.element;
};
updateSize = (props: Props) => {
const { width, height } = props;
this.element.options.constraint = {
vertical: VerticalConstraint.Top,
horizontal: HorizontalConstraint.Left,
};
this.element.options.placement = {
left: 0,
top: 0,
width,
height,
};
};
dims: DimensionContext = {
getColor: (color: ColorDimensionConfig) => getColorDimensionFromData(this.props.data, color),
getScale: (scale: ScaleDimensionConfig) => getScaleDimensionFromData(this.props.data, scale),
getScalar: (scalar: ScalarDimensionConfig) => getScalarDimensionFromData(this.props.data, scalar),
getText: (text: TextDimensionConfig) => getTextDimensionFromData(this.props.data, text),
getResource: (res: ResourceDimensionConfig) => getResourceDimensionFromData(this.props.data, res),
};
shouldComponentUpdate(nextProps: Props) {
const { width, height, data } = this.props;
let changed = false;
if (width !== nextProps.width || height !== nextProps.height) {
this.updateSize(nextProps);
changed = true;
}
if (data !== nextProps.data) {
this.element.updateData(this.dims);
changed = true;
}
// Reload the element when options change
if (this.props.options?.root !== nextProps.options?.root) {
this.initElement(nextProps);
changed = true;
}
return changed;
}
render() {
const { width, height } = this.props;
return <div style={{ width, height, overflow: 'hidden', position: 'relative' }}>{this.element.render()}</div>;
}
}