71 lines
2.5 KiB
TypeScript
71 lines
2.5 KiB
TypeScript
import { SceneObject } from '@grafana/scenes';
|
|
import { DashboardV2Spec, RowsLayoutRowKind } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha0';
|
|
|
|
import { RowItem } from '../../scene/layout-rows/RowItem';
|
|
import { RowItemRepeaterBehavior } from '../../scene/layout-rows/RowItemRepeaterBehavior';
|
|
import { RowsLayoutManager } from '../../scene/layout-rows/RowsLayoutManager';
|
|
import { LayoutManagerSerializer } from '../../scene/types/DashboardLayoutManager';
|
|
|
|
import { layoutSerializerRegistry } from './layoutSerializerRegistry';
|
|
import { getLayout } from './utils';
|
|
|
|
export class RowsLayoutSerializer implements LayoutManagerSerializer {
|
|
serialize(layoutManager: RowsLayoutManager): DashboardV2Spec['layout'] {
|
|
return {
|
|
kind: 'RowsLayout',
|
|
spec: {
|
|
rows: layoutManager.state.rows.map((row) => {
|
|
const layout = getLayout(row.state.layout);
|
|
if (layout.kind === 'RowsLayout') {
|
|
throw new Error('Nested RowsLayout is not supported');
|
|
}
|
|
const rowKind: RowsLayoutRowKind = {
|
|
kind: 'RowsLayoutRow',
|
|
spec: {
|
|
title: row.state.title,
|
|
collapsed: row.state.isCollapsed ?? false,
|
|
layout: layout,
|
|
},
|
|
};
|
|
|
|
if (row.state.$behaviors) {
|
|
for (const behavior of row.state.$behaviors) {
|
|
if (behavior instanceof RowItemRepeaterBehavior) {
|
|
if (rowKind.spec.repeat) {
|
|
throw new Error('Multiple repeaters are not supported');
|
|
}
|
|
rowKind.spec.repeat = { value: behavior.state.variableName, mode: 'variable' };
|
|
}
|
|
}
|
|
}
|
|
return rowKind;
|
|
}),
|
|
},
|
|
};
|
|
}
|
|
|
|
deserialize(
|
|
layout: DashboardV2Spec['layout'],
|
|
elements: DashboardV2Spec['elements'],
|
|
preload: boolean
|
|
): RowsLayoutManager {
|
|
if (layout.kind !== 'RowsLayout') {
|
|
throw new Error('Invalid layout kind');
|
|
}
|
|
const rows = layout.spec.rows.map((row) => {
|
|
const layout = row.spec.layout;
|
|
const behaviors: SceneObject[] = [];
|
|
if (row.spec.repeat) {
|
|
behaviors.push(new RowItemRepeaterBehavior({ variableName: row.spec.repeat.value }));
|
|
}
|
|
return new RowItem({
|
|
title: row.spec.title,
|
|
isCollapsed: row.spec.collapsed,
|
|
$behaviors: behaviors,
|
|
layout: layoutSerializerRegistry.get(layout.kind).serializer.deserialize(layout, elements, preload),
|
|
});
|
|
});
|
|
return new RowsLayoutManager({ rows });
|
|
}
|
|
}
|