Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add getLabelItems public method #10966

Merged
merged 11 commits into from Dec 16, 2022
39 changes: 23 additions & 16 deletions src/core/core.scale.js
Expand Up @@ -359,6 +359,14 @@ export default class Scale extends Element {
return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];
}

/**
* @return {import('../types.js').LabelItem[]}
*/
getLabelItems(chartArea = this.chart.chartArea) {
const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));
return items;
}

// When a new layout is created, reset the data limits cache
beforeLayout() {
this._cache = {};
Expand Down Expand Up @@ -1292,17 +1300,19 @@ export default class Scale extends Element {
}

items.push({
rotation,
label,
font,
color,
strokeColor,
strokeWidth,
textOffset,
textAlign: tickTextAlign,
textBaseline,
translation: [x, y],
backdrop,
options: {
rotation,
color,
strokeColor,
strokeWidth,
textAlign: tickTextAlign,
textBaseline,
translation: [x, y],
backdrop,
}
});
}

Expand Down Expand Up @@ -1549,16 +1559,13 @@ export default class Scale extends Element {
clipArea(ctx, area);
}

const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));
let i, ilen;

for (i = 0, ilen = items.length; i < ilen; ++i) {
const item = items[i];
const items = this.getLabelItems(chartArea);
for (const item of items) {
const renderTextOptions = item.options;
const tickFont = item.font;
const label = item.label;

let y = item.textOffset;
renderText(ctx, label, 0, y, tickFont, item);
const y = item.textOffset;
renderText(ctx, label, 0, y, tickFont, renderTextOptions);
}

if (area) {
Expand Down
4 changes: 2 additions & 2 deletions test/specs/core.scale.tests.js
Expand Up @@ -720,9 +720,9 @@ describe('Core.scale', function() {
}
}
});
const mapper = item => parseFloat(item.translation[0].toFixed(2));
const mapper = item => parseFloat(item.options.translation[0].toFixed(2));
const expected = [20.15, 113.6, 207.05, 300.5, 393.95, 487.4];
const actual = chart.scales.x._labelItems.map(mapper);
const actual = chart.scales.x.getLabelItems().map(mapper);
const len = expected.length;
for (let i = 0; i < len; ++i) {
const actualValue = actual[i];
Expand Down
38 changes: 35 additions & 3 deletions types/helpers/helpers.canvas.d.ts
@@ -1,4 +1,4 @@
import { PointStyle } from '../index.js';
import { PointStyle, Scriptable, ScriptableScaleContext } from '../index.js';
import { Color } from '../color.js';
import { ChartArea, RoundedRect } from '../geometric.js';
import { CanvasFontSpec } from '../../src/helpers/helpers.options.js';
Expand Down Expand Up @@ -72,13 +72,13 @@ export interface RenderTextOpts {
* The text alignment to use. If unset, the existing
* textAlign property of the context is unchanged
*/
textAlign: CanvasTextAlign;
textAlign?: CanvasTextAlign;

/**
* The text baseline to use. If unset, the existing
* textBaseline property of the context is unchanged
*/
textBaseline: CanvasTextBaseline;
textBaseline?: CanvasTextBaseline;

/**
* If specified, a translation to apply to the context
Expand All @@ -89,6 +89,38 @@ export interface RenderTextOpts {
* Underline the text
*/
underline?: boolean;

/**
* Dimensions for drawing the label backdrop
*/
backdrop?: BackdropOptions;
}

export interface BackdropOptions {
/**
* Left position of backdrop as pixel
*/
left: number;

/**
* Top position of backdrop as pixel
*/
top: number;

/**
* Width of backdrop in pixels
*/
width: number;

/**
* Height of backdrop in pixels
*/
height: number;

/**
* Color of label backdrops.
*/
color: Scriptable<Color, ScriptableScaleContext>;
}

export function renderText(
Expand Down
9 changes: 9 additions & 0 deletions types/index.d.ts
Expand Up @@ -9,6 +9,8 @@ import { Color } from './color.js';
import Element from '../src/core/core.element.js';
import { ChartArea, Padding, Point } from './geometric.js';
import { LayoutItem, LayoutPosition } from './layout.js';
import { RenderTextOpts } from './helpers/helpers.canvas.js';
import { CanvasFontSpec } from '../src/helpers/helpers.options.js';

export { EasingFunction } from '../src/helpers/helpers.easing.js';
export { default as ArcElement, ArcProps } from '../src/elements/element.arc.js';
Expand Down Expand Up @@ -1311,6 +1313,7 @@ export interface Scale<O extends CoreScaleOptions = CoreScaleOptions> extends El
getMinMax(canStack: boolean): { min: number; max: number };
getTicks(): Tick[];
getLabels(): string[];
getLabelItems(chartArea?: ChartArea): LabelItem[];
beforeUpdate(): void;
configure(): void;
afterUpdate(): void;
Expand Down Expand Up @@ -1354,6 +1357,12 @@ export interface ScriptableScalePointLabelContext {
type: string;
}

export interface LabelItem {
label: string | string[];
font: CanvasFontSpec;
textOffset: number;
options: RenderTextOpts;
}

export declare const Ticks: {
formatters: {
Expand Down