diff options
Diffstat (limited to 'src/dumbyUtils.mjs')
-rw-r--r-- | src/dumbyUtils.mjs | 64 |
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 | */ | ||
377 | export 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 | } | ||