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 && (
)}
{
setSubtitle(t => ({ ...t, display: val === "true" }))
}}
>
Visible
Hidden
{subtitle.display && (
)}
{
setLegend(t => ({ ...t, display: val === "true" }))
}}
>
Visible
Hidden
{legend.display && (
setLegend(t => ({ ...t, position: val }))}
/>
setLegend(t => ({ ...t, align: val }))}
/>
)}
);
};