import React from "react"; import { get, has, isString } from "lodash"; import BaseControl, { ControlProps } from "./BaseControl"; import { ControlWrapper, StyledPropertyPaneButton } from "./StyledControls"; import styled from "constants/DefaultTheme"; import { FormIcons } from "icons/FormIcons"; import { AnyStyledComponent } from "styled-components"; import CodeEditor from "components/editorComponents/CodeEditor"; import { EditorModes, EditorSize, EditorTheme, TabBehaviour, } from "components/editorComponents/CodeEditor/EditorConfig"; import { Size, Category } from "components/ads/Button"; import { AllChartData, ChartData } from "widgets/ChartWidget"; import { generateReactKey } from "utils/generators"; const Wrapper = styled.div` background-color: ${(props) => props.theme.colors.propertyPane.dropdownSelectBg}; padding: 0 8px; `; const StyledOptionControlWrapper = styled(ControlWrapper)` display: flex; justify-content: flex-start; padding: 0; width: 100%; `; const StyledDynamicInput = styled.div` width: 100%; &&& { input { border: none; color: ${(props) => props.theme.colors.textOnDarkBG}; background: ${(props) => props.theme.colors.paneInputBG}; &:focus { border: none; color: ${(props) => props.theme.colors.textOnDarkBG}; background: ${(props) => props.theme.colors.paneInputBG}; } } } `; const StyledDeleteIcon = styled(FormIcons.DELETE_ICON as AnyStyledComponent)` padding: 0; position: relative; margin-left: 15px; cursor: pointer; &&& svg { path { fill: ${(props) => props.theme.colors.propertyPane.jsIconBg}; } } `; const ActionHolder = styled.div` display: flex; justify-content: space-between; align-items: center; width: 100%; `; const StyledLabel = styled.label` margin: 8px auto 8px 0; && { color: ${(props) => props.theme.colors.propertyPane.label}; } `; const Box = styled.div` height: 16px; `; type RenderComponentProps = { index: string; item: ChartData; length: number; validationMessage: { data: string; seriesName: string; }; deleteOption: (index: string) => void; updateOption: (index: string, key: string, value: string) => void; evaluated: { seriesName: string; data: Array<{ x: string; y: string }> | any; }; theme: EditorTheme; }; function DataControlComponent(props: RenderComponentProps) { const { deleteOption, updateOption, item, index, length, evaluated, validationMessage, } = props; return ( Series Title {length > 1 && ( { deleteOption(index); }} width={20} /> )} | string, ) => { let value: string = event as string; if (typeof event !== "string") { value = event.target.value; } updateOption(index, "seriesName", value); }, }} mode={EditorModes.TEXT_WITH_BINDING} placeholder="Series Name" size={EditorSize.EXTENDED} tabBehaviour={TabBehaviour.INPUT} theme={props.theme} /> Series Data `} input={{ value: item.data, onChange: ( event: React.ChangeEvent | string, ) => { let value: string = event as string; if (typeof event !== "string") { value = event.target.value; } updateOption(index, "data", value); }, }} meta={{ error: has(validationMessage, "data") ? get(validationMessage, "data") : "", touched: true, }} mode={EditorModes.JSON_WITH_BINDING} placeholder="" size={EditorSize.EXTENDED} tabBehaviour={TabBehaviour.INPUT} theme={props.theme} /> ); } class ChartDataControl extends BaseControl { render() { const chartData: AllChartData = isString(this.props.propertyValue) ? {} : this.props.propertyValue; const dataLength = Object.keys(chartData).length; const { validationMessage } = this.props; const evaluatedValue = this.props.evaluatedValue; const firstKey = Object.keys(chartData)[0] as string; if (this.props.widgetProperties.chartType === "PIE_CHART") { const data = dataLength ? get(chartData, `${firstKey}`) : { seriesName: "", data: [], }; return ( ); } return ( <> {Object.keys(chartData).map((key: string) => { const data = get(chartData, `${key}`); return ( ); })} ); } deleteOption = (index: string) => { this.deleteProperties([`${this.props.propertyName}.${index}`]); }; updateOption = ( index: string, propertyName: string, updatedValue: string, ) => { this.updateProperty( `${this.props.propertyName}.${index}.${propertyName}`, updatedValue, ); }; /** * it adds new series data object in the chartData */ addOption = () => { const randomString = generateReactKey(); this.updateProperty(`${this.props.propertyName}.${randomString}`, { seriesName: "", data: JSON.stringify([{ x: "label", y: 50 }]), }); }; static getControlType() { return "CHART_DATA"; } } export default ChartDataControl;