Parcourir la source

[fix] percentage tooltip

tags/1.2.0
Prateeksha Singh il y a 7 ans
Parent
révision
21238c9c8e
13 fichiers modifiés avec 123 ajouts et 113 suppressions
  1. +60
    -55
      dist/frappe-charts.esm.js
  2. +1
    -1
      dist/frappe-charts.min.cjs.js
  3. +1
    -1
      dist/frappe-charts.min.esm.js
  4. +1
    -1
      dist/frappe-charts.min.iife.js
  5. +1
    -1
      dist/frappe-charts.min.iife.js.map
  6. +1
    -1
      docs/assets/js/frappe-charts.min.js
  7. +1
    -1
      docs/assets/js/frappe-charts.min.js.map
  8. +3
    -3
      src/js/charts/AggregationChart.js
  9. +3
    -3
      src/js/charts/AxisChart.js
  10. +2
    -2
      src/js/charts/Heatmap.js
  11. +17
    -12
      src/js/charts/PercentageChart.js
  12. +1
    -1
      src/js/charts/PieChart.js
  13. +31
    -31
      src/js/objects/SvgTip.js

+ 60
- 55
dist/frappe-charts.esm.js Voir le fichier

@@ -89,10 +89,10 @@ class SvgTip {
}) { }) {
this.parent = parent; this.parent = parent;
this.colors = colors; this.colors = colors;
this.title_name = '';
this.title_value = '';
this.list_values = [];
this.title_value_first = 0;
this.titleName = '';
this.titleValue = '';
this.listValues = [];
this.titleValueFirst = 0;


this.x = 0; this.x = 0;
this.y = 0; this.y = 0;
@@ -104,16 +104,16 @@ class SvgTip {
} }


setup() { setup() {
this.make_tooltip();
this.makeTooltip();
} }


refresh() { refresh() {
this.fill(); this.fill();
this.calc_position();
// this.show_tip();
this.calcPosition();
// this.showTip();
} }


make_tooltip() {
makeTooltip() {
this.container = $.create('div', { this.container = $.create('div', {
inside: this.parent, inside: this.parent,
className: 'graph-svg-tip comparison', className: 'graph-svg-tip comparison',
@@ -121,27 +121,27 @@ class SvgTip {
<ul class="data-point-list"></ul> <ul class="data-point-list"></ul>
<div class="svg-pointer"></div>` <div class="svg-pointer"></div>`
}); });
this.hide_tip();
this.hideTip();


this.title = this.container.querySelector('.title'); this.title = this.container.querySelector('.title');
this.data_point_list = this.container.querySelector('.data-point-list');
this.dataPointList = this.container.querySelector('.data-point-list');


this.parent.addEventListener('mouseleave', () => { this.parent.addEventListener('mouseleave', () => {
this.hide_tip();
this.hideTip();
}); });
} }


fill() { fill() {
let title; let title;
if(this.title_value_first) {
title = `<strong>${this.title_value}</strong>${this.title_name}`;
if(this.titleValueFirst) {
title = `<strong>${this.titleValue}</strong>${this.titleName}`;
} else { } else {
title = `${this.title_name}<strong>${this.title_value}</strong>`;
title = `${this.titleName}<strong>${this.titleValue}</strong>`;
} }
this.title.innerHTML = title; this.title.innerHTML = title;
this.data_point_list.innerHTML = '';
this.dataPointList.innerHTML = '';


this.list_values.map((set, i) => {
this.listValues.map((set, i) => {
const color = this.colors[i] || 'black'; const color = this.colors[i] || 'black';


let li = $.create('li', { let li = $.create('li', {
@@ -152,50 +152,50 @@ class SvgTip {
${set.title ? set.title : '' }` ${set.title ? set.title : '' }`
}); });


this.data_point_list.appendChild(li);
this.dataPointList.appendChild(li);
}); });
} }


calc_position() {
calcPosition() {
let width = this.container.offsetWidth; let width = this.container.offsetWidth;


this.top = this.y - this.container.offsetHeight; this.top = this.y - this.container.offsetHeight;
this.left = this.x - width/2; this.left = this.x - width/2;
let max_left = this.parent.offsetWidth - width;
let maxLeft = this.parent.offsetWidth - width;


let pointer = this.container.querySelector('.svg-pointer'); let pointer = this.container.querySelector('.svg-pointer');


if(this.left < 0) { if(this.left < 0) {
pointer.style.left = `calc(50% - ${-1 * this.left}px)`; pointer.style.left = `calc(50% - ${-1 * this.left}px)`;
this.left = 0; this.left = 0;
} else if(this.left > max_left) {
let delta = this.left - max_left;
let pointer_offset = `calc(50% + ${delta}px)`;
pointer.style.left = pointer_offset;
} else if(this.left > maxLeft) {
let delta = this.left - maxLeft;
let pointerOffset = `calc(50% + ${delta}px)`;
pointer.style.left = pointerOffset;


this.left = max_left;
this.left = maxLeft;
} else { } else {
pointer.style.left = `50%`; pointer.style.left = `50%`;
} }
} }


set_values(x, y, title_name = '', title_value = '', list_values = [], title_value_first = 0) {
this.title_name = title_name;
this.title_value = title_value;
this.list_values = list_values;
setValues(x, y, titleName = '', titleValue = '', listValues = [], titleValueFirst = 0) {
this.titleName = titleName;
this.titleValue = titleValue;
this.listValues = listValues;
this.x = x; this.x = x;
this.y = y; this.y = y;
this.title_value_first = title_value_first;
this.titleValueFirst = titleValueFirst;
this.refresh(); this.refresh();
} }


hide_tip() {
hideTip() {
this.container.style.top = '0px'; this.container.style.top = '0px';
this.container.style.left = '0px'; this.container.style.left = '0px';
this.container.style.opacity = '0'; this.container.style.opacity = '0';
} }


show_tip() {
showTip() {
this.container.style.top = this.top + 'px'; this.container.style.top = this.top + 'px';
this.container.style.left = this.left + 'px'; this.container.style.left = this.left + 'px';
this.container.style.opacity = '1'; this.container.style.opacity = '1';
@@ -1440,10 +1440,10 @@ class AggregationChart extends BaseChart {
this.colors[maxSlices-1] = 'grey'; this.colors[maxSlices-1] = 'grey';
} }


this.labels = [];
s.labels = [];
totals.map(d => { totals.map(d => {
s.sliceTotals.push(d[0]); s.sliceTotals.push(d[0]);
this.labels.push(d[1]);
s.labels.push(d[1]);
}); });
} }


@@ -1457,7 +1457,7 @@ class AggregationChart extends BaseChart {
this.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints); this.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);


