Skip to content

Commit 9a163a0

Browse files
refactor: move tooltip functionality to class (#53)
1 parent 9d5949c commit 9a163a0

File tree

5 files changed

+82
-48
lines changed

5 files changed

+82
-48
lines changed

src/js/core/createTooltip.js

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/js/elements/line.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ class Line extends MapElement {
1515
}
1616
}
1717

18-
export default Line
18+
export default Line

src/js/elements/tooltip.js

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import {
2+
createElement,
3+
findElement
4+
} from "../util"
5+
import EventHandler from "../eventHandler"
6+
7+
/**
8+
* ------------------------------------------------------------------------
9+
* Class Definition
10+
* ------------------------------------------------------------------------
11+
*/
12+
class Tooltip {
13+
constructor(map) {
14+
const tooltip = createElement('div', 'jvm-tooltip')
15+
16+
this._map = map
17+
this._tooltip = document.body.appendChild(tooltip)
18+
19+
this._bindEventListeners()
20+
21+
return this
22+
}
23+
24+
_bindEventListeners() {
25+
EventHandler.on(this._map.container, 'mousemove', event => {
26+
if (!this._tooltip.classList.contains('active')) {
27+
return
28+
}
29+
30+
const container = findElement(this._map.container, '#jvm-regions-group').getBoundingClientRect()
31+
const space = 5 // Space between the cursor and tooltip element
32+
33+
// Tooltip
34+
const { height, width } = this._tooltip.getBoundingClientRect()
35+
const topIsPassed = event.clientY <= (container.top + height + space)
36+
let top = event.pageY - height - space
37+
let left = event.pageX - width - space
38+
39+
// Ensure the tooltip will never cross outside the canvas area(map)
40+
if (topIsPassed) { // Top:
41+
top += height + space
42+
43+
// The cursor is a bit larger from left side
44+
left -= space * 2
45+
}
46+
47+
if (event.clientX < (container.left + width + space)) { // Left:
48+
left = event.pageX + space + 2
49+
50+
if (topIsPassed) {
51+
left += space * 2
52+
}
53+
}
54+
55+
this._tooltip.style.cssText = `top: ${top}px; left: ${left}px`
56+
})
57+
}
58+
59+
show() {
60+
this._tooltip.classList.add('active')
61+
}
62+
63+
hide() {
64+
this._tooltip.classList.remove('active')
65+
}
66+
67+
text(string) {
68+
if (!string) {
69+
return this._tooltip.textContent
70+
}
71+
72+
this._tooltip.textContent = string
73+
}
74+
}
75+
76+
export default Tooltip

src/js/map.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import SVGCanvasElement from './svg/canvasElement'
99
import MapPrototypes from './core/index'
1010
import Events from './defaults/events'
1111
import EventHandler from './eventHandler'
12+
import Tooltip from './elements/tooltip'
1213

1314
/**
1415
* ------------------------------------------------------------------------
@@ -97,7 +98,7 @@ class Map {
9798

9899
// Create toolip
99100
if (options.showTooltip) {
100-
this.createTooltip()
101+
this.tooltip = new Tooltip(this)
101102
}
102103

103104
// Create zoom buttons if `zoomButtons` is set to true

src/scss/jsvectormap.scss

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ image, text, .#{$classPrefix}zoomin, .#{$classPrefix}zoomout { user-select: none
6464
position: absolute;
6565
display: none;
6666
color: #FFF;
67+
&.active {
68+
display: block;
69+
}
6770
}
6871

6972
// Zoom buttons

0 commit comments

Comments
 (0)