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 clip option to scale configuration to allow unclipped scales #11404

Merged
merged 4 commits into from
Aug 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/axes/cartesian/_common.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Namespace: `options.scales[scaleId]`
| Name | Type | Default | Description
| ---- | ---- | ------- | -----------
| `bounds` | `string` | `'ticks'` | Determines the scale bounds. [more...](./index.md#scale-bounds)
| `clip` | `boolean` | `true` | If true, clip the dataset drawing against the size of the scale instead of chart area
| `position` | `string` \| `object` | | Position of the axis. [more...](./index.md#axis-position)
| `stack` | `string` | | Stack group. Axes at the same `position` with same `stack` are stacked.
| `stackWeight` | `number` | 1 | Weight of the scale in stack group. Used to determine the amount of allocated space for the scale within the group.
Expand Down
17 changes: 11 additions & 6 deletions src/core/core.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,16 +101,21 @@ function determineLastEvent(e, lastEvent, inChartArea, isClick) {
return e;
}

function getDatasetArea(meta) {
function getSizeForArea(scale, chartArea, field) {
return scale.options.clip ? scale[field] : chartArea[field];
}

function getDatasetArea(meta, chartArea) {
const {xScale, yScale} = meta;
if (xScale && yScale) {
return {
left: xScale.left,
right: xScale.right,
top: yScale.top,
bottom: yScale.bottom
left: getSizeForArea(xScale, chartArea, 'left'),
right: getSizeForArea(xScale, chartArea, 'right'),
top: getSizeForArea(yScale, chartArea, 'top'),
bottom: getSizeForArea(yScale, chartArea, 'bottom')
};
}
return chartArea;
}

class Chart {
Expand Down Expand Up @@ -796,7 +801,7 @@ class Chart {
const ctx = this.ctx;
const clip = meta._clip;
const useClip = !clip.disabled;
const area = getDatasetArea(meta) || this.chartArea;
const area = getDatasetArea(meta, this.chartArea);
const args = {
meta,
index: meta.index,
Expand Down
2 changes: 2 additions & 0 deletions src/core/core.scale.defaults.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ export function applyScaleDefaults(defaults) {
*/
bounds: 'ticks',

clip: true,

/**
* Addition grace added to max and reduced from min data value.
* @since 3.0.0
Expand Down
5 changes: 5 additions & 0 deletions src/types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1171,6 +1171,11 @@ export interface CoreScaleOptions {
* @default false
*/
reverse: boolean;
/**
* Clip the dataset drawing against the size of the scale instead of chart area.
* @default true
*/
clip: boolean;
/**
* The weight used to sort the axis. Higher weights are further away from the chart area.
* @default true
Expand Down
115 changes: 115 additions & 0 deletions test/fixtures/core.layouts/stacked-boxes-max-index-without-clip.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
module.exports = {
config: {
type: 'line',
data: {
datasets: [
{data: [{x: 5, y: 1}, {x: 10, y: 2}, {x: 5, y: 3}], borderColor: 'red'},
{data: [{x: 5, y: 1}, {x: 10, y: 2}, {x: 5, y: 3}], yAxisID: 'y1', xAxisID: 'x1', borderColor: 'green'},
{data: [{x: 5, y: 1}, {x: 10, y: 2}, {x: 5, y: 3}], yAxisID: 'y2', xAxisID: 'x2', borderColor: 'blue'},
],
labels: ['tick1', 'tick2', 'tick3']
},
options: {
plugins: false,
scales: {
x: {
type: 'linear',
position: 'bottom',
stack: '1',
offset: true,
clip: false,
bounds: 'data',
border: {
color: 'red'
},
ticks: {
autoSkip: false,
maxRotation: 0,
count: 3
},
max: 7
},
x1: {
type: 'linear',
position: 'bottom',
stack: '1',
offset: true,
clip: false,
bounds: 'data',
border: {
color: 'green'
},
ticks: {
autoSkip: false,
maxRotation: 0,
count: 3
},
max: 7
},
x2: {
type: 'linear',
position: 'bottom',
stack: '1',
offset: true,
clip: false,
bounds: 'data',
border: {
color: 'blue'
},
ticks: {
autoSkip: false,
maxRotation: 0,
count: 3
},
max: 7
},
y: {
type: 'linear',
position: 'left',
stack: '1',
offset: true,
clip: false,
border: {
color: 'red'
},
ticks: {
precision: 0
}
},
y1: {
type: 'linear',
position: 'left',
stack: '1',
offset: true,
clip: false,
border: {
color: 'green'
},
ticks: {
precision: 0
}
},
y2: {
type: 'linear',
position: 'left',
stack: '1',
offset: true,
clip: false,
border: {
color: 'blue',
},
ticks: {
precision: 0
}
}
}
}
},
options: {
spriteText: true,
canvas: {
height: 384,
width: 384
}
}
};
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
115 changes: 115 additions & 0 deletions test/fixtures/core.layouts/stacked-boxes-max-without-clip.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
module.exports = {
config: {
type: 'line',
data: {
datasets: [
{data: [{x: 1, y: 5}, {x: 2, y: 10}, {x: 3, y: 5}], borderColor: 'red'},
{data: [{x: 1, y: 5}, {x: 2, y: 10}, {x: 3, y: 5}], yAxisID: 'y1', xAxisID: 'x1', borderColor: 'green'},
{data: [{x: 1, y: 5}, {x: 2, y: 10}, {x: 3, y: 5}], yAxisID: 'y2', xAxisID: 'x2', borderColor: 'blue'},
],
labels: ['tick1', 'tick2', 'tick3']
},
options: {
plugins: false,
scales: {
x: {
type: 'linear',
position: 'bottom',
stack: '1',
offset: true,
clip: false,
bounds: 'data',
border: {
color: 'red'
},
ticks: {
autoSkip: false,
maxRotation: 0,
count: 3
}
},
x1: {
type: 'linear',
position: 'bottom',
stack: '1',
offset: true,
clip: false,
bounds: 'data',
border: {
color: 'green'
},
ticks: {
autoSkip: false,
maxRotation: 0,
count: 3
}
},
x2: {
type: 'linear',
position: 'bottom',
stack: '1',
offset: true,
clip: false,
bounds: 'data',
border: {
color: 'blue'
},
ticks: {
autoSkip: false,
maxRotation: 0,
count: 3
}
},
y: {
type: 'linear',
position: 'left',
stack: '1',
offset: true,
clip: false,
border: {
color: 'red'
},
ticks: {
precision: 0
},
max: 7
},
y1: {
type: 'linear',
position: 'left',
stack: '1',
offset: true,
clip: false,
border: {
color: 'green'
},
ticks: {
precision: 0
},
max: 7
},
y2: {
type: 'linear',
position: 'left',
stack: '1',
offset: true,
clip: false,
border: {
color: 'blue',
},
ticks: {
precision: 0
},
max: 7
}
}
}
},
options: {
spriteText: true,
canvas: {
height: 384,
width: 384
}
}
};
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.