let x_values = this.formatted_labels && this.formatted_labels.length > 0 let x_values = this.formatted_labels && this.formatted_labels.length > 0
? this.formatted_labels : this.labels;
? this.formatted_labels : s.labels;
this.legendTotals.map((d, i) => { this.legendTotals.map((d, i) => {
if(d) { if(d) {
let stats = $.create('div', { let stats = $.create('div', {
@@ -1513,6 +1513,7 @@ class PercentageChart extends AggregationChart {
s.sliceTotals.map((total, i) => { s.sliceTotals.map((total, i) => {
let slice = $.create('div', { let slice = $.create('div', {
className: `progress-bar`, className: `progress-bar`,
'data-index': i,
inside: this.percentageBar, inside: this.percentageBar,
styles: { styles: {
background: this.colors[i], background: this.colors[i],
@@ -1524,21 +1525,25 @@ class PercentageChart extends AggregationChart {
} }


bindTooltip() { bindTooltip() {
// this.slices.map((slice, i) => {
// slice.addEventListener('mouseenter', () => {
// let g_off = getOffset(this.chartWrapper), p_off = getOffset(slice);

// let x = p_off.left - g_off.left + slice.offsetWidth/2;
// let y = p_off.top - g_off.top - 6;
// let title = (this.formatted_labels && this.formatted_labels.length>0
// ? this.formatted_labels[i] : this.labels[i]) + ': ';
// let percent = (s.sliceTotals[i]*100/this.grand_total).toFixed(1);

// this.tip.set_values(x, y, title, percent + "%");
// this.tip.show_tip();
// });
// });
let s = this.state;

this.chartWrapper.addEventListener('mousemove', (e) => {
let slice = e.target;
if(slice.classList.contains('progress-bar')) {

let i = slice.getAttribute('data-index');
let g_off = getOffset(this.chartWrapper), p_off = getOffset(slice);

let x = p_off.left - g_off.left + slice.offsetWidth/2;
let y = p_off.top - g_off.top - 6;
let title = (this.formatted_labels && this.formatted_labels.length>0
? this.formatted_labels[i] : this.state.labels[i]) + ': ';
let percent = (s.sliceTotals[i]*100/this.grand_total).toFixed(1);

this.tip.setValues(x, y, title, percent + "%");
this.tip.showTip();
}
});
} }
} }


@@ -1639,7 +1644,7 @@ class PieChart extends AggregationChart {
let x = e.pageX - g_off.left + 10; let x = e.pageX - g_off.left + 10;
let y = e.pageY - g_off.top - 10; let y = e.pageY - g_off.top - 10;
let title = (this.formatted_labels && this.formatted_labels.length > 0 let title = (this.formatted_labels && this.formatted_labels.length > 0
? this.formatted_labels[i] : this.labels[i]) + ': ';
? this.formatted_labels[i] : this.state.labels[i]) + ': ';
let percent = (this.state.sliceTotals[i]*100/this.grand_total).toFixed(1); let percent = (this.state.sliceTotals[i]*100/this.grand_total).toFixed(1);
this.tip.set_values(x, y, title, percent + "%"); this.tip.set_values(x, y, title, percent + "%");
this.tip.show_tip(); this.tip.show_tip();
@@ -2160,8 +2165,8 @@ class Heatmap extends BaseChart {
let value = count + ' ' + this.count_label; let value = count + ' ' + this.count_label;
let name = ' on ' + month + ' ' + date_parts[0] + ', ' + date_parts[2]; let name = ' on ' + month + ' ' + date_parts[0] + ', ' + date_parts[2];


this.tip.set_values(x, y, name, value, [], 1);
this.tip.show_tip();
this.tip.setValues(x, y, name, value, [], 1);
this.tip.showTip();
}); });
}); });
} }
@@ -2978,7 +2983,7 @@ class AxisChart extends BaseChart {
if(relY < this.height + this.translateY * 2) { if(relY < this.height + this.translateY * 2) {
this.mapTooltipXPosition(relX); this.mapTooltipXPosition(relX);
} else { } else {
this.tip.hide_tip();
this.tip.hideTip();
} }
}); });
} }
@@ -3009,8 +3014,8 @@ class AxisChart extends BaseChart {
}; };
}); });


