From 2ff4b028c8b68dd3dbf407495e504e602aec7461 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Tue, 17 Aug 2021 13:43:54 -0700 Subject: [PATCH] Core: move dimensions out of geomap into app/features (#37946) --- .../src/components/OptionsUI/string.tsx | 4 +- .../dims => features/dimensions}/color.ts | 7 +- .../editors/ColorDimensionEditor.tsx | 2 +- .../dimensions/editors/IconSelector.tsx | 43 +++++++ .../dimensions/editors}/NumberInput.tsx | 0 .../editors/ResourceDimensionEditor.tsx | 115 ++++++++++++++++++ .../editors/ScaleDimensionEditor.tsx | 4 +- .../editors/TextDimensionEditor.tsx | 107 ++++++++++++++++ .../app/features/dimensions/editors/index.ts | 5 + public/app/features/dimensions/index.ts | 7 ++ public/app/features/dimensions/resource.ts | 49 ++++++++ .../dimensions}/scale.test.ts | 0 .../dims => features/dimensions}/scale.ts | 40 +++--- public/app/features/dimensions/text.ts | 57 +++++++++ .../dims => features/dimensions}/types.ts | 38 +++++- public/app/features/dimensions/utils.ts | 38 ++++++ public/app/plugins/panel/geomap/dims/utils.ts | 18 --- .../panel/geomap/editor/MapViewEditor.tsx | 2 +- .../geomap/layers/data/MarkersLegend.tsx | 4 +- .../panel/geomap/layers/data/heatMap.tsx | 5 +- .../panel/geomap/layers/data/markersLayer.tsx | 13 +- 21 files changed, 502 insertions(+), 56 deletions(-) rename public/app/{plugins/panel/geomap/dims => features/dimensions}/color.ts (83%) rename public/app/{plugins/panel/geomap/dims => features/dimensions}/editors/ColorDimensionEditor.tsx (96%) create mode 100644 public/app/features/dimensions/editors/IconSelector.tsx rename public/app/{plugins/panel/geomap/components => features/dimensions/editors}/NumberInput.tsx (100%) create mode 100644 public/app/features/dimensions/editors/ResourceDimensionEditor.tsx rename public/app/{plugins/panel/geomap/dims => features/dimensions}/editors/ScaleDimensionEditor.tsx (96%) create mode 100644 public/app/features/dimensions/editors/TextDimensionEditor.tsx create mode 100644 public/app/features/dimensions/editors/index.ts create mode 100644 public/app/features/dimensions/index.ts create mode 100644 public/app/features/dimensions/resource.ts rename public/app/{plugins/panel/geomap/dims => features/dimensions}/scale.test.ts (100%) rename public/app/{plugins/panel/geomap/dims => features/dimensions}/scale.ts (73%) create mode 100644 public/app/features/dimensions/text.ts rename public/app/{plugins/panel/geomap/dims => features/dimensions}/types.ts (52%) create mode 100644 public/app/features/dimensions/utils.ts delete mode 100644 public/app/plugins/panel/geomap/dims/utils.ts diff --git a/packages/grafana-ui/src/components/OptionsUI/string.tsx b/packages/grafana-ui/src/components/OptionsUI/string.tsx index 61dce866ac7..e2b85e7c4b3 100644 --- a/packages/grafana-ui/src/components/OptionsUI/string.tsx +++ b/packages/grafana-ui/src/components/OptionsUI/string.tsx @@ -1,9 +1,9 @@ import React, { useCallback } from 'react'; -import { FieldConfigEditorProps, StringFieldConfigSettings } from '@grafana/data'; +import { StandardEditorProps, StringFieldConfigSettings } from '@grafana/data'; import { Input } from '../Input/Input'; import { TextArea } from '../TextArea/TextArea'; -export const StringValueEditor: React.FC> = ({ +export const StringValueEditor: React.FC> = ({ value, onChange, item, diff --git a/public/app/plugins/panel/geomap/dims/color.ts b/public/app/features/dimensions/color.ts similarity index 83% rename from public/app/plugins/panel/geomap/dims/color.ts rename to public/app/features/dimensions/color.ts index bdcb67f3039..45098808b57 100644 --- a/public/app/plugins/panel/geomap/dims/color.ts +++ b/public/app/features/dimensions/color.ts @@ -1,13 +1,13 @@ import { DataFrame, getFieldColorModeForField, getScaleCalculator, GrafanaTheme2 } from '@grafana/data'; import { ColorDimensionConfig, DimensionSupplier } from './types'; -import { findField } from './utils'; +import { findField, getLastNotNullFieldValue } from './utils'; //--------------------------------------------------------- // Color dimension //--------------------------------------------------------- export function getColorDimension( - frame: DataFrame, + frame: DataFrame | undefined, config: ColorDimensionConfig, theme: GrafanaTheme2 ): DimensionSupplier { @@ -17,6 +17,7 @@ export function getColorDimension( return { isAssumed: Boolean(config.field?.length) || !config.fixed, fixed: v, + value: () => v, get: (i) => v, }; } @@ -25,6 +26,7 @@ export function getColorDimension( const fixed = mode.getCalculator(field, theme)(0, 0); return { fixed, + value: () => fixed, get: (i) => fixed, field, }; @@ -36,5 +38,6 @@ export function getColorDimension( return scale(val).color; }, field, + value: () => scale(getLastNotNullFieldValue(field)).color, }; } diff --git a/public/app/plugins/panel/geomap/dims/editors/ColorDimensionEditor.tsx b/public/app/features/dimensions/editors/ColorDimensionEditor.tsx similarity index 96% rename from public/app/plugins/panel/geomap/dims/editors/ColorDimensionEditor.tsx rename to public/app/features/dimensions/editors/ColorDimensionEditor.tsx index 25f11359eaf..f0cc688ca05 100644 --- a/public/app/plugins/panel/geomap/dims/editors/ColorDimensionEditor.tsx +++ b/public/app/features/dimensions/editors/ColorDimensionEditor.tsx @@ -5,7 +5,7 @@ import { Select, ColorPicker, useStyles2 } from '@grafana/ui'; import { useFieldDisplayNames, useSelectOptions, -} from '../../../../../../../packages/grafana-ui/src/components/MatchersUI/utils'; +} from '../../../../../packages/grafana-ui/src/components/MatchersUI/utils'; import { css } from '@emotion/css'; const fixedColorOption: SelectableValue = { diff --git a/public/app/features/dimensions/editors/IconSelector.tsx b/public/app/features/dimensions/editors/IconSelector.tsx new file mode 100644 index 00000000000..3a2d977c9a7 --- /dev/null +++ b/public/app/features/dimensions/editors/IconSelector.tsx @@ -0,0 +1,43 @@ +import React, { useState, useEffect } from 'react'; +import { Select } from '@grafana/ui'; +import { SelectableValue } from '@grafana/data'; +import { getBackendSrv } from '@grafana/runtime'; + +interface Props { + value: string; + onChange: (v: string) => void; +} + +const IconSelector: React.FC = ({ value, onChange }) => { + const [icons, setIcons] = useState(value ? [{ value, label: value }] : []); + const [icon, setIcon] = useState(); + const iconRoot = (window as any).__grafana_public_path__ + 'img/icons/unicons/'; + const onChangeIcon = (value: string) => { + onChange(value); + setIcon(value); + }; + useEffect(() => { + getBackendSrv() + .get(`${iconRoot}/index.json`) + .then((data) => { + setIcons( + data.files.map((icon: string) => ({ + value: icon, + label: icon, + })) + ); + }); + }, [iconRoot]); + return ( +