import React from 'react'; import { cloneDeep } from 'lodash'; import { DocsId, SelectableValue } from '@grafana/data'; import { Container, FeatureInfoBox, fieldMatchersUI, useTheme, ValuePicker } from '@grafana/ui'; import { OverrideEditor } from './OverrideEditor'; import { selectors } from '@grafana/e2e-selectors'; import { css } from 'emotion'; import { getDocsLink } from 'app/core/utils/docsLinks'; import { Props } from './types'; /** * Expects the container div to have size set and will fill it 100% */ export const OverrideFieldConfigEditor: React.FC = (props) => { const theme = useTheme(); const { config } = props; const onOverrideChange = (index: number, override: any) => { const { config } = props; let overrides = cloneDeep(config.overrides); overrides[index] = override; props.onChange({ ...config, overrides }); }; const onOverrideRemove = (overrideIndex: number) => { const { config } = props; let overrides = cloneDeep(config.overrides); overrides.splice(overrideIndex, 1); props.onChange({ ...config, overrides }); }; const onOverrideAdd = (value: SelectableValue) => { const { onChange, config } = props; onChange({ ...config, overrides: [ ...config.overrides, { matcher: { id: value.value!, }, properties: [], }, ], }); }; const renderOverrides = () => { const { config, data, plugin } = props; const { fieldConfigRegistry } = plugin; if (config.overrides.length === 0) { return null; } return (
{config.overrides.map((o, i) => { // TODO: apply matcher to retrieve fields return ( onOverrideChange(i, value)} onRemove={() => onOverrideRemove(i)} registry={fieldConfigRegistry} /> ); })}
); }; const renderAddOverride = () => { return ( !o.excludeFromPicker) .map>((i) => ({ label: i.name, value: i.id, description: i.description }))} onChange={(value) => onOverrideAdd(value)} isFullWidth={false} /> ); }; return (
{config.overrides.length === 0 && ( Field override rules give you a fine grained control over how your data is displayed. )} {renderOverrides()} {renderAddOverride()}
); };