aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/dumbyUtils.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'src/dumbyUtils.mjs')
-rw-r--r--src/dumbyUtils.mjs64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/dumbyUtils.mjs b/src/dumbyUtils.mjs
index be0da43..b73f5cd 100644
--- a/src/dumbyUtils.mjs
+++ b/src/dumbyUtils.mjs
@@ -367,3 +367,67 @@ export const setGeoSchemeByCRS = (crs) => (link) => {
367 367
368 return link 368 return link
369} 369}
370
371/**
372 * dragForAnchor.
373 *
374 * @param {HTMLElement} container
375 * @param {Range} range
376 */
377export const dragForAnchor = (container, range, endOfLeaderLine) => {
378 // link placeholder when dragging
379 container.classList.add('dragging-geolink')
380 const geoLink = document.createElement('a')
381 geoLink.textContent = range.toString()
382 geoLink.classList.add('with-leader-line', 'geolink', 'drag')
383
384 // Replace current content with link
385 const originContent = range.cloneContents()
386 const resumeContent = () => {
387 range.deleteContents()
388 range.insertNode(originContent)
389 }
390 range.deleteContents()
391 range.insertNode(geoLink)
392
393 // Add leader-line
394 const line = new LeaderLine({
395 start: geoLink,
396 end: endOfLeaderLine,
397 path: 'magnet',
398 })
399
400 const positionObserver = new window.MutationObserver(() => {
401 line.position()
402 })
403 positionObserver.observe(endOfLeaderLine, {
404 attributes: true,
405 attributeFilter: ['style'],
406 })
407
408 // Handler for dragend
409 container.onmouseup = (e) => {
410 container.classList.remove('dragging-geolink')
411 container.onmousemove = null
412 container.onmouseup = null
413 geoLink.classList.remove('drag')
414 positionObserver.disconnect()
415 line.remove()
416
417 const map = document.elementFromPoint(e.clientX, e.clientY)
418 .closest('.mapclay[data-render="fulfilled"]')
419 if (!map) {
420 resumeContent()
421 return
422 }
423
424 const marker = addMarkerByPoint({ point: [e.clientX, e.clientY], map })
425 if (!marker) {
426 resumeContent()
427 return
428 }
429
430 geoLink.href = `geo:${marker.dataset.xy.split(',').reverse()}`
431 createGeoLink(geoLink)
432 }
433}