buster/web/src/controllers/MetricController/MetricViewChart/MetricEditController/MetricStylingApp/MetricStylingApp.tsx

206 lines
6.7 KiB
TypeScript
Raw Normal View History

2025-03-20 12:17:04 +08:00
'use client';
import React, { useState } from 'react';
import { MetricStylingAppSegments } from './config';
import { MetricStylingAppSegment } from './MetricStylingAppSegment';
2025-02-04 13:14:54 +08:00
import { StylingAppColors } from './StylingAppColors';
import { StylingAppStyling } from './StylingAppStyling';
import { StylingAppVisualize } from './StylingAppVisualize';
2025-03-11 10:24:46 +08:00
import {
BarAndLineAxis,
ChartEncodes,
ChartType,
ScatterAxis
} from '@/api/asset_interfaces/metric/charts';
2025-03-20 04:47:15 +08:00
import { useGetMetric, useGetMetricData } from '@/api/buster_rest/metrics';
2025-04-01 07:22:13 +08:00
import { ScrollArea } from '@/components/ui/scroll-area';
2025-02-04 13:14:54 +08:00
export const MetricStylingApp: React.FC<{
2025-02-04 13:14:54 +08:00
metricId: string;
}> = ({ metricId }) => {
const [segment, setSegment] = useState<MetricStylingAppSegments>(
MetricStylingAppSegments.VISUALIZE
2025-02-04 13:14:54 +08:00
);
2025-04-08 11:35:47 +08:00
const { data: chartConfig } = useGetMetric({ id: metricId }, { select: (x) => x.chart_config });
2025-04-12 02:43:19 +08:00
const { data: metricData } = useGetMetricData({ id: metricId }, { enabled: false });
2025-02-04 13:14:54 +08:00
2025-03-26 06:28:07 +08:00
if (!chartConfig) return null;
2025-02-04 13:14:54 +08:00
const columnMetadata = metricData?.data_metadata?.column_metadata || [];
2025-02-05 11:57:02 +08:00
const rowCount = metricData?.data_metadata?.row_count || 0;
2025-02-04 13:14:54 +08:00
const {
selectedChartType,
lineGroupType,
barGroupType,
barLayout,
columnLabelFormats,
barAndLineAxis,
scatterAxis,
pieChartAxis,
comboChartAxis,
columnSettings,
xAxisDataZoom,
xAxisLabelRotation,
xAxisShowAxisLabel,
xAxisAxisTitle,
yAxisScaleType,
yAxisShowAxisLabel,
yAxisAxisTitle,
yAxisStartAxisAtZero,
categoryAxisTitle,
barShowTotalAtTop,
y2AxisShowAxisLabel,
y2AxisAxisTitle,
y2AxisStartAxisAtZero,
y2AxisScaleType,
showLegend,
showLegendHeadline,
gridLines,
goalLines,
trendlines,
barSortBy,
pieDisplayLabelAs,
pieLabelPosition,
pieDonutWidth,
pieInnerLabelAggregate,
pieInnerLabelTitle,
pieShowInnerLabel,
pieMinimumSlicePercentage,
colors,
metricColumnId,
metricHeader,
metricSubHeader,
metricValueLabel,
metricValueAggregate,
xAxisShowAxisTitle,
yAxisShowAxisTitle,
y2AxisShowAxisTitle,
scatterDotSize,
2025-04-12 05:51:44 +08:00
disableTooltip,
pieSortBy
2025-02-04 13:14:54 +08:00
} = chartConfig;
const selectedAxis: ChartEncodes | null = getSelectedAxis(
selectedChartType,
comboChartAxis,
pieChartAxis,
scatterAxis,
barAndLineAxis
);
return (
2025-04-12 03:32:34 +08:00
<div className="flex h-full w-full flex-col overflow-hidden pt-3">
<MetricStylingAppSegment
2025-02-04 13:14:54 +08:00
className="px-4"
segment={segment}
setSegment={setSegment}
selectedChartType={selectedChartType}
/>
{
//this crazy css selector is so that the available section has a large dropzone
}
<ScrollArea className="h-full [&>div>div]:h-full!">
{segment === MetricStylingAppSegments.VISUALIZE && (
2025-02-04 13:14:54 +08:00
<StylingAppVisualize
2025-04-02 04:40:38 +08:00
className="px-4 pt-3"
2025-02-04 13:14:54 +08:00
columnMetadata={columnMetadata}
2025-02-05 11:57:02 +08:00
rowCount={rowCount}
2025-02-04 13:14:54 +08:00
selectedChartType={selectedChartType}
lineGroupType={lineGroupType}
barGroupType={barGroupType}
barLayout={barLayout}
columnLabelFormats={columnLabelFormats}
columnSettings={columnSettings}
selectedAxis={selectedAxis}
xAxisAxisTitle={xAxisAxisTitle}
xAxisDataZoom={xAxisDataZoom}
xAxisLabelRotation={xAxisLabelRotation}
xAxisShowAxisLabel={xAxisShowAxisLabel}
yAxisAxisTitle={yAxisAxisTitle}
yAxisShowAxisLabel={yAxisShowAxisLabel}
yAxisStartAxisAtZero={yAxisStartAxisAtZero}
yAxisScaleType={yAxisScaleType}
categoryAxisTitle={categoryAxisTitle}
barShowTotalAtTop={barShowTotalAtTop}
y2AxisShowAxisLabel={y2AxisShowAxisLabel}
y2AxisAxisTitle={y2AxisAxisTitle}
y2AxisStartAxisAtZero={y2AxisStartAxisAtZero}
y2AxisScaleType={y2AxisScaleType}
showLegend={showLegend}
showLegendHeadline={showLegendHeadline}
gridLines={gridLines}
goalLines={goalLines}
trendlines={trendlines}
metricColumnId={metricColumnId}
metricHeader={metricHeader}
metricSubHeader={metricSubHeader}
metricValueLabel={metricValueLabel}
metricValueAggregate={metricValueAggregate}
colors={colors}
yAxisShowAxisTitle={yAxisShowAxisTitle}
xAxisShowAxisTitle={xAxisShowAxisTitle}
y2AxisShowAxisTitle={y2AxisShowAxisTitle}
disableTooltip={disableTooltip}
/>
)}
{segment === MetricStylingAppSegments.STYLING && (
2025-02-04 13:14:54 +08:00
<StylingAppStyling
2025-04-02 04:40:38 +08:00
className="px-4"
2025-02-04 13:14:54 +08:00
columnSettings={columnSettings}
showLegend={showLegend}
gridLines={gridLines}
yAxisShowAxisLabel={yAxisShowAxisLabel}
yAxisShowAxisTitle={yAxisShowAxisTitle}
barSortBy={barSortBy}
selectedChartType={selectedChartType}
lineGroupType={lineGroupType}
barGroupType={barGroupType}
yAxisScaleType={yAxisScaleType}
y2AxisScaleType={y2AxisScaleType}
showLegendHeadline={showLegendHeadline}
goalLines={goalLines}
trendlines={trendlines}
pieDisplayLabelAs={pieDisplayLabelAs}
pieLabelPosition={pieLabelPosition}
pieDonutWidth={pieDonutWidth}
pieInnerLabelAggregate={pieInnerLabelAggregate}
pieInnerLabelTitle={pieInnerLabelTitle}
pieShowInnerLabel={pieShowInnerLabel}
pieMinimumSlicePercentage={pieMinimumSlicePercentage}
pieChartAxis={pieChartAxis}
scatterDotSize={scatterDotSize}
selectedAxis={selectedAxis}
columnMetadata={columnMetadata}
columnLabelFormats={columnLabelFormats}
barShowTotalAtTop={barShowTotalAtTop}
2025-02-05 11:57:02 +08:00
rowCount={rowCount}
2025-04-12 05:51:44 +08:00
pieSortBy={pieSortBy}
2025-05-14 00:38:42 +08:00
colors={colors}
2025-02-04 13:14:54 +08:00
/>
)}
{segment === MetricStylingAppSegments.COLORS && (
2025-04-01 07:25:40 +08:00
<StylingAppColors className="px-4" colors={colors} />
2025-02-04 13:14:54 +08:00
)}
2025-04-01 07:22:13 +08:00
</ScrollArea>
2025-02-04 13:14:54 +08:00
</div>
);
};
const getSelectedAxis = (
selectedChartType: ChartType,
comboChartAxis: ChartEncodes,
pieChartAxis: ChartEncodes,
scatterAxis: ScatterAxis,
barAndLineAxis: BarAndLineAxis
) => {
if (selectedChartType === ChartType.Combo) return comboChartAxis;
if (selectedChartType === ChartType.Pie) return pieChartAxis;
if (selectedChartType === ChartType.Scatter) return scatterAxis;
if (selectedChartType === ChartType.Bar) return barAndLineAxis;
if (selectedChartType === ChartType.Line) return barAndLineAxis;
return barAndLineAxis;
};