From 59b7789adae946c4e560685133dd8296096591aa Mon Sep 17 00:00:00 2001 From: Adela Almasan <88068998+adela-almasan@users.noreply.github.com> Date: Thu, 14 Sep 2023 12:20:58 -0500 Subject: [PATCH] Canvas: Add support for selecting the button variant (#74782) --- .../app/features/canvas/elements/button.tsx | 20 ++++++++- .../panel/canvas/editor/element/APIEditor.tsx | 23 +++++----- .../editor/element/ButtonStyleEditor.tsx | 44 +++++++++++++++++++ 3 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 public/app/plugins/panel/canvas/editor/element/ButtonStyleEditor.tsx diff --git a/public/app/features/canvas/elements/button.tsx b/public/app/features/canvas/elements/button.tsx index ac17cef926c..4ae0bec4d89 100644 --- a/public/app/features/canvas/elements/button.tsx +++ b/public/app/features/canvas/elements/button.tsx @@ -6,18 +6,21 @@ import { Button } from '@grafana/ui'; import { DimensionContext } from 'app/features/dimensions/context'; import { TextDimensionEditor } from 'app/features/dimensions/editors/TextDimensionEditor'; import { APIEditor, APIEditorConfig, callApi } from 'app/plugins/panel/canvas/editor/element/APIEditor'; +import { ButtonStyleConfig, ButtonStyleEditor } from 'app/plugins/panel/canvas/editor/element/ButtonStyleEditor'; import { HttpRequestMethod } from 'app/plugins/panel/canvas/panelcfg.gen'; -import { CanvasElementItem, CanvasElementProps, defaultBgColor } from '../element'; +import { CanvasElementItem, CanvasElementProps } from '../element'; interface ButtonData { text?: string; api?: APIEditorConfig; + style?: ButtonStyleConfig; } interface ButtonConfig { text?: TextDimensionConfig; api?: APIEditorConfig; + style?: ButtonStyleConfig; } export const defaultApiConfig: APIEditorConfig = { @@ -27,6 +30,10 @@ export const defaultApiConfig: APIEditorConfig = { contentType: 'application/json', }; +export const defaultStyleConfig: ButtonStyleConfig = { + variant: 'primary', +}; + class ButtonDisplay extends PureComponent> { render() { const { data } = this.props; @@ -37,7 +44,7 @@ class ButtonDisplay extends PureComponent + ); @@ -65,6 +72,7 @@ export const buttonItem: CanvasElementItem = { fixed: 'Button', }, api: defaultApiConfig, + style: defaultStyleConfig, }, background: { color: { @@ -95,6 +103,7 @@ export const buttonItem: CanvasElementItem = { const data: ButtonData = { text: cfg?.text ? ctx.getText(cfg.text).value() : '', api: getCfgApi(), + style: cfg?.style ?? defaultStyleConfig, }; return data; @@ -111,6 +120,13 @@ export const buttonItem: CanvasElementItem = { name: 'Text', editor: TextDimensionEditor, }) + .addCustomEditor({ + category, + id: 'styleSelector', + path: 'config.style', + name: 'Style', + editor: ButtonStyleEditor, + }) .addCustomEditor({ category, id: 'apiSelector', diff --git a/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx b/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx index 299b6a5ce05..090517ec3f4 100644 --- a/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx @@ -91,7 +91,7 @@ const contentTypeOptions: SelectableValue[] = [ ]; export function APIEditor({ value, context, onChange }: Props) { - const LABEL_WIDTH = 9; + const LABEL_WIDTH = 13; if (!value) { value = defaultApiConfig; @@ -185,16 +185,17 @@ export function APIEditor({ value, context, onChange }: Props) { {value?.method === HttpRequestMethod.POST && ( <> - - + + {value?.contentType && ( ; + +const variantOptions: SelectableValue[] = [ + { label: 'primary', value: 'primary' }, + { label: 'secondary', value: 'secondary' }, + { label: 'success', value: 'success' }, + { label: 'destructive', value: 'destructive' }, +]; + +export const ButtonStyleEditor = ({ value, onChange }: Props) => { + if (!value) { + value = defaultStyleConfig; + } + + const onVariantChange = useCallback( + (variant: SelectableValue) => { + onChange({ + ...value, + variant: variant?.value ?? defaultStyleConfig.variant, + }); + }, + [onChange, value] + ); + + return ( + <> + + +