From 9e324dac7cf551c194e0ab73b1da63d54c3dfc5e Mon Sep 17 00:00:00 2001 From: "Irina V. Kuzmina" Date: Thu, 4 Dec 2025 10:55:22 +0300 Subject: [PATCH] Fix axis config for split sections --- .../datalens/gravity-charts/utils/index.ts | 66 +++++++++++-------- .../preparers/bar-x/gravity-charts.ts | 10 ++- .../datalens/preparers/line/gravity-charts.ts | 10 ++- 3 files changed, 51 insertions(+), 35 deletions(-) diff --git a/src/server/modes/charts/plugins/datalens/gravity-charts/utils/index.ts b/src/server/modes/charts/plugins/datalens/gravity-charts/utils/index.ts index 4c4bcee12a..3b15f1a50a 100644 --- a/src/server/modes/charts/plugins/datalens/gravity-charts/utils/index.ts +++ b/src/server/modes/charts/plugins/datalens/gravity-charts/utils/index.ts @@ -1,4 +1,4 @@ -import type {ChartData, ChartTitle} from '@gravity-ui/chartkit/gravity-charts'; +import type {ChartData, ChartTitle, ChartYAxis} from '@gravity-ui/chartkit/gravity-charts'; import {PlaceholderId, WizardVisualizationId, isDateField} from '../../../../../../../shared'; import type { @@ -50,6 +50,40 @@ function getAxisMinMax( return [Number.isNaN(min) ? undefined : min, Number.isNaN(max) ? undefined : max]; } +export function getYAxisBaseConfig({ + visualization, +}: { + visualization: {id: string; placeholders: ServerPlaceholder[]}; +}): ChartYAxis { + const yPlaceholder = visualization.placeholders.find((p) => p.id === PlaceholderId.Y); + const yPlaceholderSettings = yPlaceholder?.settings || {}; + const yItem = yPlaceholder?.items[0]; + + const [yMin, yMax] = getAxisMinMax(yPlaceholderSettings); + + return { + // todo: the axis type should depend on the type of field + type: isDateField(yItem) ? 'datetime' : 'linear', + visible: yPlaceholderSettings?.axisVisibility !== 'hide', + labels: { + enabled: Boolean(yItem) && yPlaceholder?.settings?.hideLabels !== 'yes', + rotation: getAxisLabelsRotationAngle(yPlaceholder?.settings), + }, + title: { + text: getAxisTitle(yPlaceholderSettings, yItem) || undefined, + }, + grid: { + enabled: Boolean(yItem) && isGridEnabled(yPlaceholderSettings), + }, + ticks: { + pixelInterval: getTickPixelInterval(yPlaceholderSettings) || 72, + }, + lineColor: 'var(--g-color-line-generic)', + min: yMin, + max: yMax, + }; +} + export function getBaseChartConfig(args: { extraSettings?: ServerCommonSharedExtraSettings; visualization: {id: string; placeholders: ServerPlaceholder[]}; @@ -61,10 +95,6 @@ export function getBaseChartConfig(args: { const xItem = xPlaceholder?.items[0]; const xPlaceholderSettings = xPlaceholder?.settings || {}; - const yPlaceholder = visualization.placeholders.find((p) => p.id === PlaceholderId.Y); - const yPlaceholderSettings = yPlaceholder?.settings || {}; - const yItem = yPlaceholder?.items[0]; - let chartWidgetData: Partial = { title: getChartTitle(extraSettings), tooltip: { @@ -128,7 +158,7 @@ export function getBaseChartConfig(args: { if (!visualizationWithoutAxis.includes(visualizationId)) { const [xMin, xMax] = getAxisMinMax(xPlaceholderSettings); - const [yMin, yMax] = getAxisMinMax(yPlaceholderSettings); + chartWidgetData = { ...chartWidgetData, xAxis: { @@ -150,29 +180,7 @@ export function getBaseChartConfig(args: { min: xMin, max: xMax, }, - yAxis: [ - { - // todo: the axis type should depend on the type of field - type: isDateField(yItem) ? 'datetime' : 'linear', - visible: yPlaceholderSettings?.axisVisibility !== 'hide', - labels: { - enabled: Boolean(yItem) && yPlaceholder?.settings?.hideLabels !== 'yes', - rotation: getAxisLabelsRotationAngle(yPlaceholder?.settings), - }, - title: { - text: getAxisTitle(yPlaceholderSettings, yItem) || undefined, - }, - grid: { - enabled: Boolean(yItem) && isGridEnabled(yPlaceholderSettings), - }, - ticks: { - pixelInterval: getTickPixelInterval(yPlaceholderSettings) || 72, - }, - lineColor: 'var(--g-color-line-generic)', - min: yMin, - max: yMax, - }, - ], + yAxis: [getYAxisBaseConfig({visualization})], }; if (visualizationWithYMainAxis.includes(visualizationId)) { diff --git a/src/server/modes/charts/plugins/datalens/preparers/bar-x/gravity-charts.ts b/src/server/modes/charts/plugins/datalens/preparers/bar-x/gravity-charts.ts index 04152052d8..1b3593a8ad 100644 --- a/src/server/modes/charts/plugins/datalens/preparers/bar-x/gravity-charts.ts +++ b/src/server/modes/charts/plugins/datalens/preparers/bar-x/gravity-charts.ts @@ -22,7 +22,7 @@ import { isNumberField, } from '../../../../../../../shared'; import type {WrappedHTML} from '../../../../../../../shared/types/charts'; -import {getBaseChartConfig} from '../../gravity-charts/utils'; +import {getBaseChartConfig, getYAxisBaseConfig} from '../../gravity-charts/utils'; import {getFormattedLabel} from '../../gravity-charts/utils/dataLabels'; import {getFieldFormatOptions} from '../../gravity-charts/utils/format'; import {getConfigWithActualFieldTypes} from '../../utils/config-helpers'; @@ -232,14 +232,18 @@ export function prepareGravityChartBarX(args: PrepareFunctionArgs) { legend, xAxis, yAxis: segments.map((d) => { - return { + const axisBaseConfig = getYAxisBaseConfig({ + visualization: {placeholders, id: visualizationId}, + }); + + return merge(axisBaseConfig, { labels: { numberFormat: axisLabelNumberFormat ?? undefined, }, plotIndex: d.index, position: d.isOpposite ? 'right' : 'left', title: isSplitEnabled ? {text: d.title} : undefined, - }; + }); }), split: { enable: isSplitEnabled, diff --git a/src/server/modes/charts/plugins/datalens/preparers/line/gravity-charts.ts b/src/server/modes/charts/plugins/datalens/preparers/line/gravity-charts.ts index 2ec717e93f..7a84814416 100644 --- a/src/server/modes/charts/plugins/datalens/preparers/line/gravity-charts.ts +++ b/src/server/modes/charts/plugins/datalens/preparers/line/gravity-charts.ts @@ -23,7 +23,7 @@ import { isMarkupField, isNumberField, } from '../../../../../../../shared'; -import {getBaseChartConfig} from '../../gravity-charts/utils'; +import {getBaseChartConfig, getYAxisBaseConfig} from '../../gravity-charts/utils'; import {getFormattedLabel} from '../../gravity-charts/utils/dataLabels'; import {getFieldFormatOptions} from '../../gravity-charts/utils/format'; import {getConfigWithActualFieldTypes} from '../../utils/config-helpers'; @@ -192,11 +192,15 @@ export function prepareGravityChartLine(args: PrepareFunctionArgs) { }, xAxis, yAxis: segments.map((d) => { - return { + const axisBaseConfig = getYAxisBaseConfig({ + visualization: {placeholders, id: visualizationId}, + }); + + return merge(axisBaseConfig, { title: isSplitEnabled ? {text: d.title} : undefined, plotIndex: d.index, position: d.isOpposite ? 'right' : 'left', - }; + }); }), split: { enable: isSplitEnabled,