import React, { useEffect, useRef, useState } from "react"; import { Card } from "../../tremor/Card"; import { Label } from "../../tremor/Text"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "../../tremor/Select"; import { Input } from "../../tremor/Input"; import { Button } from "../../tremor/Button"; import { Switch } from "../../tremor/Switch"; import { Tabs, TabsList, TabsTrigger } from "../../tremor/Tabs"; import { Bars3BottomLeftIcon, Bars3BottomRightIcon, Bars3Icon } from "@heroicons/react/24/outline"; import { Divider } from "../../tremor/Divider"; const chartTypes = [ "line", "bar", "area", "metric", "table", "pie", "doughnut", "bubble", "polarArea", "radar", "scatter", "funnel", ].map((a) => ({ label: a, value: a })); const PositionPicker: React.FC<{ value: string; onValueChange: (str: string) => void; }> = ({ value, onValueChange }) => { return ( Top Left Bottom Right ); }; const AlignmentPicker: React.FC<{ value: string; onValueChange: (str: string) => void; }> = ({ value, onValueChange }) => { return ( ); }; export const WidgetWizard: React.FC<{ columns: string[], onChange: (config: any) => void; config: any; }> = ({ columns, onChange, config }) => { const [type, setType] = useState(chartTypes[0].value); const [labels, setLabels] = useState(""); const [title, setTitle] = useState<{ 'text': string, 'display'?: boolean, 'position'?: string, 'align'?: string, }>({ 'text': "" }); const [subtitle, setSubtitle] = useState<{ 'text': string, 'display'?: boolean, 'position'?: string, 'align'?: string, }>({ 'text': "" }); const [xAxis, setXAxis] = useState<{ 'text'?: string, 'display'?: boolean }>({ 'display': false }); const [yAxis, setYAxis] = useState<{ 'text'?: string, 'display'?: boolean }>({ 'display': false }); const [legend, setLegend] = useState<{ 'display'?: boolean, 'position'?: string, 'align'?: string, }>({ 'display': false }); const [datasets, setDatasets] = useState< { title: string; data: string; type: string; backgroundColor?: string; borderColor?: string; borderWidth?: number; }[] >([]); const prevConfig = useRef(null); const constructCode = () => { let newConfig = { 'type': type, 'data': { 'labels': labels, 'datasets': datasets.map( (d) => ({ 'label': d.title, 'type': d.type, 'data': d.data, 'backgroundColor': d.backgroundColor, 'borderColor': d.borderColor, 'borderWidth': d.borderWidth, }) ) }, 'options': { 'responsive': true, 'maintainAspectRatio': false, 'plugins': { 'title': title, 'subtitle': subtitle, 'legend': legend }, 'scales': { 'x': xAxis, 'y': yAxis } } }; if (JSON.stringify(prevConfig.current) !== JSON.stringify(newConfig)) { // @ts-ignore prevConfig.current = newConfig; onChange(newConfig); } }; useEffect(() => { if (config && JSON.stringify(prevConfig.current) !== JSON.stringify(config)) { prevConfig.current = config; setType(config.type); setLabels(config.data.labels); setTitle(config.options.plugins.title); setSubtitle(config.options.plugins.subtitle); setXAxis(config.options.scales.x); setYAxis(config.options.scales.y); setLegend(config.options.plugins.legend); setDatasets(config.data.datasets); } }, [config]); useEffect(() => { constructCode(); }, [ type, datasets, title, subtitle, xAxis, yAxis, labels ]); return (
{datasets.map((a, idx) => (
{ setDatasets( datasets.map((a, i) => { if (i === idx) { return { ...a, title: e.target.value, }; } return a; }) ); }} />
{ setDatasets( datasets.map((a, i) => { if (i === idx) { return { ...a, backgroundColor: e.target.value, }; } return a; }) ); }} /> { setDatasets( datasets.map((a, i) => { if (i === idx) { return { ...a, borderColor: e.target.value, }; } return a; }) ); }} /> { setDatasets( datasets.map((a, i) => { if (i === idx) { return { ...a, borderWidth: Number(e.target.value), }; } return a; }) ); }} />
))}
{ setTitle(t => ({ ...t, display: val === "true" })) }} > Visible Hidden
{title.display && (
setTitle(t => ({ ...t, text: e.target.value }))} />
setTitle(t => ({ ...t, position: val }))} /> setTitle(t => ({ ...t, align: val }))} />
)}
{ setSubtitle(t => ({ ...t, display: val === "true" })) }} > Visible Hidden
{subtitle.display && (
setSubtitle(t => ({ ...t, text: e.target.value }))} />
setSubtitle(t => ({ ...t, position: val }))} /> setSubtitle(t => ({ ...t, align: val }))} />
)}
{ setLegend(t => ({ ...t, display: val === "true" })) }} > Visible Hidden
{legend.display && (
setLegend(t => ({ ...t, position: val }))} /> setLegend(t => ({ ...t, align: val }))} />
)}
setXAxis(t => ({ ...t, display: val }))} /> {xAxis.display && (
setXAxis(t => ({ ...t, text: e.target.value }))} placeholder="Date in DD/MM/YYYY format" />
)}
setYAxis(t => ({ ...t, display: val }))} /> {yAxis.display && (
setYAxis(t => ({ ...t, text: e.target.value }))} placeholder="No of users" />
)}
); };