grafana/public/app/plugins/panel/geomap/editor/LayersEditor.tsx

83 lines
2.4 KiB
TypeScript
Raw Normal View History

import React from 'react';
import { DropResult } from 'react-beautiful-dnd';
import { StandardEditorProps } from '@grafana/data';
import { Container } from '@grafana/ui';
import { AddLayerButton } from 'app/core/components/Layers/AddLayerButton';
import { LayerDragDropList } from 'app/core/components/Layers/LayerDragDropList';
import { GeomapInstanceState } from '../GeomapPanel';
import { getLayersOptions } from '../layers/registry';
import { GeomapPanelOptions, MapLayerState } from '../types';
2022-08-26 16:03:20 -05:00
type LayersEditorProps = StandardEditorProps<unknown, unknown, GeomapPanelOptions, GeomapInstanceState>;
export const LayersEditor = (props: LayersEditorProps) => {
const { layers, selected, actions } = props.context.instanceState ?? {};
if (!layers || !actions) {
return <div>No layers?</div>;
}
const onDragEnd = (result: DropResult) => {
if (!result.destination) {
return;
}
const { layers, actions } = props.context.instanceState ?? {};
if (!layers || !actions) {
return;
}
// account for the reverse order and offset (0 is baselayer)
const count = layers.length - 1;
const src = (result.source.index - count) * -1;
const dst = (result.destination.index - count) * -1;
actions.reorder(src, dst);
};
2022-08-26 16:03:20 -05:00
const onSelect = (element: MapLayerState<unknown>) => {
actions.selectLayer(element.options.name);
};
2022-08-26 16:03:20 -05:00
const onDelete = (element: MapLayerState<unknown>) => {
actions.deleteLayer(element.options.name);
};
2022-08-26 16:03:20 -05:00
const getLayerInfo = (element: MapLayerState<unknown>) => {
return element.options.type;
};
2022-08-26 16:03:20 -05:00
const onNameChange = (element: MapLayerState<unknown>, name: string) => {
element.onChange({ ...element.options, name });
};
const selection = selected ? [layers[selected]?.getName()] : [];
return (
<>
<Container>
<AddLayerButton
onChange={(v) => actions.addlayer(v.value!)}
options={getLayersOptions(false).options}
label={'Add layer'}
/>
</Container>
<br />
<LayerDragDropList
layers={layers}
2022-05-18 01:39:54 -05:00
showActions={() => layers.length > 2} // 2 because base layer is not counted!
getLayerInfo={getLayerInfo}
onDragEnd={onDragEnd}
onSelect={onSelect}
onDelete={onDelete}
selection={selection}
excludeBaseLayer
onNameChange={onNameChange}
verifyLayerNameUniqueness={actions.canRename}
/>
</>
);
};