import $ from '../helpers/dom'; export default class SvgTip { constructor({ parent = null }) { this.parent = parent; this.title_name = ''; this.title_value = ''; this.list_values = []; this.title_value_first = 0; this.x = 0; this.y = 0; this.top = 0; this.left = 0; this.setup(); } setup() { this.make_tooltip(); } refresh() { this.fill(); this.calc_position(); // this.show_tip(); } make_tooltip() { this.container = $.create('div', { inside: this.parent, className: 'graph-svg-tip comparison', innerHTML: `
` }); this.hide_tip(); this.title = this.container.querySelector('.title'); this.data_point_list = this.container.querySelector('.data-point-list'); this.parent.addEventListener('mouseleave', () => { this.hide_tip(); }); } fill() { let title; if(this.title_value_first) { title = `${this.title_value}${this.title_name}`; } else { title = `${this.title_name}${this.title_value}`; } this.title.innerHTML = title; this.data_point_list.innerHTML = ''; this.list_values.map((set) => { let li = $.create('li', { className: `border-top ${set.color || 'black'}`, innerHTML: `${ isNaN(set.value) ? '' : set.value } ${set.title ? set.title : '' }` }); this.data_point_list.appendChild(li); }); } calc_position() { let width = this.container.offsetWidth; this.top = this.y - this.container.offsetHeight; this.left = this.x - width/2; let max_left = this.parent.offsetWidth - width; let pointer = this.container.querySelector('.svg-pointer'); if(this.left < 0) { pointer.style.left = `calc(50% - ${-1 * this.left}px)`; 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; this.left = max_left; } else { 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; this.x = x; this.y = y; this.title_value_first = title_value_first; this.refresh(); } hide_tip() { this.container.style.top = '0px'; this.container.style.left = '0px'; this.container.style.opacity = '0'; } show_tip() { this.container.style.top = this.top + 'px'; this.container.style.left = this.left + 'px'; this.container.style.opacity = '1'; } }