details: https://code.tryton.org/tryton/commit/862b305c0d33
branch: default
user: Nicolas Évrard <[email protected]>
date: Fri Mar 13 15:14:09 2026 +0100
description:
Replace d3 by billboard.js
Close #14313
diffstat:
sao/eslint.config.mjs | 2 +-
sao/index.html | 4 ++--
sao/package.json | 3 ++-
sao/src/view/graph.js | 42 +++++++++++++++++++++---------------------
4 files changed, 26 insertions(+), 25 deletions(-)
diffs (168 lines):
diff -r fe5bf7633c80 -r 862b305c0d33 sao/eslint.config.mjs
--- a/sao/eslint.config.mjs Fri Oct 04 20:54:56 2024 +0200
+++ b/sao/eslint.config.mjs Fri Mar 13 15:14:09 2026 +0100
@@ -13,7 +13,7 @@
QUnit: "readonly",
Sao: "readonly",
Sortable: "readonly",
- c3: "readonly",
+ bb: "readonly",
i18n: "readonly",
jQuery: "readonly",
moment: "readonly",
diff -r fe5bf7633c80 -r 862b305c0d33 sao/index.html
--- a/sao/index.html Fri Oct 04 20:54:56 2024 +0200
+++ b/sao/index.html Fri Mar 13 15:14:09 2026 +0100
@@ -15,7 +15,7 @@
<script type="text/javascript"
src="node_modules/moment/min/locales.js"></script>
<script type="text/javascript"
src="node_modules/gettext.js/dist/gettext.iife.js"></script>
<script type="text/javascript"
src="node_modules/d3/dist/d3.js"></script>
- <script type="text/javascript" src="node_modules/c3/c3.js"></script>
+ <script type="text/javascript"
src="node_modules/billboard.js/dist/billboard.js"></script>
<script type="text/javascript"
src="node_modules/papaparse/papaparse.js"></script>
<script type="text/javascript"
src="node_modules/fullcalendar/dist/fullcalendar.js"></script>
<script type="text/javascript"
src="node_modules/fullcalendar/dist/locale-all.js"></script>
@@ -23,7 +23,7 @@
<script type="text/javascript"
src="node_modules/mousetrap/plugins/pause/mousetrap-pause.js"></script>
<script type="text/javascript"
src="node_modules/sortablejs/Sortable.js"></script>
- <link rel="stylesheet" href="node_modules/c3/c3.css">
+ <link rel="stylesheet"
href="node_modules/billboard.js/dist/billboard.css">
<link rel="stylesheet"
href="node_modules/fullcalendar/dist/fullcalendar.css">
<script type="text/javascript" src="dist/tryton-sao.js"></script>
diff -r fe5bf7633c80 -r 862b305c0d33 sao/package.json
--- a/sao/package.json Fri Oct 04 20:54:56 2024 +0200
+++ b/sao/package.json Fri Mar 13 15:14:09 2026 +0100
@@ -50,11 +50,12 @@
"tryton"
],
"dependencies": {
+ "billboard.js": "^3.17",
+ "d3": "^7.9",
"jquery": "^3",
"bootstrap": "^3.3.7",
"moment": "^2.10",
"gettext.js": "^2",
- "c3": "^0.7",
"papaparse": "^5.0",
"fullcalendar": "^3.10.2",
"mousetrap": "^1.6",
diff -r fe5bf7633c80 -r 862b305c0d33 sao/src/view/graph.js
--- a/sao/src/view/graph.js Fri Oct 04 20:54:56 2024 +0200
+++ b/sao/src/view/graph.js Fri Mar 13 15:14:09 2026 +0100
@@ -95,7 +95,7 @@
return () => {
record = group[index];
var x = record.field_get_client(this.xfield.name);
- // c3 does not support moment
+ // billboard does not support moment
if (x && (x.isDate || x.isDateTime)) {
x = x.toString();
}
@@ -164,18 +164,18 @@
display: function(group) {
var update_prm = this.update_data(group);
update_prm.done(data => {
- c3.generate(this._c3_config(data));
+ bb.generate(this._bb_config(data));
});
return update_prm;
},
- _c3_config: function(data) {
- var c3_config = {};
+ _bb_config: function(data) {
+ var bb_config = {};
- c3_config.bindto = '#' + this.el.attr('id');
- c3_config.data = data;
- c3_config.data.type = this._chart_type;
- c3_config.data.x = 'labels';
- c3_config.data.onclick = this.action.bind(this);
+ bb_config.bindto = '#' + this.el.attr('id');
+ bb_config.data = data;
+ bb_config.data.type = this._chart_type;
+ bb_config.data.x = 'labels';
+ bb_config.data.onclick = this.action.bind(this);
var type = this.view.screen.model.fields[this.xfield.name]
.description.type;
@@ -185,18 +185,18 @@
this.view.screen.context.date_format);
time_format = '%X';
if (type == 'datetime') {
- c3_config.data.xFormat = '%Y-%m-%d %H:%M:%S';
+ bb_config.data.xFormat = '%Y-%m-%d %H:%M:%S';
format_func = function(dt) {
return Sao.common.format_datetime(
date_format + ' ' + time_format, moment(dt));
};
} else {
- c3_config.data.xFormat = '%Y-%m-%d';
+ bb_config.data.xFormat = '%Y-%m-%d';
format_func = function(dt) {
return Sao.common.format_date(date_format, moment(dt));
};
}
- c3_config.axis = {
+ bb_config.axis = {
x: {
type: 'timeseries',
tick: {
@@ -205,7 +205,7 @@
}
};
} else {
- c3_config.axis = {
+ bb_config.axis = {
x: {
type: 'category',
}
@@ -224,12 +224,12 @@
colors[yfield.key || yfield.name] = yfield.color;
}
}
- c3_config.data.color = function(color, column) {
+ bb_config.data.color = function(color, column) {
// column is an object when called for legend
var key = column.id || column;
return colors[key] || color;
};
- return c3_config;
+ return bb_config;
},
_data_keys: function(data) {
let keys = [];
@@ -269,8 +269,8 @@
Sao.View.Graph.HorizontalBar = Sao.class_(Sao.View.Graph.Chart, {
_chart_type: 'bar',
- _c3_config: function(data) {
- var config = Sao.View.Graph.HorizontalBar._super._c3_config
+ _bb_config: function(data) {
+ var config = Sao.View.Graph.HorizontalBar._super._bb_config
.call(this, data);
config.axis.rotated = true;
return config;
@@ -279,8 +279,8 @@
Sao.View.Graph.Line = Sao.class_(Sao.View.Graph.Chart, {
_chart_type: 'line',
- _c3_config: function(data) {
- var config = Sao.View.Graph.Line._super._c3_config
+ _bb_config: function(data) {
+ var config = Sao.View.Graph.Line._super._bb_config
.call(this, data);
config.line = {
connectNull: true,
@@ -291,8 +291,8 @@
Sao.View.Graph.Pie = Sao.class_(Sao.View.Graph.Chart, {
_chart_type: 'pie',
- _c3_config: function(data) {
- var config = Sao.View.Graph.Pie._super._c3_config.call(this, data);
+ _bb_config: function(data) {
+ var config = Sao.View.Graph.Pie._super._bb_config.call(this, data);
var pie_columns = [], pie_names = {};
var i, len;
var labels, values;