Skip to content

Commit 0a6bbee

Browse files
committed
fix esm build and add sample
1 parent a5c5e48 commit 0a6bbee

File tree

12 files changed

+152
-68
lines changed

12 files changed

+152
-68
lines changed

README.md

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,16 +333,29 @@ interface ITooltipItem {
333333

334334
The ESM build of the library supports tree shaking thus having no side effects. As a consequence the chart.js library won't be automatically manipulated nor new controllers automatically registered. One has to manually import and register them.
335335

336+
Variant A:
337+
336338
```js
337339
import Chart from 'chart.js';
338-
import { BoxPlot } from '@sgratzl/chartjs-chart-boxplot';
340+
import { BoxPlotController } from '@sgratzl/chartjs-chart-boxplot';
339341

340342
// register controller in chart.js and ensure the defaults are set
341-
BoxPlot.register();
343+
BoxPlotController.register();
342344
...
343345

344346
new Chart(ctx, {
345-
type: BoxPlot.id,
347+
type: BoxPlotController.id,
348+
data: [...],
349+
});
350+
```
351+
352+
Variant B:
353+
354+
```js
355+
import Chart from 'chart.js';
356+
import { BoxPlotChart } from '@sgratzl/chartjs-chart-boxplot';
357+
358+
new BoxPlotChart(ctx, {
346359
data: [...],
347360
});
348361
```

samples/default_esm.html

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Box Plot Chart</title>
5+
</head>
6+
<body>
7+
<div id="container" style="width: 75%;">
8+
<canvas id="canvas"></canvas>
9+
</div>
10+
<script defer src="https://unpkg.com/es-module-shims"></script>
11+
<script type="importmap-shim">
12+
{
13+
"imports": {
14+
"chart.js": "https://unpkg.com/chart.js@3.0.0-alpha/dist/Chart.esm.js",
15+
"@sgratzl/chartjs-chart-boxplot": "../build/Chart.BoxPlot.esm.js"
16+
}
17+
}
18+
</script>
19+
<script type="module-shim">
20+
import Chart from 'chart.js';
21+
import { BoxPlotChart } from '@sgratzl/chartjs-chart-boxplot';
22+
23+
const chart = new BoxPlotChart(document.getElementById('canvas'), {
24+
data: {
25+
labels: ['A'],
26+
datasets: [{
27+
label: 'Test',
28+
data: [
29+
Array(100).fill(0).map(() => Math.random())
30+
]
31+
}]
32+
}
33+
})
34+
</script>
35+
</body>
36+
</html>

src/bundle.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
export * from '.';
22

3-
import { BoxPlot, HorizontalBoxPlot, Violin, HorizontalViolin } from './controllers';
3+
import {
4+
BoxPlotController,
5+
HorizontalBoxPlotController,
6+
ViolinController,
7+
HorizontalViolinController,
8+
} from './controllers';
49

5-
BoxPlot.register();
6-
HorizontalBoxPlot.register();
7-
Violin.register();
8-
HorizontalViolin.register();
10+
BoxPlotController.register();
11+
HorizontalBoxPlotController.register();
12+
ViolinController.register();
13+
HorizontalViolinController.register();

src/chart.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import ChartNS from 'chart.js';
2+
3+
export const Chart = ChartNS;
4+
export const plugins = ChartNS.plugins;
5+
export const controllers = ChartNS.controllers;
6+
export const defaults = ChartNS.defaults;
7+
export const Element = ChartNS.Element;
8+
export const helpers = ChartNS.helpers;
9+
export const scaleService = ChartNS.scaleService;

src/controllers/base.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { interpolateNumberArray } from '../animation';
22
import { outlierPositioner, patchInHoveredOutlier } from '../tooltip';
3-
import { controllers } from 'chart.js';
3+
import { controllers } from '../chart';
44
import { defaultStatsOptions } from '../data';
55

66
export function baseDefaults(keys) {

src/controllers/boxplot.js

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { asBoxPlotStats } from '../data';
2-
import { controllers, helpers, defaults } from 'chart.js';
2+
import { Chart, controllers, helpers, defaults } from '../chart';
33
import { baseDefaults, StatsBase } from './base';
44
import { BoxAndWiskers, boxOptionsKeys } from '../elements';
5+
import { patchControllerConfig } from './utils';
56

6-
export class BoxPlot extends StatsBase {
7+
export class BoxPlotController extends StatsBase {
78
_parseStats(value, config) {
89
return asBoxPlotStats(value, config);
910
}
@@ -24,13 +25,13 @@ export class BoxPlot extends StatsBase {
2425
}
2526
}
2627

27-
BoxPlot.id = 'boxplot';
28-
BoxPlot.register = () => {
29-
BoxPlot.prototype.dataElementType = BoxAndWiskers.register();
30-
BoxPlot.prototype.dataElementOptions = controllers.bar.prototype.dataElementOptions.concat(boxOptionsKeys);
28+
BoxPlotController.id = 'boxplot';
29+
BoxPlotController.register = () => {
30+
BoxPlotController.prototype.dataElementType = BoxAndWiskers.register();
31+
BoxPlotController.prototype.dataElementOptions = controllers.bar.prototype.dataElementOptions.concat(boxOptionsKeys);
3132

3233
defaults.set(
33-
BoxPlot.id,
34+
BoxPlotController.id,
3435
helpers.merge({}, [
3536
defaults.bar,
3637
baseDefaults(boxOptionsKeys),
@@ -49,11 +50,18 @@ BoxPlot.register = () => {
4950
},
5051
])
5152
);
52-
controllers[BoxPlot.id] = BoxPlot;
53-
return BoxPlot;
53+
controllers[BoxPlotController.id] = BoxPlotController;
54+
return BoxPlotController;
5455
};
5556

56-
export class HorizontalBoxPlot extends BoxPlot {
57+
export class BoxPlotChart extends Chart {
58+
constructor(item, config) {
59+
super(item, patchControllerConfig(config, BoxPlotController));
60+
}
61+
}
62+
BoxPlotChart.id = BoxPlotController.id;
63+
64+
export class HorizontalBoxPlotController extends BoxPlotController {
5765
getValueScaleId() {
5866
return this._cachedMeta.xAxisID;
5967
}
@@ -62,15 +70,15 @@ export class HorizontalBoxPlot extends BoxPlot {
6270
}
6371
}
6472

65-
HorizontalBoxPlot.id = 'horizontalBoxplot';
66-
HorizontalBoxPlot.register = () => {
67-
HorizontalBoxPlot.prototype.dataElementType = BoxAndWiskers.register();
68-
HorizontalBoxPlot.prototype.dataElementOptions = controllers.horizontalBar.prototype.dataElementOptions.concat(
73+
HorizontalBoxPlotController.id = 'horizontalBoxplot';
74+
HorizontalBoxPlotController.register = () => {
75+
HorizontalBoxPlotController.prototype.dataElementType = BoxAndWiskers.register();
76+
HorizontalBoxPlotController.prototype.dataElementOptions = controllers.horizontalBar.prototype.dataElementOptions.concat(
6977
boxOptionsKeys
7078
);
7179

7280
defaults.set(
73-
HorizontalBoxPlot.id,
81+
HorizontalBoxPlotController.id,
7482
helpers.merge({}, [
7583
defaults.horizontalBar,
7684
baseDefaults(boxOptionsKeys),
@@ -89,6 +97,13 @@ HorizontalBoxPlot.register = () => {
8997
},
9098
])
9199
);
92-
controllers[HorizontalBoxPlot.id] = HorizontalBoxPlot;
93-
return HorizontalBoxPlot;
100+
controllers[HorizontalBoxPlotController.id] = HorizontalBoxPlotController;
101+
return HorizontalBoxPlotController;
94102
};
103+
104+
export class HorizontalBoxPlotChart extends Chart {
105+
constructor(item, config) {
106+
super(item, patchControllerConfig(config, HorizontalBoxPlotController));
107+
}
108+
}
109+
HorizontalBoxPlotChart.id = HorizontalBoxPlotController.id;

src/controllers/utils.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export function patchControllerConfig(config, controller) {
2+
controller.register();
3+
config.type = controller.id;
4+
return config;
5+
}

src/controllers/violin.js

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { asViolinStats } from '../data';
2-
import { controllers, defaults, helpers } from 'chart.js';
2+
import { Chart, controllers, defaults, helpers } from '../chart';
33
import { StatsBase, baseDefaults } from './base';
44
import { baseOptionKeys } from '../elements/base';
55
import { ViolinElement } from '../elements';
66
import { interpolateKdeCoords } from '../animation';
7+
import { patchControllerConfig } from './utils';
78

8-
export class Violin extends StatsBase {
9+
export class ViolinController extends StatsBase {
910
_parseStats(value, config) {
1011
return asViolinStats(value, config);
1112
}
@@ -30,13 +31,13 @@ export class Violin extends StatsBase {
3031
}
3132
}
3233

33-
Violin.id = 'violin';
34-
Violin.register = () => {
35-
Violin.prototype.dataElementType = ViolinElement.register();
36-
Violin.prototype.dataElementOptions = controllers.bar.prototype.dataElementOptions.concat(baseOptionKeys);
34+
ViolinController.id = 'violin';
35+
ViolinController.register = () => {
36+
ViolinController.prototype.dataElementType = ViolinElement.register();
37+
ViolinController.prototype.dataElementOptions = controllers.bar.prototype.dataElementOptions.concat(baseOptionKeys);
3738

3839
defaults.set(
39-
Violin.id,
40+
ViolinController.id,
4041
helpers.merge({}, [
4142
defaults.bar,
4243
baseDefaults(baseOptionKeys),
@@ -60,11 +61,18 @@ Violin.register = () => {
6061
},
6162
])
6263
);
63-
controllers[Violin.id] = Violin;
64-
return Violin;
64+
controllers[ViolinController.id] = ViolinController;
65+
return ViolinController;
6566
};
6667

67-
export class HorizontalViolin extends Violin {
68+
export class ViolinChart extends Chart {
69+
constructor(item, config) {
70+
super(item, patchControllerConfig(config, ViolinController));
71+
}
72+
}
73+
ViolinChart.id = ViolinController.id;
74+
75+
export class HorizontalViolinController extends ViolinController {
6876
getValueScaleId() {
6977
return this._cachedMeta.xAxisID;
7078
}
@@ -73,15 +81,15 @@ export class HorizontalViolin extends Violin {
7381
}
7482
}
7583

76-
HorizontalViolin.id = 'horizontalViolin';
77-
HorizontalViolin.register = () => {
78-
HorizontalViolin.prototype.dataElementType = ViolinElement.register();
79-
HorizontalViolin.prototype.dataElementOptions = controllers.horizontalBar.prototype.dataElementOptions.concat(
84+
HorizontalViolinController.id = 'horizontalViolin';
85+
HorizontalViolinController.register = () => {
86+
HorizontalViolinController.prototype.dataElementType = ViolinElement.register();
87+
HorizontalViolinController.prototype.dataElementOptions = controllers.horizontalBar.prototype.dataElementOptions.concat(
8088
baseOptionKeys
8189
);
8290

8391
defaults.set(
84-
HorizontalViolin.id,
92+
HorizontalViolinController.id,
8593
helpers.merge({}, [
8694
defaults.horizontalBar,
8795
baseDefaults(baseOptionKeys),
@@ -105,6 +113,13 @@ HorizontalViolin.register = () => {
105113
},
106114
])
107115
);
108-
controllers[HorizontalViolin.id] = HorizontalViolin;
109-
return HorizontalViolin;
116+
controllers[HorizontalViolinController.id] = HorizontalViolinController;
117+
return HorizontalViolinController;
110118
};
119+
120+
export class HorizontalViolinChart extends Chart {
121+
constructor(item, config) {
122+
super(item, patchControllerConfig(config, HorizontalViolinController));
123+
}
124+
}
125+
HorizontalViolinChart.id = HorizontalViolinController.id;

src/elements/base.js

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { defaults, Element, helpers } from 'chart.js';
1+
import { defaults, Element, helpers } from '../chart';
22
import { rnd } from '../data';
33

4-
export const baseDefaults = Object.assign({}, defaults.elements.rectangle, {
4+
export const baseDefaults = {
55
borderWidth: 1,
66

77
outlierStyle: 'circle',
@@ -18,23 +18,9 @@ export const baseDefaults = Object.assign({}, defaults.elements.rectangle, {
1818

1919
hitPadding: 2,
2020
outlierHitRadius: 4,
21-
});
22-
23-
export const baseOptionKeys = [
24-
'outlierStyle',
25-
'outlierRadius',
26-
'outlierBackgroundColor',
27-
'outlierBorderColor',
28-
'outlierBorderWidth',
29-
'outlierHitRadius',
30-
31-
'itemStyle',
32-
'itemRadius',
33-
'itemBackgroundColor',
34-
'itemBorderColor',
35-
'itemBorderWidth',
36-
'hitPadding',
37-
];
21+
};
22+
23+
export const baseOptionKeys = Object.keys(baseDefaults);
3824

3925
export class StatsBase extends Element {
4026
isVertical() {

src/elements/boxandwhiskers.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { defaults } from 'chart.js';
1+
import { defaults } from '../chart';
22
import { StatsBase, baseDefaults, baseOptionKeys } from './base';
33

44
export const boxOptionsKeys = baseOptionKeys.concat(['medianColor', 'lowerBackgroundColor']);
@@ -187,9 +187,9 @@ export class BoxAndWiskers extends StatsBase {
187187
BoxAndWiskers._type = 'boxandwhiskers';
188188
BoxAndWiskers.register = () => {
189189
defaults.set('elements', {
190-
[BoxAndWiskers._type]: Object.assign({}, baseDefaults, {
190+
[BoxAndWiskers._type]: Object.assign({}, defaults.elements.rectangle, baseDefaults, {
191191
medianColor: 'transparent',
192-
lowerBackgroundColor: 'transparent',
192+
lowerBackgroundColor: 'transparsent',
193193
}),
194194
});
195195
return BoxAndWiskers;

0 commit comments

Comments
 (0)