Skip to content

Commit

Permalink
Add new align 'inner' for X axis (#10106)
Browse files Browse the repository at this point in the history
* Add new align for X axis

new align 'left-right' for options.scales['x'].ticks namespace will allow users to aling ticks: 'start" for first (left) tick and 'end' for last (right) tick

* corrected name of aligment to "inner", documentation and add test for inner labels

* delete unnecessary changes

* corrected logic for reverse axis, add tests for reverse axis and withoutY axis

* corrected chart paddings for "inner" tick align

* code clearness

* Update types/index.esm.d.ts

Co-authored-by: Jacco van den Berg <39033624+LeeLenaleee@users.noreply.github.com>

Co-authored-by: Talla2XLC <alexey.ivanov@epc.com.ru>
Co-authored-by: Jukka Kurkela <jukka.kurkela@gmail.com>
Co-authored-by: Jacco van den Berg <39033624+LeeLenaleee@users.noreply.github.com>
  • Loading branch information
4 people committed Feb 12, 2022
1 parent ed8fa1b commit 7c14ab7
Show file tree
Hide file tree
Showing 11 changed files with 132 additions and 4 deletions.
2 changes: 1 addition & 1 deletion docs/axes/cartesian/_common_ticks.md
Expand Up @@ -4,7 +4,7 @@ Namespace: `options.scales[scaleId].ticks`

| Name | Type | Default | Description
| ---- | ---- | ------- | -----------
| `align` | `string` | `'center'` | The tick alignment along the axis. Can be `'start'`, `'center'`, or `'end'`.
| `align` | `string` | `'center'` | The tick alignment along the axis. Can be `'start'`, `'center'`, `'end'`, or `'inner'`. `inner` alignment means align `start` for first tick and `end` for the last tick of horizontal axis
| `crossAlign` | `string` | `'near'` | The tick alignment perpendicular to the axis. Can be `'near'`, `'center'`, or `'far'`. See [Tick Alignment](/axes/cartesian/#tick-alignment)
| `sampleSize` | `number` | `ticks.length` | The number of ticks to examine when deciding how many labels will fit. Setting a smaller value will be faster, but may be less accurate when there is large variability in label length.
| `autoSkip` | `boolean` | `true` | If true, automatically calculates how many labels can be shown and hides labels accordingly. Labels will be rotated up to `maxRotation` before skipping any. Turn `autoSkip` off to show all labels no matter what.
Expand Down
18 changes: 16 additions & 2 deletions src/core/core.scale.js
Expand Up @@ -705,7 +705,7 @@ export default class Scale extends Element {
paddingRight = last.width;
} else if (align === 'end') {
paddingLeft = first.width;
} else {
} else if (align !== 'inner') {
paddingLeft = first.width / 2;
paddingRight = last.width / 2;
}
Expand Down Expand Up @@ -1206,9 +1206,21 @@ export default class Scale extends Element {
const color = optsAtIndex.color;
const strokeColor = optsAtIndex.textStrokeColor;
const strokeWidth = optsAtIndex.textStrokeWidth;
let tickTextAlign = textAlign;

if (isHorizontal) {
x = pixel;

if (textAlign === 'inner') {
if (i === ilen - 1) {
tickTextAlign = !this.options.reverse ? 'right' : 'left';
} else if (i === 0) {
tickTextAlign = !this.options.reverse ? 'left' : 'right';
} else {
tickTextAlign = 'center';
}
}

if (position === 'top') {
if (crossAlign === 'near' || rotation !== 0) {
textOffset = -lineCount * lineHeight + lineHeight / 2;
Expand Down Expand Up @@ -1285,7 +1297,7 @@ export default class Scale extends Element {
strokeColor,
strokeWidth,
textOffset,
textAlign,
textAlign: tickTextAlign,
textBaseline,
translation: [x, y],
backdrop,
Expand All @@ -1309,6 +1321,8 @@ export default class Scale extends Element {
align = 'left';
} else if (ticks.align === 'end') {
align = 'right';
} else if (ticks.align === 'inner') {
align = 'inner';
}

return align;
Expand Down
30 changes: 30 additions & 0 deletions test/fixtures/core.scale/label-align-inner-onlyX.js
@@ -0,0 +1,30 @@
module.exports = {
config: {
type: 'line',
data: {
datasets: [{
data: [1, 2, 3],
}],
labels: ['Label1_long', 'Label2_long', 'Label3_long']
},
options: {
scales: {
x: {
ticks: {
align: 'inner',
},
},
y: {
display: false
}
}
}
},
options: {
spriteText: true,
canvas: {
height: 256,
width: 512
}
}
};
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
28 changes: 28 additions & 0 deletions test/fixtures/core.scale/label-align-inner-reverse.js
@@ -0,0 +1,28 @@
module.exports = {
config: {
type: 'line',
data: {
datasets: [{
data: [1, 2, 3],
}],
labels: ['Label1', 'Label2', 'Label3']
},
options: {
scales: {
x: {
ticks: {
align: 'inner'
},
reverse: true
}
}
}
},
options: {
spriteText: true,
canvas: {
height: 256,
width: 512
}
}
};
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
29 changes: 29 additions & 0 deletions test/fixtures/core.scale/label-align-inner-rotate.js
@@ -0,0 +1,29 @@
module.exports = {
config: {
type: 'line',
data: {
datasets: [{
data: [1, 2, 3],
}],
labels: ['Label1', 'Label2', 'Label3']
},
options: {
scales: {
x: {
ticks: {
align: 'inner',
maxRotation: 45,
minRotation: 45
},
}
}
}
},
options: {
spriteText: true,
canvas: {
height: 256,
width: 512
}
}
};
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 27 additions & 0 deletions test/fixtures/core.scale/label-align-inner.js
@@ -0,0 +1,27 @@
module.exports = {
config: {
type: 'line',
data: {
datasets: [{
data: [1, 2, 3],
}],
labels: ['Label1', 'Label2', 'Label3']
},
options: {
scales: {
x: {
ticks: {
align: 'inner',
},
}
}
}
},
options: {
spriteText: true,
canvas: {
height: 256,
width: 512
}
}
};
Binary file added test/fixtures/core.scale/label-align-inner.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion types/index.esm.d.ts
Expand Up @@ -3020,7 +3020,7 @@ export interface CartesianScaleOptions extends CoreScaleOptions {
* The label alignment
* @default 'center'
*/
align: Align;
align: Align | 'inner';
/**
* If true, automatically calculates how many labels can be shown and hides labels accordingly. Labels will be rotated up to maxRotation before skipping any. Turn autoSkip off to show all labels no matter what.
* @default true
Expand Down

0 comments on commit 7c14ab7

Please sign in to comment.