this.tip.set_values(x, y, titles[i], '', values);
this.tip.show_tip();
this.tip.setValues(x, y, titles[i], '', values);
this.tip.showTip();
break; break;
} }
} }


+ 1
- 1
dist/frappe-charts.min.cjs.js
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


+ 1
- 1
dist/frappe-charts.min.esm.js
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


+ 1
- 1
dist/frappe-charts.min.iife.js
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


+ 1
- 1
dist/frappe-charts.min.iife.js.map
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


+ 1
- 1
docs/assets/js/frappe-charts.min.js
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


+ 1
- 1
docs/assets/js/frappe-charts.min.js.map
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


+ 3
- 3
src/js/charts/AggregationChart.js Voir le fichier

@@ -40,10 +40,10 @@ export default class AggregationChart extends BaseChart {
this.colors[maxSlices-1] = 'grey'; this.colors[maxSlices-1] = 'grey';
} }


this.labels = [];
s.labels = [];
totals.map(d => { totals.map(d => {
s.sliceTotals.push(d[0]); s.sliceTotals.push(d[0]);
this.labels.push(d[1]);
s.labels.push(d[1]);
}); });
} }


@@ -57,7 +57,7 @@ export default class AggregationChart extends BaseChart {
this.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints); this.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);


let x_values = this.formatted_labels && this.formatted_labels.length > 0 let x_values = this.formatted_labels && this.formatted_labels.length > 0
? this.formatted_labels : this.labels;
? this.formatted_labels : s.labels;
this.legendTotals.map((d, i) => { this.legendTotals.map((d, i) => {
if(d) { if(d) {
let stats = $.create('div', { let stats = $.create('div', {


+ 3
- 3
src/js/charts/AxisChart.js Voir le fichier

@@ -345,7 +345,7 @@ export default class AxisChart extends BaseChart {
if(relY < this.height + this.translateY * 2) { if(relY < this.height + this.translateY * 2) {
this.mapTooltipXPosition(relX); this.mapTooltipXPosition(relX);
} else { } else {
this.tip.hide_tip();
this.tip.hideTip();
} }
}); });
} }
@@ -376,8 +376,8 @@ export default class AxisChart extends BaseChart {
}; };
}); });


