2025-04-01 10:38:02 +09:00

179 lines
5.5 KiB
TypeScript

import { SceneTimeRange, VizPanel } from '@grafana/scenes';
import { DashboardScene } from '../scene/DashboardScene';
import { DefaultGridLayoutManager } from '../scene/layout-default/DefaultGridLayoutManager';
import { DashboardEditableElement } from './DashboardEditableElement';
import { ElementSelection } from './ElementSelection';
import { MultiSelectedObjectsEditableElement } from './MultiSelectedObjectsEditableElement';
import { MultiSelectedVizPanelsEditableElement } from './MultiSelectedVizPanelsEditableElement';
import { VizPanelEditableElement } from './VizPanelEditableElement';
let panel1: VizPanel, panel2: VizPanel, scene: DashboardScene;
describe('ElementSelection', () => {
beforeAll(() => {
const testScene = buildScene();
panel1 = testScene.panel1;
panel2 = testScene.panel2;
scene = testScene.scene;
});
it('returns a single object when only one is selected', () => {
const selection = new ElementSelection([['id1', panel1.getRef()]]);
expect(selection.isMultiSelection).toBe(false);
expect(selection.getSelection()).toBe(panel1);
});
it('returns multiple objects when multiple are selected', () => {
const selection = new ElementSelection([
['id1', panel1.getRef()],
['id2', panel2.getRef()],
]);
expect(selection.isMultiSelection).toBe(true);
expect(selection.getSelection()).toEqual([panel1, panel2]);
});
it('delete element', () => {
const selection = new ElementSelection([
['id1', panel1.getRef()],
['id2', panel2.getRef()],
]);
selection.removeValue('id1');
expect(selection.isMultiSelection).toBe(false);
expect(selection.getSelection()).toEqual(panel2);
});
it('returns entries', () => {
const ref1 = panel1.getRef();
const ref2 = panel2.getRef();
const selection = new ElementSelection([
['id1', ref1],
['id2', ref2],
]);
expect(selection.isMultiSelection).toBe(true);
expect(selection.getSelectionEntries()).toEqual([
['id1', ref1],
['id2', ref2],
]);
});
it('returns the first selected object through getFirstObject', () => {
const selection = new ElementSelection([
['id1', panel1.getRef()],
['id2', panel2.getRef()],
]);
expect(selection.isMultiSelection).toBe(true);
expect(selection.getFirstObject()).toBe(panel1);
});
it('creates correct element type for single selection', () => {
const vizSelection = new ElementSelection([['id1', panel1.getRef()]]);
expect(vizSelection.createSelectionElement()).toBeInstanceOf(VizPanelEditableElement);
const dashboardSelection = new ElementSelection([['id1', scene.getRef()]]);
expect(dashboardSelection.createSelectionElement()).toBeInstanceOf(DashboardEditableElement);
});
it('creates correct element type for multi-selection of same type', () => {
const selection = new ElementSelection([
['id1', panel1.getRef()],
['id2', panel2.getRef()],
]);
expect(selection.createSelectionElement()).toBeInstanceOf(MultiSelectedVizPanelsEditableElement);
});
it('creates MultiSelectedObjectsEditableElement for selection of different object types', () => {
const selection = new ElementSelection([
['id1', panel1.getRef()],
['id2', scene.getRef()],
]);
expect(selection.createSelectionElement()).toBeInstanceOf(MultiSelectedObjectsEditableElement);
});
it('handles empty selection correctly', () => {
const selection = new ElementSelection([]);
expect(selection.getSelection()).toBeUndefined();
expect(selection.getFirstObject()).toBeUndefined();
expect(selection.createSelectionElement()).toBeUndefined();
});
it('returns the entries with the specified value removed', () => {
const selection = new ElementSelection([
['id1', panel1.getRef()],
['id2', panel2.getRef()],
['id3', scene.getRef()],
]);
const { entries, contextItems } = selection.getStateWithoutValueAt('id2');
expect(entries).toEqual([
['id1', panel1.getRef()],
['id3', scene.getRef()],
]);
expect(contextItems).toEqual([{ id: 'id1' }, { id: 'id3' }]);
});
it('returns the entries with the specified value added in a multi-select scenario', () => {
const selection = new ElementSelection([
['id1', panel1.getRef()],
['id2', panel2.getRef()],
]);
const { selection: entries, contextItems } = selection.getStateWithValue('id3', scene, true);
expect(entries).toEqual([
['id3', panel1.getRef()],
['id1', panel2.getRef()],
['id2', scene.getRef()],
]);
expect(contextItems).toEqual([{ id: 'id3' }, { id: 'id1' }, { id: 'id2' }]);
});
it('returns the entries with just the specified value added in a non multi-select scenario', () => {
const selection = new ElementSelection([
['id1', panel1.getRef()],
['id2', panel2.getRef()],
]);
const { selection: entries, contextItems } = selection.getStateWithValue('id3', scene, false);
expect(entries).toEqual([['id3', scene.getRef()]]);
expect(contextItems).toEqual([{ id: 'id3' }]);
});
});
function buildScene() {
const panel1 = new VizPanel({
title: 'Panel A',
// pluginId: 'text',
key: 'panel-12',
});
const panel2 = new VizPanel({
title: 'Panel B',
// pluginId: 'text',
key: 'panel-13',
});
const scene = new DashboardScene({
title: 'hello',
uid: 'dash-1',
meta: {
canEdit: true,
},
$timeRange: new SceneTimeRange({}),
body: DefaultGridLayoutManager.fromVizPanels([panel1, panel2]),
});
return { panel1, panel2, scene };
}