diff --git a/packages/ag-charts-community-examples/src/charts-overview/examples/chart-customisation/main.ts b/packages/ag-charts-community-examples/src/charts-overview/examples/chart-customisation/main.ts index 86919619363..c8b368a5e2e 100644 --- a/packages/ag-charts-community-examples/src/charts-overview/examples/chart-customisation/main.ts +++ b/packages/ag-charts-community-examples/src/charts-overview/examples/chart-customisation/main.ts @@ -114,7 +114,7 @@ const options: AgChartOptions = { ], legend: { item: { - paddingX: 40, + padding: { x: 40 }, marker: { strokeWidth: 0, padding: 10, diff --git a/packages/ag-charts-community-examples/src/charts-overview/examples/line-with-gaps/main.ts b/packages/ag-charts-community-examples/src/charts-overview/examples/line-with-gaps/main.ts index 20fdb0cdd82..cb1a28deaef 100644 --- a/packages/ag-charts-community-examples/src/charts-overview/examples/line-with-gaps/main.ts +++ b/packages/ag-charts-community-examples/src/charts-overview/examples/line-with-gaps/main.ts @@ -220,7 +220,7 @@ const options: AgChartOptions = { ], legend: { item: { - paddingY: 15, + padding: { y: 15 }, }, spacing: 30, }, diff --git a/packages/ag-charts-community/src/chart/agChart.test.ts b/packages/ag-charts-community/src/chart/agChart.test.ts index 58da25605e1..04eadb4e159 100644 --- a/packages/ag-charts-community/src/chart/agChart.test.ts +++ b/packages/ag-charts-community/src/chart/agChart.test.ts @@ -78,7 +78,7 @@ describe('AgChart', () => { ], legend: { item: { - paddingY: 16, + padding: { y: 16 }, }, }, }); @@ -134,10 +134,7 @@ describe('AgChart', () => { expect(chart.width).toBe(500); expect(chart.height).toBe(500); expect(chart.data.data.length).toBe(4); - expect(chart.padding.top).toBe(30); - expect(chart.padding.right).toBe(40); - expect(chart.padding.bottom).toBe(50); - expect(chart.padding.left).toBe(60); + expect(chart.padding).toEqual({ top: 30, right: 40, bottom: 50, left: 60 }); expect(chart.title?.enabled).toBe(theme.config.line.title.enabled); expect(chart.title?.text).toBe(theme.config.line.title.text); @@ -173,7 +170,7 @@ describe('AgChart', () => { ], legend: { item: { - paddingY: 16, + padding: { y: 16 }, }, }, }); diff --git a/packages/ag-charts-community/src/chart/cartesianChart.ts b/packages/ag-charts-community/src/chart/cartesianChart.ts index 31254c9fe51..60f8f134ce4 100644 --- a/packages/ag-charts-community/src/chart/cartesianChart.ts +++ b/packages/ag-charts-community/src/chart/cartesianChart.ts @@ -278,7 +278,7 @@ export class CartesianChart extends Chart { const { primaryTickCount, bbox } = axis.calculateLayout( axis.nice ? primaryTickCounts[direction] : undefined, - { sizeLimit: axisWidth - axis.label.spacing, padding: this.padding } + { sizeLimit: axisWidth - axis.label.spacing, padding: this.paddingInternal } ); primaryTickCounts[direction] ??= primaryTickCount; diff --git a/packages/ag-charts-community/src/chart/chart.ts b/packages/ag-charts-community/src/chart/chart.ts index 63b4d3544ce..a0c7a518313 100644 --- a/packages/ag-charts-community/src/chart/chart.ts +++ b/packages/ag-charts-community/src/chart/chart.ts @@ -26,6 +26,7 @@ import type { AgMiniChartSeriesOptions, AgPolarAxisOptions, FormatterConfiguration, + Padding as PaddingOption, SeriesOptionsTypes, SeriesType, TextOrSegments, @@ -208,7 +209,15 @@ export abstract class Chart extends Observable implements ModuleInstance, ChartS private readonly chartCaptions = new ChartCaptions(); @Property - readonly padding = new Padding(20); + readonly padding!: PaddingOption; + get paddingInternal(): Padding { + const padding = this.padding; + if (typeof padding === 'number') { + return new Padding(padding, padding, padding, padding); + } else { + return new Padding(padding.top, padding.right, padding.bottom, padding.left); + } + } get seriesAreaBoundingBox() { return this.seriesAreaManager.bbox; @@ -362,7 +371,7 @@ export abstract class Chart extends Observable implements ModuleInstance, ChartS this.seriesAreaManager = new SeriesAreaManager(this.initSeriesAreaDependencies()); this.cleanup.register( ctx.layoutManager.registerElement(LayoutElement.Caption, (e) => { - e.layoutBox.shrink(this.padding.toJson()); + e.layoutBox.shrink(this.paddingInternal.toJson()); this.chartCaptions.positionCaptions(e); }), ctx.eventsHub.on('layout:complete', (e) => this.chartCaptions.positionAbsoluteCaptions(e)), @@ -1178,7 +1187,7 @@ export abstract class Chart extends Observable implements ModuleInstance, ChartS this.ctx.seriesLabelLayoutManager.updateLabels( this.series.filter((s) => s.visible && s.usesPlacedLabels), - this.padding, + this.paddingInternal, this.seriesRect ); } diff --git a/packages/ag-charts-community/src/chart/commonOptionsDefs.ts b/packages/ag-charts-community/src/chart/commonOptionsDefs.ts index 5d52d5db87b..548bcb6cace 100644 --- a/packages/ag-charts-community/src/chart/commonOptionsDefs.ts +++ b/packages/ag-charts-community/src/chart/commonOptionsDefs.ts @@ -34,6 +34,7 @@ import { optionsDefs, or, padding, + paddingSide, positiveNumber, ratio, required, @@ -310,12 +311,7 @@ export const commonChartOptionsDefs: OptionsDefs p.endIndex >= trackingIndex); this.pagination.currentPage = clamp(0, newCurrentPage, pages.length - 1); - const { paddingX: itemPaddingX, paddingY: itemPaddingY } = this.item; const paginationComponentPadding = 8; - const legendItemsWidth = maxPageWidth - itemPaddingX; - const legendItemsHeight = maxPageHeight - itemPaddingY; + const legendItemsWidth = maxPageWidth - this.getItemPaddingX(); + const legendItemsHeight = maxPageHeight - this.getItemPaddingY(); let paginationX = 0; let paginationY = -paginationBBox.y - this.item.marker.size / 2; @@ -704,7 +709,8 @@ export class Legend extends BaseProperties { } private calculatePagination(bboxes: BBox[], width: number, height: number) { - const { paddingX: itemPaddingX, paddingY: itemPaddingY } = this.item; + const itemPaddingX = this.getItemPaddingX(); + const itemPaddingY = this.getItemPaddingY(); const vertPositions: readonly AgChartLegendPosition[] = [ 'left', @@ -772,11 +778,7 @@ export class Legend extends BaseProperties { } private updatePositions(pageNumber: number = 0) { - const { - item: { paddingY }, - itemSelection, - pages, - } = this; + const { itemSelection, pages } = this; if (pages.length < 1 || !pages[pageNumber]) { return; @@ -792,7 +794,7 @@ export class Legend extends BaseProperties { const rowCount = columns[0].indices.length; const horizontal = this.getOrientation() === 'horizontal'; - const itemHeight = columns[0].bboxes[0].height + paddingY; + const itemHeight = columns[0].bboxes[0].height + this.getItemPaddingY(); const rowSumColumnWidths: number[] = []; @@ -946,6 +948,16 @@ export class Legend extends BaseProperties { ); } + private getItemPaddingX() { + const { padding } = this.item; + return typeof padding === 'number' ? padding : padding.x ?? 0; + } + + private getItemPaddingY() { + const { padding } = this.item; + return typeof padding === 'number' ? padding : padding.y ?? 0; + } + private computePagedBBox(): BBox { // Get BBox without group transforms applied. const actualBBox = Group.computeChildrenBBox(this.group.excludeChildren({ name: 'legend-container' })); diff --git a/packages/ag-charts-community/src/chart/legend/legendModule.ts b/packages/ag-charts-community/src/chart/legend/legendModule.ts index 22de3b3f9d5..6233307220a 100644 --- a/packages/ag-charts-community/src/chart/legend/legendModule.ts +++ b/packages/ag-charts-community/src/chart/legend/legendModule.ts @@ -8,6 +8,7 @@ import { fontOptionsDef, number, padding, + paddingSide, positiveNumber, ratio, strokeOptionsDef, @@ -58,6 +59,7 @@ export const LegendModule: PluginModuleDefinition = { maxWidth: positiveNumber, paddingX: positiveNumber, paddingY: positiveNumber, + padding: paddingSide, showSeriesStroke: boolean, }, pagination: { diff --git a/packages/ag-charts-community/src/chart/polarChart.ts b/packages/ag-charts-community/src/chart/polarChart.ts index 0de42553190..bc4112029c6 100644 --- a/packages/ag-charts-community/src/chart/polarChart.ts +++ b/packages/ag-charts-community/src/chart/polarChart.ts @@ -3,7 +3,6 @@ import { iterate } from 'ag-charts-core'; import type { ChartOptions } from '../module/optionsModule'; import { BBox } from '../scene/bbox'; -import { Padding } from '../util/padding'; import { PolarAxis } from './axis/polarAxis'; import type { TransferableResources } from './chart'; import { Chart } from './chart'; @@ -17,8 +16,6 @@ export class PolarChart extends Chart { static readonly className = 'PolarChart'; static readonly type = 'polar' as const; - override padding = new Padding(40); - constructor(options: ChartOptions, resources?: TransferableResources) { super(options, resources); this.ctx.axisManager.axisGroup.zIndex = ZIndexMap.AXIS_FOREGROUND; diff --git a/packages/ag-charts-community/src/chart/test/examples.ts b/packages/ag-charts-community/src/chart/test/examples.ts index d3f24578f30..fefaec8aaf5 100644 --- a/packages/ag-charts-community/src/chart/test/examples.ts +++ b/packages/ag-charts-community/src/chart/test/examples.ts @@ -4310,7 +4310,7 @@ export const TRUNCATED_LEGEND_ITEMS: AgCartesianChartOptions = { legend: { position: 'left', item: { - paddingY: 15, + padding: { y: 15 }, maxWidth: 100, }, }, diff --git a/packages/ag-charts-community/src/chart/themes/chartTheme.ts b/packages/ag-charts-community/src/chart/themes/chartTheme.ts index 4a89bd52a9c..5250d192bf9 100644 --- a/packages/ag-charts-community/src/chart/themes/chartTheme.ts +++ b/packages/ag-charts-community/src/chart/themes/chartTheme.ts @@ -313,6 +313,7 @@ export class ChartTheme { minWidth: 300, background: { visible: true, fill: { $ref: 'chartBackgroundColor' } }, padding: { + // Default each side to allow the user to override them individually top: { $ref: 'chartPadding' }, right: { $ref: 'chartPadding' }, bottom: { $ref: 'chartPadding' }, @@ -412,8 +413,10 @@ export class ChartTheme { listeners: {}, toggleSeries: true, item: { - paddingX: 16, - paddingY: 8, + padding: { + x: { $path: ['./paddingX', 16] }, + y: { $path: ['./paddingY', 8] }, + }, marker: { size: 15, padding: 8 }, showSeriesStroke: true, label: { diff --git a/packages/ag-charts-community/src/chart/update/processor.ts b/packages/ag-charts-community/src/chart/update/processor.ts index 3a4d759a018..338e7310d8e 100644 --- a/packages/ag-charts-community/src/chart/update/processor.ts +++ b/packages/ag-charts-community/src/chart/update/processor.ts @@ -1,15 +1,10 @@ import type { Scale } from 'ag-charts-core'; -import type { Group } from '../../scene/group'; -import type { Padding } from '../../util/padding'; - /** Interface to abstract from the actual chart implementation. */ export interface ChartLike { context?: unknown; axes: AxisLike[]; series: SeriesLike[]; - seriesRoot: Group; - padding: Padding; } export interface AxisLike { diff --git a/packages/ag-charts-community/src/module/__snapshots__/optionsModule.test.ts.snap b/packages/ag-charts-community/src/module/__snapshots__/optionsModule.test.ts.snap index b0e1493200d..fc21521862c 100644 --- a/packages/ag-charts-community/src/module/__snapshots__/optionsModule.test.ts.snap +++ b/packages/ag-charts-community/src/module/__snapshots__/optionsModule.test.ts.snap @@ -201,8 +201,10 @@ exports[`ChartOptions #prepareOptions for ADV_CHART_CUSTOMISATION it should prep "size": 20, "strokeWidth": 0, }, - "paddingX": 40, - "paddingY": 8, + "padding": { + "x": 40, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -683,8 +685,10 @@ exports[`ChartOptions #prepareOptions for ADV_COMBINATION_SERIES_CHART_EXAMPLE i "size": 15, "strokeWidth": 0, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -1118,8 +1122,10 @@ exports[`ChartOptions #prepareOptions for ADV_CUSTOM_MARKER_SHAPES_EXAMPLE it sh "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -1815,8 +1821,10 @@ exports[`ChartOptions #prepareOptions for ADV_CUSTOM_TOOLTIPS_EXAMPLE it should "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -2589,8 +2597,10 @@ exports[`ChartOptions #prepareOptions for ADV_PER_MARKER_CUSTOMISATION_EXAMPLE i "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -2906,8 +2916,10 @@ exports[`ChartOptions #prepareOptions for ADV_TIME_AXIS_WITH_IRREGULAR_INTERVALS "size": 15, "strokeWidth": 0, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -3387,8 +3399,10 @@ exports[`ChartOptions #prepareOptions for AREA_GRAPH_WITH_NEGATIVE_VALUES_EXAMPL "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -4008,8 +4022,10 @@ exports[`ChartOptions #prepareOptions for BAR_CHART_EXAMPLE it should prepare op "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -4315,8 +4331,10 @@ exports[`ChartOptions #prepareOptions for BAR_CHART_WITH_LABELS_EXAMPLE it shoul "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -4627,8 +4645,10 @@ exports[`ChartOptions #prepareOptions for BUBBLE_GRAPH_WITH_CATEGORIES_EXAMPLE i "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -4921,8 +4941,10 @@ exports[`ChartOptions #prepareOptions for BUBBLE_GRAPH_WITH_NEGATIVE_VALUES_EXAM "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -5214,8 +5236,10 @@ exports[`ChartOptions #prepareOptions for COLUMN_CHART_WITH_NEGATIVE_VALUES_EXAM "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -5593,8 +5617,10 @@ exports[`ChartOptions #prepareOptions for GROUPED_BAR_CHART_EXAMPLE it should pr "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -5979,8 +6005,10 @@ exports[`ChartOptions #prepareOptions for GROUPED_COLUMN_EXAMPLE it should prepa "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -6721,8 +6749,10 @@ exports[`ChartOptions #prepareOptions for LINE_GRAPH_WITH_GAPS_EXAMPLE it should "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 15, + "padding": { + "x": 16, + "y": 15, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -8017,8 +8047,10 @@ exports[`ChartOptions #prepareOptions for LOG_AXIS_EXAMPLE it should prepare opt "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -8317,8 +8349,10 @@ exports[`ChartOptions #prepareOptions for ONE_HUNDRED_PERCENT_STACKED_AREA_GRAPH "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -9148,8 +9182,10 @@ exports[`ChartOptions #prepareOptions for ONE_HUNDRED_PERCENT_STACKED_BAR_EXAMPL "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -9609,8 +9645,10 @@ exports[`ChartOptions #prepareOptions for ONE_HUNDRED_PERCENT_STACKED_COLUMNS_EX "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -10300,8 +10338,10 @@ exports[`ChartOptions #prepareOptions for SIMPLE_AREA_GRAPH_EXAMPLE it should pr "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -10822,8 +10862,10 @@ exports[`ChartOptions #prepareOptions for SIMPLE_COLUMN_CHART_EXAMPLE it should "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -11021,8 +11063,10 @@ exports[`ChartOptions #prepareOptions for SIMPLE_DONUT_CHART_EXAMPLE it should p "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -11442,8 +11486,10 @@ exports[`ChartOptions #prepareOptions for SIMPLE_LINE_CHART_EXAMPLE it should pr "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -11702,8 +11748,10 @@ exports[`ChartOptions #prepareOptions for SIMPLE_PIE_CHART_EXAMPLE it should pre "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -12056,8 +12104,10 @@ exports[`ChartOptions #prepareOptions for SIMPLE_SCATTER_CHART_EXAMPLE it should "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -12369,8 +12419,10 @@ exports[`ChartOptions #prepareOptions for STACKED_AREA_GRAPH_EXAMPLE it should p "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -13091,8 +13143,10 @@ exports[`ChartOptions #prepareOptions for STACKED_BAR_CHART_EXAMPLE it should pr "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, @@ -13622,8 +13676,10 @@ exports[`ChartOptions #prepareOptions for STACKED_COLUMN_GRAPH_EXAMPLE it should "padding": 8, "size": 15, }, - "paddingX": 16, - "paddingY": 8, + "padding": { + "x": 16, + "y": 8, + }, "showSeriesStroke": true, }, "listeners": {}, diff --git a/packages/ag-charts-community/src/module/optionsGraph.ts b/packages/ag-charts-community/src/module/optionsGraph.ts index a221a2ef976..76c788a65a9 100644 --- a/packages/ag-charts-community/src/module/optionsGraph.ts +++ b/packages/ag-charts-community/src/module/optionsGraph.ts @@ -919,7 +919,11 @@ export class OptionsGraph extends AdjacencyListGraph implements this.resolveVertexInEdgePriority(vertex, object, pathArray, prune); this.resolveVertexAutoEnable(vertex, object, pathArray); + + // Do not resolve the children if the user has provided a plain value or empty object to this vertex + // if (resolvedVertexOnEdge !== USER_OPTIONS_EDGE) { this.resolveVertexChildren(vertex, object, prune); + // } } private resolveVertexInEdgePriority( @@ -957,7 +961,10 @@ export class OptionsGraph extends AdjacencyListGraph implements // const safeValue = isObject(value) ? deepClone(value) : value; setPathSafe(object, pathArray, value); } - break; + + const isEmptyObject = value && typeof value === 'object' && Object.keys(value).length === 0; + if (isEmptyObject) return; + return edgeValue; } } diff --git a/packages/ag-charts-core/src/options/commonOptionsDefs.ts b/packages/ag-charts-core/src/options/commonOptionsDefs.ts index 708a798951e..28a5c496ded 100644 --- a/packages/ag-charts-core/src/options/commonOptionsDefs.ts +++ b/packages/ag-charts-core/src/options/commonOptionsDefs.ts @@ -21,6 +21,7 @@ import type { LabelBoxOptions, LineDashOptions, PaddingOptions, + PaddingSideOptions, StrokeOptions, } from 'ag-charts-types'; @@ -341,10 +342,23 @@ export const fontOptionsDef: OptionsDefs = { }; export const paddingOptions = optionsDefs( - { top: number, right: number, bottom: number, left: number }, + { + top: positiveNumber, + right: positiveNumber, + bottom: positiveNumber, + left: positiveNumber, + }, + 'padding object' +); +export const paddingSideOptions = optionsDefs( + { + x: positiveNumber, + y: positiveNumber, + }, 'padding object' ); export const padding = or(number, paddingOptions); +export const paddingSide = or(number, paddingSideOptions); export const borderOptionsDef: OptionsDefs = { enabled: boolean, diff --git a/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-1-snap.png b/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-1-snap.png new file mode 100644 index 00000000000..acd920c7719 Binary files /dev/null and b/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-1-snap.png differ diff --git a/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-2-snap.png b/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-2-snap.png new file mode 100644 index 00000000000..71ac8b56ef6 Binary files /dev/null and b/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-2-snap.png differ diff --git a/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-3-snap.png b/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-3-snap.png new file mode 100644 index 00000000000..acd920c7719 Binary files /dev/null and b/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-3-snap.png differ diff --git a/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-4-snap.png b/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-4-snap.png new file mode 100644 index 00000000000..71ac8b56ef6 Binary files /dev/null and b/packages/ag-charts-enterprise/src/__image_snapshots__/integrated-charts-examples-test-ts-integrated-charts-examples-switching-between-charts-with-different-theme-overrides-should-switch-between-charts-with-different-theme-overrides-4-snap.png differ diff --git a/packages/ag-charts-enterprise/src/integratedChartsExamples.test.ts b/packages/ag-charts-enterprise/src/integratedChartsExamples.test.ts index 366b99d6146..b510f34c036 100644 --- a/packages/ag-charts-enterprise/src/integratedChartsExamples.test.ts +++ b/packages/ag-charts-enterprise/src/integratedChartsExamples.test.ts @@ -41,9 +41,8 @@ describe('Integrated Charts Examples', () => { describe('Changing Chart Type', () => { let index = 0; for (const [exampleName, example] of Object.entries(EXAMPLES)) { - index++; - it(`for ${exampleName} it should render to canvas as expected`, async () => { + index++; const startingOptions: AgChartOptions = EXAMPLES[Object.keys(EXAMPLES)[index - 1]]?.options ?? {}; prepareEnterpriseTestOptions(startingOptions); @@ -79,6 +78,26 @@ describe('Integrated Charts Examples', () => { }); }); + describe('Switching between charts with different theme overrides', () => { + const examples = [EXAMPLES.RADAR_LINE_BASIC, EXAMPLES.CROSSFILTER_PIE_FILTERED]; + + it('should switch between charts with different theme overrides', async () => { + const options: AgChartOptions = { ...examples.at(-1)?.options }; + prepareEnterpriseTestOptions(options); + + chart = AgCharts.create(options); + await waitForChartStability(chart); + + for (let i = 0; i < 2; i++) { + for (const example of examples) { + const updatedOptions = prepareEnterpriseTestOptions({ ...example.options }); + await chart.update(updatedOptions); + await compare(); + } + } + }); + }); + describe('line series animation', () => { describe('initial', () => { const animate = spyOnAnimationManager(); diff --git a/packages/ag-charts-types/src/chart/chartOptions.ts b/packages/ag-charts-types/src/chart/chartOptions.ts index 109c07c90b0..e817ababc23 100644 --- a/packages/ag-charts-types/src/chart/chartOptions.ts +++ b/packages/ag-charts-types/src/chart/chartOptions.ts @@ -206,8 +206,8 @@ export interface AgBaseThemeableChartOptions { paddingX?: PixelSize; /** The vertical spacing in pixels to use between legend items. */ paddingY?: PixelSize; + /** The padding in pixels to use between legend items. */ + padding?: PaddingSide; /** Set to `false` to hide the legend line line representing the stroke styling of line and area series. * If enabled, legend marker will be hidden if series markers are disabled. */ showSeriesStroke?: boolean; diff --git a/packages/ag-charts-types/src/series/cartesian/commonOptions.ts b/packages/ag-charts-types/src/series/cartesian/commonOptions.ts index 045a5696e60..5e7c6db8658 100644 --- a/packages/ag-charts-types/src/series/cartesian/commonOptions.ts +++ b/packages/ag-charts-types/src/series/cartesian/commonOptions.ts @@ -178,6 +178,7 @@ export interface FontOptions { } export type Padding = PixelSize | PaddingOptions; +export type PaddingSide = PixelSize | PaddingSideOptions; export interface PaddingOptions { /** The number of pixels of padding at the top. */ @@ -190,6 +191,13 @@ export interface PaddingOptions { left?: PixelSize; } +export interface PaddingSideOptions { + /** The number of pixels of padding at the top. */ + x?: PixelSize; + /** The number of pixels of padding at the right. */ + y?: PixelSize; +} + export interface BorderOptions extends Toggleable, StrokeOptions {} /** diff --git a/packages/ag-charts-website/src/content/docs/benchmarks/_examples/multi-series/main.ts b/packages/ag-charts-website/src/content/docs/benchmarks/_examples/multi-series/main.ts index d0656ea8f9e..98a78bb30dd 100644 --- a/packages/ag-charts-website/src/content/docs/benchmarks/_examples/multi-series/main.ts +++ b/packages/ag-charts-website/src/content/docs/benchmarks/_examples/multi-series/main.ts @@ -243,7 +243,7 @@ const options: AgCartesianChartOptions = { legend: { position: 'bottom', item: { - paddingY: 15, + padding: { y: 15 }, }, spacing: 30, }, diff --git a/packages/ag-charts-website/src/content/docs/legend/_examples/legend-constraints/index.html b/packages/ag-charts-website/src/content/docs/legend/_examples/legend-constraints/index.html index 0be15826bbf..6bc04db46e8 100644 --- a/packages/ag-charts-website/src/content/docs/legend/_examples/legend-constraints/index.html +++ b/packages/ag-charts-website/src/content/docs/legend/_examples/legend-constraints/index.html @@ -1,6 +1,6 @@
- + 32 - + 8
diff --git a/packages/ag-charts-website/src/content/docs/legend/_examples/legend-constraints/main.ts b/packages/ag-charts-website/src/content/docs/legend/_examples/legend-constraints/main.ts index c84d92f22bc..bbffd670dc1 100644 --- a/packages/ag-charts-website/src/content/docs/legend/_examples/legend-constraints/main.ts +++ b/packages/ag-charts-website/src/content/docs/legend/_examples/legend-constraints/main.ts @@ -1,4 +1,4 @@ -import { AgCharts, AgPolarChartOptions } from 'ag-charts-community'; +import { AgCharts, AgPolarChartOptions, PaddingSideOptions } from 'ag-charts-community'; import { getData } from './data'; @@ -16,8 +16,7 @@ const options: AgPolarChartOptions = { maxHeight: 200, item: { maxWidth: 130, - paddingX: 32, - paddingY: 8, + padding: { x: 32, y: 8 }, marker: { padding: 8, }, @@ -28,25 +27,25 @@ const options: AgPolarChartOptions = { const chart = AgCharts.create(options); function updateLegendItemPaddingX(event: any) { - var value = +event.target.value; + const value = Number(event.target.value); - options.legend!.item!.paddingX = value; + (options.legend!.item!.padding as PaddingSideOptions).x = value; chart.update(options); document.getElementById('xPaddingValue')!.innerHTML = String(value); } function updateLegendItemPaddingY(event: any) { - var value = event.target.value; + const value = Number(event.target.value); - options.legend!.item!.paddingY = +event.target.value; + (options.legend!.item!.padding as PaddingSideOptions).y = value; chart.update(options); document.getElementById('yPaddingValue')!.innerHTML = String(value); } -function updateLegendItemSpacing(event: any) { - var value = +event.target.value; +function updateLegendMarkerPadding(event: any) { + const value = Number(event.target.value); options.legend!.item!.marker!.padding = value; chart.update(options); @@ -55,7 +54,7 @@ function updateLegendItemSpacing(event: any) { } function updateLegendItemMaxWidth(event: any) { - var value = +event.target.value; + const value = Number(event.target.value); options.legend!.item!.maxWidth = value; chart.update(options); diff --git a/packages/ag-charts-website/src/content/docs/legend/index.mdoc b/packages/ag-charts-website/src/content/docs/legend/index.mdoc index 5bf6b951c16..48272197705 100644 --- a/packages/ag-charts-website/src/content/docs/legend/index.mdoc +++ b/packages/ag-charts-website/src/content/docs/legend/index.mdoc @@ -108,8 +108,10 @@ It is possible to add padding between and within the Legend items. legend: { item: { maxWidth: 130, - paddingX: 32, - paddingY: 8, + padding: { + x: 32, + y: 8 + }, marker: { padding: 8, }, diff --git a/packages/ag-charts-website/src/content/docs/series-highlighting/_examples/lines/main.ts b/packages/ag-charts-website/src/content/docs/series-highlighting/_examples/lines/main.ts index 55480dab452..73cf385dc82 100644 --- a/packages/ag-charts-website/src/content/docs/series-highlighting/_examples/lines/main.ts +++ b/packages/ag-charts-website/src/content/docs/series-highlighting/_examples/lines/main.ts @@ -239,7 +239,7 @@ const options: AgCartesianChartOptions = { ], legend: { item: { - paddingY: 15, + padding: { y: 15 }, }, spacing: 30, },