mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 00:55:47 -06:00
139 lines
2.6 KiB
TypeScript
139 lines
2.6 KiB
TypeScript
import { Emitter } from 'app/core/utils/emitter';
|
|
import _ from 'lodash';
|
|
|
|
export interface GridPos {
|
|
x: number;
|
|
y: number;
|
|
w: number;
|
|
h: number;
|
|
static?: boolean;
|
|
}
|
|
|
|
const notPersistedProperties: { [str: string]: boolean } = {
|
|
events: true,
|
|
fullscreen: true,
|
|
isEditing: true,
|
|
hasRefreshed: true,
|
|
};
|
|
|
|
const defaults: any = {
|
|
gridPos: { x: 0, y: 0, h: 3, w: 6 },
|
|
datasource: null,
|
|
targets: [{}],
|
|
};
|
|
|
|
export class PanelModel {
|
|
id: number;
|
|
gridPos: GridPos;
|
|
type: string;
|
|
title: string;
|
|
alert?: any;
|
|
scopedVars?: any;
|
|
repeat?: string;
|
|
repeatIteration?: number;
|
|
repeatPanelId?: number;
|
|
repeatDirection?: string;
|
|
repeatedByRow?: boolean;
|
|
minSpan?: number;
|
|
collapsed?: boolean;
|
|
panels?: any;
|
|
soloMode?: boolean;
|
|
targets: any[];
|
|
datasource: string;
|
|
thresholds?: any;
|
|
|
|
// non persisted
|
|
fullscreen: boolean;
|
|
isEditing: boolean;
|
|
hasRefreshed: boolean;
|
|
events: Emitter;
|
|
|
|
constructor(model) {
|
|
this.events = new Emitter();
|
|
|
|
// copy properties from persisted model
|
|
for (const property in model) {
|
|
this[property] = model[property];
|
|
}
|
|
|
|
// defaults
|
|
_.defaultsDeep(this, _.cloneDeep(defaults));
|
|
}
|
|
|
|
getSaveModel() {
|
|
const model: any = {};
|
|
for (const property in this) {
|
|
if (notPersistedProperties[property] || !this.hasOwnProperty(property)) {
|
|
continue;
|
|
}
|
|
|
|
if (_.isEqual(this[property], defaults[property])) {
|
|
continue;
|
|
}
|
|
|
|
model[property] = _.cloneDeep(this[property]);
|
|
}
|
|
|
|
return model;
|
|
}
|
|
|
|
setViewMode(fullscreen: boolean, isEditing: boolean) {
|
|
this.fullscreen = fullscreen;
|
|
this.isEditing = isEditing;
|
|
this.events.emit('panel-size-changed');
|
|
}
|
|
|
|
updateGridPos(newPos: GridPos) {
|
|
let sizeChanged = false;
|
|
|
|
if (this.gridPos.w !== newPos.w || this.gridPos.h !== newPos.h) {
|
|
sizeChanged = true;
|
|
}
|
|
|
|
this.gridPos.x = newPos.x;
|
|
this.gridPos.y = newPos.y;
|
|
this.gridPos.w = newPos.w;
|
|
this.gridPos.h = newPos.h;
|
|
|
|
if (sizeChanged) {
|
|
this.events.emit('panel-size-changed');
|
|
}
|
|
}
|
|
|
|
resizeDone() {
|
|
this.events.emit('panel-size-changed');
|
|
}
|
|
|
|
refresh() {
|
|
this.hasRefreshed = true;
|
|
this.events.emit('refresh');
|
|
}
|
|
|
|
render() {
|
|
if (!this.hasRefreshed) {
|
|
this.refresh();
|
|
} else {
|
|
this.events.emit('render');
|
|
}
|
|
}
|
|
|
|
panelInitialized() {
|
|
this.events.emit('panel-initialized');
|
|
}
|
|
|
|
initEditMode() {
|
|
this.events.emit('panel-init-edit-mode');
|
|
}
|
|
|
|
changeType(pluginId: string) {
|
|
this.type = pluginId;
|
|
|
|
delete this.thresholds;
|
|
delete this.alert;
|
|
}
|
|
|
|
destroy() {
|
|
this.events.removeAllListeners();
|
|
}
|
|
}
|