this.tip.set_values(x, y, titles[i], '', values);
this.tip.show_tip();
this.tip.setValues(x, y, titles[i], '', values);
this.tip.showTip();
break; break;
} }
} }


+ 2
- 2
src/js/charts/Heatmap.js Voir le fichier

@@ -245,8 +245,8 @@ export default class Heatmap extends BaseChart {
let value = count + ' ' + this.count_label; let value = count + ' ' + this.count_label;
let name = ' on ' + month + ' ' + date_parts[0] + ', ' + date_parts[2]; let name = ' on ' + month + ' ' + date_parts[0] + ', ' + date_parts[2];


this.tip.set_values(x, y, name, value, [], 1);
this.tip.show_tip();
this.tip.setValues(x, y, name, value, [], 1);
this.tip.showTip();
}); });
}); });
} }


+ 17
- 12
src/js/charts/PercentageChart.js Voir le fichier

@@ -40,6 +40,7 @@ export default class PercentageChart extends AggregationChart {
s.sliceTotals.map((total, i) => { s.sliceTotals.map((total, i) => {
let slice = $.create('div', { let slice = $.create('div', {
className: `progress-bar`, className: `progress-bar`,
'data-index': i,
inside: this.percentageBar, inside: this.percentageBar,
styles: { styles: {
background: this.colors[i], background: this.colors[i],
@@ -52,19 +53,23 @@ export default class PercentageChart extends AggregationChart {


bindTooltip() { bindTooltip() {
let s = this.state; let s = this.state;
// this.slices.map((slice, i) => {
// slice.addEventListener('mouseenter', () => {
// let g_off = getOffset(this.chartWrapper), p_off = getOffset(slice);


// let x = p_off.left - g_off.left + slice.offsetWidth/2;
// let y = p_off.top - g_off.top - 6;
// let title = (this.formatted_labels && this.formatted_labels.length>0
// ? this.formatted_labels[i] : this.labels[i]) + ': ';
// let percent = (s.sliceTotals[i]*100/this.grand_total).toFixed(1);
this.chartWrapper.addEventListener('mousemove', (e) => {
let slice = e.target;
if(slice.classList.contains('progress-bar')) {


// this.tip.set_values(x, y, title, percent + "%");
// this.tip.show_tip();
// });
// });
let i = slice.getAttribute('data-index');
let g_off = getOffset(this.chartWrapper), p_off = getOffset(slice);

let x = p_off.left - g_off.left + slice.offsetWidth/2;
let y = p_off.top - g_off.top - 6;
let title = (this.formatted_labels && this.formatted_labels.length>0
? this.formatted_labels[i] : this.state.labels[i]) + ': ';
let percent = (s.sliceTotals[i]*100/this.grand_total).toFixed(1);

this.tip.setValues(x, y, title, percent + "%");
this.tip.showTip();
}
});
} }
} }

+ 1
- 1
src/js/charts/PieChart.js Voir le fichier

@@ -103,7 +103,7 @@ export default class PieChart extends AggregationChart {
let x = e.pageX - g_off.left + 10; let x = e.pageX - g_off.left + 10;
let y = e.pageY - g_off.top - 10; let y = e.pageY - g_off.top - 10;
let title = (this.formatted_labels && this.formatted_labels.length > 0 let title = (this.formatted_labels && this.formatted_labels.length > 0
? this.formatted_labels[i] : this.labels[i]) + ': ';
? this.formatted_labels[i] : this.state.labels[i]) + ': ';
let percent = (this.state.sliceTotals[i]*100/this.grand_total).toFixed(1); let percent = (this.state.sliceTotals[i]*100/this.grand_total).toFixed(1);
this.tip.set_values(x, y, title, percent + "%"); this.tip.set_values(x, y, title, percent + "%");
this.tip.show_tip(); this.tip.show_tip();


+ 31
- 31
src/js/objects/SvgTip.js Voir le fichier

@@ -7,10 +7,10 @@ export default class SvgTip {
}) { }) {
this.parent = parent; this.parent = parent;
this.colors = colors; this.colors = colors;
this.title_name = '';
this.title_value = '';
this.list_values = [];
this.title_value_first = 0;
this.titleName = '';
this.titleValue = '';
this.listValues = [];
this.titleValueFirst = 0;


this.x = 0; this.x = 0;
this.y = 0; this.y = 0;
@@ -22,16 +22,16 @@ export default class SvgTip {
} }


setup() { setup() {
this.make_tooltip();
this.makeTooltip();
} }


refresh() { refresh() {
this.fill(); this.fill();
this.calc_position();
// this.show_tip();
this.calcPosition();
// this.showTip();
} }


make_tooltip() {
makeTooltip() {
this.container = $.create('div', { this.container = $.create('div', {
inside: this.parent, inside: this.parent,
className: 'graph-svg-tip comparison', className: 'graph-svg-tip comparison',
@@ -39,27 +39,27 @@ export default class SvgTip {
<ul class="data-point-list"></ul> <ul class="data-point-list"></ul>
<div class="svg-pointer"></div>` <div class="svg-pointer"></div>`
}); });
this.hide_tip();
this.hideTip();


this.title = this.container.querySelector('.title'); this.title = this.container.querySelector('.title');
this.data_point_list = this.container.querySelector('.data-point-list');
this.dataPointList = this.container.querySelector('.data-point-list');


this.parent.addEventListener('mouseleave', () => { this.parent.addEventListener('mouseleave', () => {
this.hide_tip();
this.hideTip();
}); });
} }


fill() { fill() {
let title; let title;
if(this.title_value_first) {
title = `<strong>${this.title_value}</strong>${this.title_name}`;
if(this.titleValueFirst) {
title = `<strong>${this.titleValue}</strong>${this.titleName}`;
} else { } else {
title = `${this.title_name}<strong>${this.title_value}</strong>`;
title = `${this.titleName}<strong>${this.titleValue}</strong>`;
} }
this.title.innerHTML = title; this.title.innerHTML = title;
this.data_point_list.innerHTML = '';
this.dataPointList.innerHTML = '';


this.list_values.map((set, i) => {
this.listValues.map((set, i) => {
const color = this.colors[i] || 'black'; const color = this.colors[i] || 'black';


let li = $.create('li', { let li = $.create('li', {
@@ -70,50 +70,50 @@ export default class SvgTip {
${set.title ? set.title : '' }` ${set.title ? set.title : '' }`
}); });


this.data_point_list.appendChild(li);
this.dataPointList.appendChild(li);
}); });
} }


calc_position() {
calcPosition() {
let width = this.container.offsetWidth; let width = this.container.offsetWidth;


this.top = this.y - this.container.offsetHeight; this.top = this.y - this.container.offsetHeight;
this.left = this.x - width/2; this.left = this.x - width/2;
let max_left = this.parent.offsetWidth - width;
let maxLeft = this.parent.offsetWidth - width;


let pointer = this.container.querySelector('.svg-pointer'); let pointer = this.container.querySelector('.svg-pointer');


if(this.left < 0) { if(this.left < 0) {
pointer.style.left = `calc(50% - ${-1 * this.left}px)`; pointer.style.left = `calc(50% - ${-1 * this.left}px)`;
this.left = 0; this.left = 0;
} else if(this.left > max_left) {
let delta = this.left - max_left;
let pointer_offset = `calc(50% + ${delta}px)`;
pointer.style.left = pointer_offset;
} else if(this.left > maxLeft) {
let delta = this.left - maxLeft;
let pointerOffset = `calc(50% + ${delta}px)`;
pointer.style.left = pointerOffset;


this.left = max_left;
this.left = maxLeft;
} else { } else {
pointer.style.left = `50%`; pointer.style.left = `50%`;
} }
} }


set_values(x, y, title_name = '', title_value = '', list_values = [], title_value_first = 0) {
this.title_name = title_name;
this.title_value = title_value;
this.list_values = list_values;
setValues(x, y, titleName = '', titleValue = '', listValues = [], titleValueFirst = 0) {
this.titleName = titleName;
this.titleValue = titleValue;
this.listValues = listValues;
this.x = x; this.x = x;
this.y = y; this.y = y;
this.title_value_first = title_value_first;
this.titleValueFirst = titleValueFirst;
this.refresh(); this.refresh();
} }


hide_tip() {
hideTip() {
this.container.style.top = '0px'; this.container.style.top = '0px';
this.container.style.left = '0px'; this.container.style.left = '0px';
this.container.style.opacity = '0'; this.container.style.opacity = '0';
} }


show_tip() {
showTip() {
this.container.style.top = this.top + 'px'; this.container.style.top = this.top + 'px';
this.container.style.left = this.left + 'px'; this.container.style.left = this.left + 'px';
this.container.style.opacity = '1'; this.container.style.opacity = '1';


Chargement…
Annuler
Enregistrer