mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 00:55:47 -06:00
* PanelOptions: Don't mutate panel options/field config object when updating * Review * maybe faster, plus value === '' fix Co-authored-by: Ryan McKinley <ryantxu@gmail.com> Co-authored-by: Leon Sorokin <leeoniya@gmail.com>
85 lines
2.3 KiB
TypeScript
85 lines
2.3 KiB
TypeScript
import { CSSProperties } from 'react';
|
|
import { omit } from 'lodash';
|
|
import { FieldConfigSource, PanelPlugin } from '@grafana/data';
|
|
import { PanelModel } from '../../state/PanelModel';
|
|
import { DisplayMode } from './types';
|
|
import { GRID_CELL_HEIGHT, GRID_CELL_VMARGIN, GRID_COLUMN_COUNT } from 'app/core/constants';
|
|
|
|
export function calculatePanelSize(mode: DisplayMode, width: number, height: number, panel: PanelModel): CSSProperties {
|
|
if (mode === DisplayMode.Fill) {
|
|
return { width, height };
|
|
}
|
|
const panelPadding = 8 * 6;
|
|
const sidebarWidth = 60;
|
|
|
|
const colWidth = (window.innerWidth - sidebarWidth - GRID_CELL_VMARGIN * 4) / GRID_COLUMN_COUNT;
|
|
const pWidth = colWidth * panel.gridPos.w;
|
|
const pHeight = GRID_CELL_HEIGHT * panel.gridPos.h + panelPadding;
|
|
const scale = Math.min(width / pWidth, height / pHeight);
|
|
|
|
if (pWidth <= width && pHeight <= height) {
|
|
return {
|
|
width: pWidth,
|
|
height: pHeight,
|
|
};
|
|
}
|
|
|
|
return {
|
|
width: pWidth * scale,
|
|
height: pHeight * scale,
|
|
};
|
|
}
|
|
|
|
export function supportsDataQuery(plugin: PanelPlugin | undefined | null): boolean {
|
|
return plugin?.meta.skipDataQuery === false;
|
|
}
|
|
|
|
export const updateDefaultFieldConfigValue = (
|
|
config: FieldConfigSource,
|
|
name: string,
|
|
value: any,
|
|
isCustom?: boolean
|
|
) => {
|
|
let defaults = { ...config.defaults };
|
|
const remove = value == null || value === '';
|
|
|
|
if (isCustom) {
|
|
if (defaults.custom) {
|
|
if (remove) {
|
|
defaults.custom = omit(defaults.custom, name);
|
|
} else {
|
|
defaults.custom = setOptionImmutably(defaults.custom, name, value);
|
|
}
|
|
} else if (!remove) {
|
|
defaults.custom = setOptionImmutably(defaults.custom, name, value);
|
|
}
|
|
} else if (remove) {
|
|
defaults = omit(defaults, name);
|
|
} else {
|
|
defaults = setOptionImmutably(defaults, name, value);
|
|
}
|
|
|
|
return {
|
|
...config,
|
|
defaults,
|
|
};
|
|
};
|
|
|
|
export function setOptionImmutably<T extends object>(options: T, path: string | string[], value: any): T {
|
|
const splat = !Array.isArray(path) ? path.split('.') : path;
|
|
|
|
const key = splat.shift()!;
|
|
|
|
if (!splat.length) {
|
|
return { ...options, [key]: value };
|
|
}
|
|
|
|
let current = (options as Record<string, any>)[key];
|
|
|
|
if (current == null || typeof current !== 'object') {
|
|
current = {};
|
|
}
|
|
|
|
return { ...options, [key]: setOptionImmutably(current, splat, value) };
|
|
}
|