aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Link.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Link.mjs')
-rw-r--r--src/Link.mjs56
1 files changed, 34 insertions, 22 deletions
diff --git a/src/Link.mjs b/src/Link.mjs
index 92aaacf..7678f3a 100644
--- a/src/Link.mjs
+++ b/src/Link.mjs
@@ -53,7 +53,7 @@ export const GeoLink = (link) => {
53 link.lines = [] 53 link.lines = []
54 54
55 // Hover link for LeaderLine 55 // Hover link for LeaderLine
56 link.onmouseover = () => getMarkersFromMaps(link) 56 link.onmouseover = () => getMarkersByGeoLink(link)
57 .filter(isAnchorVisible) 57 .filter(isAnchorVisible)
58 .forEach(anchor => { 58 .forEach(anchor => {
59 const labelText = new URL(link).searchParams.get('text') ?? link.textContent 59 const labelText = new URL(link).searchParams.get('text') ?? link.textContent
@@ -78,7 +78,7 @@ export const GeoLink = (link) => {
78 link.onclick = (event) => { 78 link.onclick = (event) => {
79 event.preventDefault() 79 event.preventDefault()
80 removeLeaderLines(link) 80 removeLeaderLines(link)
81 getMarkersFromMaps(link).forEach(marker => { 81 getMarkersByGeoLink(link).forEach(marker => {
82 const map = marker.closest('.mapclay') 82 const map = marker.closest('.mapclay')
83 map.scrollIntoView({ behavior: 'smooth' }) 83 map.scrollIntoView({ behavior: 'smooth' })
84 updateMapCameraByMarker([ 84 updateMapCameraByMarker([
@@ -93,7 +93,7 @@ export const GeoLink = (link) => {
93 if (e.which !== 2) return 93 if (e.which !== 2) return
94 e.preventDefault() 94 e.preventDefault()
95 removeLeaderLines(link) 95 removeLeaderLines(link)
96 getMarkersFromMaps(link) 96 getMarkersByGeoLink(link)
97 .forEach(marker => marker.remove()) 97 .forEach(marker => marker.remove())
98 } 98 }
99 99
@@ -101,44 +101,56 @@ export const GeoLink = (link) => {
101} 101}
102 102
103/** 103/**
104 * GeoLink: getMarkersFromMaps. Get marker elements by GeoLink 104 * GeoLink: getMarkersFromMaps. Get marker elements from maps
105 * 105 *
106 * @param {GeoLink} link 106 * @param {Number[]} xy - xy values of marker
107 * @param {string} options.type - type of marker
108 * @param {string} options.title - title of marker
109 * @param {Function} options.filter - filter of map elements
107 * @return {HTMLElement[]} markers 110 * @return {HTMLElement[]} markers
108 */ 111 */
109export const getMarkersFromMaps = (link) => { 112export const getMarkersFromMaps = (xy, { type = 'pin', title, filter = () => true }) => {
110 const params = new URLSearchParams(link.search)
111 const maps = Array.from( 113 const maps = Array.from(
112 link.closest('.Dumby') 114 document.querySelector('.Dumby')
113 .querySelectorAll('.mapclay[data-render="fulfilled"]'), 115 .querySelectorAll('.mapclay[data-render="fulfilled"]'),
114 ) 116 )
115 return maps 117 return maps
116 .filter(map => link.targets ? link.targets.includes(map.id) : true) 118 .filter(filter)
117 .map(map => { 119 .map(map => {
118 const renderer = map.renderer 120 const renderer = map.renderer
119 const lonLat = [Number(link.dataset.lon), Number(link.dataset.lat)]
120 const type = params.get('type') ?? 'pin'
121 const svg = markers[type] 121 const svg = markers[type]
122 const element = document.createElement('div') 122 const element = document.createElement('div')
123 element.style.cssText = `width: ${svg.size[0]}px; height: ${svg.size[1]}px;` 123 element.style.cssText = `width: ${svg.size[0]}px; height: ${svg.size[1]}px;`
124 element.innerHTML = svg.html 124 element.innerHTML = svg.html
125 125
126 const marker = map.querySelector(`.marker[data-xy="${lonLat}"]`) ?? 126 const marker = map.querySelector(`.marker[data-xy="${xy}"]`) ??
127 renderer.addMarker({ 127 renderer.addMarker({ xy, element, type, anchor: svg.anchor, size: svg.size })
128 xy: lonLat, 128 marker.dataset.xy = xy
129 element, 129 marker.title = title
130 type,
131 anchor: svg.anchor,
132 size: svg.size,
133 })
134 marker.dataset.xy = lonLat
135 marker.title = link.textContent
136 130
137 return marker 131 return marker
138 }) 132 })
139} 133}
140 134
141/** 135/**
136 * GeoLink: getMarkersByGeoLink. Get marker elements by GeoLink
137 *
138 * @param {GeoLink} link
139 * @return {HTMLElement[]} markers
140 */
141export const getMarkersByGeoLink = (link) => {
142 const params = new URLSearchParams(link.search)
143 const type = params.get('type') ?? 'pin'
144 const lonLat = [Number(link.dataset.lon), Number(link.dataset.lat)]
145
146 return getMarkersFromMaps(lonLat, {
147 type,
148 title: link.textContent,
149 filter: map => !link.targets || link.targets.includes(map.id),
150 })
151}
152
153/**
142 * DocLink: append DocLink features onto anchor element 154 * DocLink: append DocLink features onto anchor element
143 * @param {HTMLAnchorElement} link 155 * @param {HTMLAnchorElement} link
144 * @return {DocLink} 156 * @return {DocLink}
@@ -213,7 +225,7 @@ const isAnchorVisible = anchor => {
213 * @param {Number[]} xy 225 * @param {Number[]} xy
214 * @return {Function} function 226 * @return {Function} function
215 */ 227 */
216const updateMapCameraByMarker = lonLat => marker => { 228export const updateMapCameraByMarker = lonLat => marker => {
217 const renderer = marker.closest('.mapclay')?.renderer 229 const renderer = marker.closest('.mapclay')?.renderer
218 renderer.updateCamera({ center: lonLat }, true) 230 renderer.updateCamera({ center: lonLat }, true)
219} 231}