From: Dan Manastireanu <498419+danmana@users.noreply.github.com>
Date: Wed, 28 Oct 2020 15:28:17 +0000 (+0200)
Subject: feat: Make options.layout.padding scriptable. Closes #7873 (#7968)
X-Git-Tag: v3.0.0-beta.5~11
X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aad748dc5adda1cadf7702f0e44f1b16a73f37d7;p=thirdparty%2FChart.js.git
feat: Make options.layout.padding scriptable. Closes #7873 (#7968)
---
diff --git a/docs/docs/configuration/layout.md b/docs/docs/configuration/layout.md
index 1818fa2e3..afe2471d4 100644
--- a/docs/docs/configuration/layout.md
+++ b/docs/docs/configuration/layout.md
@@ -4,9 +4,9 @@ title: Layout
The layout configuration is passed into the `options.layout` namespace. The global options for the chart layout is defined in `Chart.defaults.layout`.
-| Name | Type | Default | Description
-| ---- | ---- | ------- | -----------
-| `padding` | number|object
| `0` | The padding to add inside the chart. [more...](#padding)
+| Name | Type | Default | [Scriptable](../general/options.md#scriptable-options) | Description
+| ---- | ---- | ------- | :----: | -----------
+| `padding` | number|object
| `0` | Yes | The padding to add inside the chart. [more...](#padding)
## Padding
If this value is a number, it is applied to all sides of the chart (left, top, right, bottom). If this value is an object, the `left` property defines the left padding. Similarly the `right`, `top` and `bottom` properties can also be specified.
diff --git a/src/core/core.layouts.js b/src/core/core.layouts.js
index 789731a30..61876c367 100644
--- a/src/core/core.layouts.js
+++ b/src/core/core.layouts.js
@@ -1,6 +1,6 @@
import defaults from './core.defaults';
import {each, isObject} from '../helpers/helpers.core';
-import {toPadding} from '../helpers/helpers.options';
+import {toPadding, resolve} from '../helpers/helpers.options';
/**
* @typedef { import("./core.controller").default } Chart
@@ -310,7 +310,8 @@ export default {
}
const layoutOptions = chart.options.layout || {};
- const padding = toPadding(layoutOptions.padding);
+ const context = {chart};
+ const padding = toPadding(resolve([layoutOptions.padding], context));
const availableWidth = width - padding.width;
const availableHeight = height - padding.height;
diff --git a/test/fixtures/core.layouts/scriptable.js b/test/fixtures/core.layouts/scriptable.js
new file mode 100644
index 000000000..3087398af
--- /dev/null
+++ b/test/fixtures/core.layouts/scriptable.js
@@ -0,0 +1,49 @@
+module.exports = {
+ config: {
+ type: 'line',
+ data: {
+ datasets: [
+ {data: [10, 5, 0, 25, 78, -10]}
+ ],
+ labels: ['tick1', 'tick2', 'tick3', 'tick4', 'tick5', 'tick6']
+ },
+ options: {
+ layout: {
+ padding: function(ctx) {
+ // 10% padding
+ const horizontalPadding = ctx.chart.width * 0.1;
+ const verticalPadding = ctx.chart.height * 0.1;
+ return {
+ top: verticalPadding,
+ right: horizontalPadding,
+ bottom: verticalPadding,
+ left: horizontalPadding
+ };
+ }
+ },
+ legend: {
+ display: false
+ },
+ scales: {
+ x: {
+ type: 'category',
+ ticks: {
+ maxRotation: 0,
+ autoSkip: false
+ }
+ },
+ y: {
+ type: 'linear',
+ position: 'right'
+ }
+ }
+ }
+ },
+ options: {
+ spriteText: true,
+ canvas: {
+ height: 150,
+ width: 512
+ }
+ }
+};
diff --git a/test/fixtures/core.layouts/scriptable.png b/test/fixtures/core.layouts/scriptable.png
new file mode 100644
index 000000000..6b3da5d10
Binary files /dev/null and b/test/fixtures/core.layouts/scriptable.png differ
diff --git a/types/core/interfaces.d.ts b/types/core/interfaces.d.ts
index accf6257c..6c2fca495 100644
--- a/types/core/interfaces.d.ts
+++ b/types/core/interfaces.d.ts
@@ -149,7 +149,7 @@ export interface ICoreChartOptions {
elements: { [key: string]: IElementOptions };
layout: {
- padding: number | IChartArea;
+ padding: Scriptable;
};
}