changeset 8a9f4bbcbd4d in sao:default
details: https://hg.tryton.org/sao?cmd=changeset;node=8a9f4bbcbd4d
description:
Allow configuration of default colors for graph and calendar
issue9435
review300011002
diffstat:
CHANGELOG | 1 +
src/common.js | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++
src/sao.js | 2 +
src/view/calendar.js | 4 +-
src/view/graph.js | 32 +++++++++++-----
5 files changed, 123 insertions(+), 12 deletions(-)
diffs (195 lines):
diff -r 9743573d0f58 -r 8a9f4bbcbd4d CHANGELOG
--- a/CHANGELOG Thu Jul 09 00:21:48 2020 +0200
+++ b/CHANGELOG Thu Jul 09 00:34:01 2020 +0200
@@ -1,3 +1,4 @@
+* Allow configuration of default colors for graph and calendar
* Sanitize RichtText fields content (issue9405)
* Escape external string (issue9394)
* Keep context in sessionStorage
diff -r 9743573d0f58 -r 8a9f4bbcbd4d src/common.js
--- a/src/common.js Thu Jul 09 00:21:48 2020 +0200
+++ b/src/common.js Thu Jul 09 00:34:01 2020 +0200
@@ -3673,4 +3673,100 @@
});
};
+ Sao.common.COLOR_SCHEMES = {
+ 'red': '#cf1d1d',
+ 'green': '#3fb41b',
+ 'blue': '#224565',
+ 'grey': '#444444',
+ 'black': '#000000',
+ 'darkcyan': '#305755',
+ };
+
+ Sao.common.hex2rgb = function(hexstring, digits) {
+ digits = digits || 2;
+ var top = parseInt('f'.repeat(digits), 16);
+ var r = parseInt(
+ hexstring.substring(1, digits + 1), 16);
+ var g = parseInt(
+ hexstring.substring(digits + 1, digits * 2 + 1), 16);
+ var b = parseInt(
+ hexstring.substring(digits * 2 + 1, digits * 3 + 1), 16);
+ return [r / top, g / top, b / top];
+ };
+
+ Sao.common.rgb2hex = function(rgb, digits) {
+ digits = digits || 2;
+ var top = parseInt('f'.repeat(digits), 16);
+ return '#' + rgb
+ .map(function(i) { return Math.round(i * top).toString(16); })
+ .join('');
+ };
+
+ Sao.common.rgb2hsv = function(rgb) {
+ var r = rgb[0],
+ g = rgb[1],
+ b = rgb[2];
+ var maxc = Math.max.apply(null, rgb);
+ var minc = Math.min.apply(null, rgb);
+ var v = maxc;
+ if (minc == maxc) return [0, 0, v];
+ var s = (maxc - minc) / maxc;
+ var rc = (maxc - r) / (maxc - minc);
+ var gc = (maxc - g) / (maxc - minc);
+ var bc = (maxc - b) / (maxc - minc);
+ var h;
+ if (r == maxc) {
+ h = bc - gc;
+ } else if (g == maxc) {
+ h = 2 + rc - bc;
+ } else {
+ h = 4 + gc - rc;
+ }
+ h = (h / 6) % 1;
+ return [h, s, v];
+ };
+
+ Sao.common.hsv2rgb = function(hsv) {
+ var h = hsv[0],
+ s = hsv[1],
+ v = hsv[2];
+ if (s == 0) return [v, v, v];
+ var i = Math.trunc(h * 6);
+ var f = (h * 6) - i;
+ var p = v * (1 - s);
+ var q = v * (1 - s * f);
+ var t = v * (1 - s * (1 - f));
+ i = i % 6;
+
+ if (i == 0) return [v, t, p];
+ else if (i == 1) return [q, v, p];
+ else if (i == 2) return [p, v, t];
+ else if (i == 3) return [p, q, v];
+ else if (i == 4) return [t, p, v];
+ else if (i == 5) return [v, p, q];
+ };
+
+ Sao.common.generateColorscheme = function(masterColor, keys, light) {
+ if (light === undefined) {
+ light = 0.1;
+ }
+ var rgb = Sao.common.hex2rgb(
+ Sao.common.COLOR_SCHEMES[masterColor] || masterColor);
+ var hsv = Sao.common.rgb2hsv(rgb);
+ var h = hsv[0],
+ s = hsv[1],
+ v = hsv[2];
+ if (keys.length) {
+ light = Math.min(light, (1 - v) / keys.length);
+ }
+ var golden_angle = 0.618033988749895;
+ var colors = {};
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ colors[key] = Sao.common.rgb2hex(Sao.common.hsv2rgb(
+ [(h + golden_angle * i) % 1, s, (v + light * i) % 1]));
+ }
+ return colors;
+ };
+
}());
diff -r 9743573d0f58 -r 8a9f4bbcbd4d src/sao.js
--- a/src/sao.js Thu Jul 09 00:21:48 2020 +0200
+++ b/src/sao.js Thu Jul 09 00:34:01 2020 +0200
@@ -282,6 +282,8 @@
Sao.config.bug_url = 'https://bugs.tryton.org/';
Sao.config.title = 'Tryton';
Sao.config.icon_colors = '#3465a4,#555753,#cc0000'.split(',');
+ Sao.config.calendar_colors = '#fff,#3465a4'.split(',');
+ Sao.config.graph_color = '#3465a4';
Sao.config.bus_timeout = 10 * 60 * 1000;
Sao.i18n = i18n();
diff -r 9743573d0f58 -r 8a9f4bbcbd4d src/view/calendar.js
--- a/src/view/calendar.js Thu Jul 09 00:21:48 2020 +0200
+++ b/src/view/calendar.js Thu Jul 09 00:34:01 2020 +0200
@@ -97,12 +97,12 @@
},
get_colors: function(record) {
var colors = {};
- colors.text_color = 'black';
+ colors.text_color = Sao.config.calendar_colors[0];
if (this.attributes.color) {
colors.text_color = record.field_get(
this.attributes.color);
}
- colors.background_color = 'lightblue';
+ colors.background_color = Sao.config.calendar_colors[1];
if (this.attributes.background_color) {
colors.background_color = record.field_get(
this.attributes.background_color);
diff -r 9743573d0f58 -r 8a9f4bbcbd4d src/view/graph.js
--- a/src/view/graph.js Thu Jul 09 00:21:48 2020 +0200
+++ b/src/view/graph.js Thu Jul 09 00:34:01 2020 +0200
@@ -84,9 +84,10 @@
var fields2load = [this.xfield.name];
for (i = 0, len = this.yfields.length; i < len; i++) {
yfield = this.yfields[i];
- data.columns.push([yfield.name]);
- data.names[yfield.name] = yfield.string;
- key2columns[yfield.key || yfield.name] = i + 1;
+ key = yfield.key || yfield.name;
+ data.columns.push([key]);
+ data.names[key] = yfield.string;
+ key2columns[key] = i + 1;
fields2load.push(yfield.name);
}
@@ -207,17 +208,28 @@
}
};
}
- var colors = {};
- for (var i = 0; i < this.yfields.length; i++) {
- var field = this.yfields[i];
- if (field.color) {
- colors[field.name] = field.color;
+ var color = this.view.attributes.color || Sao.config.graph_color;
+ var rgb = Sao.common.hex2rgb(
+ Sao.common.COLOR_SCHEMES[color] || color);
+ var maxcolor = Math.max.apply(null, rgb);
+ var keys = [];
+ var i, yfield;
+ for (i = 0; i < this.yfields.length; i++) {
+ yfield = this.yfields[i];
+ keys.push(yfield.key || yfield.name);
+ }
+ var colors = Sao.common.generateColorscheme(
+ color, keys, maxcolor / (keys.length || 1));
+ for (i = 0; i < this.yfields.length; i++) {
+ yfield = this.yfields[i];
+ if (yfield.color) {
+ colors[yfield.key || yfield.name] = field.color;
}
}
c3_config.data.color = function(color, column) {
// column is an object when called for legend
- var name = column.id || column;
- return colors[name] || color;
+ var key = column.id || column;
+ return colors[key] || color;
};
return c3_config;
},