diff options
author | Hsieh Chin Fan <pham@topo.tw> | 2024-10-28 12:23:25 +0800 |
---|---|---|
committer | Hsieh Chin Fan <pham@topo.tw> | 2024-10-28 19:44:05 +0800 |
commit | 6d8400e11ac5ebb05b43a12367384e686f834d7c (patch) | |
tree | b82e4d38d71921943dcb9882ee4333d0d0cb94c9 | |
parent | 65680175fc04e71b362458745727974af73f711c (diff) |
feat: add menu-item for edit map without editor
-rw-r--r-- | src/MenuItem.mjs | 33 | ||||
-rw-r--r-- | src/css/dumbymap.css | 7 | ||||
-rw-r--r-- | src/dumbymap.mjs | 41 | ||||
-rw-r--r-- | src/editor.mjs | 1 |
4 files changed, 71 insertions, 11 deletions
diff --git a/src/MenuItem.mjs b/src/MenuItem.mjs index d9645f7..eb683ea 100644 --- a/src/MenuItem.mjs +++ b/src/MenuItem.mjs | |||
@@ -523,3 +523,36 @@ export const addMarker = ({ | |||
523 | callback?.(marker) | 523 | callback?.(marker) |
524 | }, | 524 | }, |
525 | }) | 525 | }) |
526 | |||
527 | /** | ||
528 | * editByRawText. | ||
529 | * | ||
530 | * @param {HTMLElement} ele | ||
531 | */ | ||
532 | export const editMapByRawText = (ele) => new Item({ | ||
533 | text: 'Edit by Raw Text', | ||
534 | onclick: () => { | ||
535 | const maps = Array.from(ele.querySelectorAll('.mapclay')) | ||
536 | if (!maps) return false | ||
537 | |||
538 | const rect = ele.getBoundingClientRect() | ||
539 | const textArea = document.createElement('textarea') | ||
540 | textArea.className = 'edit-map' | ||
541 | textArea.style.cssText = `width: ${rect.width}px; height: ${rect.height}px;` | ||
542 | textArea.value = maps.map(map => map.dataset.mapclay ?? '') | ||
543 | .join('---') | ||
544 | .replaceAll(',', '\n') | ||
545 | .replaceAll(/["{}]/g, '') | ||
546 | .replaceAll(/:(\w)/g, ': $1') | ||
547 | |||
548 | textArea.addEventListener('focusout', () => { | ||
549 | const code = document.createElement('code') | ||
550 | code.className = 'map' | ||
551 | code.textContent = textArea.value | ||
552 | textArea.replaceWith(code) | ||
553 | }) | ||
554 | ele.replaceChildren(textArea) | ||
555 | |||
556 | return true | ||
557 | }, | ||
558 | }) | ||
diff --git a/src/css/dumbymap.css b/src/css/dumbymap.css index d641785..f0b4575 100644 --- a/src/css/dumbymap.css +++ b/src/css/dumbymap.css | |||
@@ -740,3 +740,10 @@ pre:has(.mapclay) { | |||
740 | .draggable-block:has(pre:only-child [data-placeholder]:only-child) { | 740 | .draggable-block:has(pre:only-child [data-placeholder]:only-child) { |
741 | display: none; | 741 | display: none; |
742 | } | 742 | } |
743 | |||
744 | textarea .edit-map { | ||
745 | text-wrap: nowrap; | ||
746 | |||
747 | font-size: 1.1rem; | ||
748 | line-height: 1.5; | ||
749 | } | ||
diff --git a/src/dumbymap.mjs b/src/dumbymap.mjs index 46a67a0..3792994 100644 --- a/src/dumbymap.mjs +++ b/src/dumbymap.mjs | |||
@@ -551,7 +551,17 @@ export const generateMaps = (container, { | |||
551 | }).observe(menu, { childList: true }) | 551 | }).observe(menu, { childList: true }) |
552 | menu.timer = setTimeout(() => menu.remove(), 100) | 552 | menu.timer = setTimeout(() => menu.remove(), 100) |
553 | 553 | ||
554 | // Menu Items for Links | 554 | /** Menu Item for editing map */ |
555 | const mapEditor = e.target.closest('.edit-map') | ||
556 | if (mapEditor) { | ||
557 | menu.appendChild(new menuItem.Item({ | ||
558 | text: 'Finish Editig', | ||
559 | onclick: () => mapEditor.blur(), | ||
560 | })) | ||
561 | return | ||
562 | } | ||
563 | |||
564 | /** Menu Items for Links */ | ||
555 | const geoLink = e.target.closest('.geolink') | 565 | const geoLink = e.target.closest('.geolink') |
556 | if (geoLink) { | 566 | if (geoLink) { |
557 | if (geoLink.classList.contains('from-text')) { | 567 | if (geoLink.classList.contains('from-text')) { |
@@ -575,22 +585,31 @@ export const generateMaps = (container, { | |||
575 | } | 585 | } |
576 | 586 | ||
577 | // Menu Items for map | 587 | // Menu Items for map |
578 | if (map?.dataset?.render === 'fulfilled') { | 588 | if (map) { |
579 | const rect = map.getBoundingClientRect() | 589 | const rect = map.getBoundingClientRect() |
580 | const [x, y] = [e.x - rect.left, e.y - rect.top] | 590 | const [x, y] = [e.x - rect.left, e.y - rect.top] |
581 | menu.appendChild(menuItem.toggleMapFocus(map)) | ||
582 | menu.appendChild(menuItem.renderResults(dumbymap, map)) | ||
583 | menu.appendChild(new menuItem.Folder({ | 591 | menu.appendChild(new menuItem.Folder({ |
584 | text: 'Actions', | 592 | text: 'Edit Map', |
585 | items: [ | 593 | items: [ |
586 | menuItem.getCoordinatesByPixels(map, [x, y]), | 594 | menuItem.editMapByRawText(map.parentElement), |
587 | menuItem.restoreCamera(map), | ||
588 | menuItem.addMarker({ | ||
589 | point: [e.pageX, e.pageY], | ||
590 | map, | ||
591 | }), | ||
592 | ], | 595 | ], |
593 | })) | 596 | })) |
597 | menu.appendChild(menuItem.renderResults(dumbymap, map)) | ||
598 | |||
599 | if (map.dataset.render === 'fulfilled') { | ||
600 | menu.appendChild(menuItem.toggleMapFocus(map)) | ||
601 | menu.appendChild(new menuItem.Folder({ | ||
602 | text: 'Actions', | ||
603 | items: [ | ||
604 | menuItem.getCoordinatesByPixels(map, [x, y]), | ||
605 | menuItem.restoreCamera(map), | ||
606 | menuItem.addMarker({ | ||
607 | point: [e.pageX, e.pageY], | ||
608 | map, | ||
609 | }), | ||
610 | ], | ||
611 | })) | ||
612 | } | ||
594 | } else { | 613 | } else { |
595 | // Toggle block focus | 614 | // Toggle block focus |
596 | if (block) { | 615 | if (block) { |
diff --git a/src/editor.mjs b/src/editor.mjs index b023d1a..f7b9c65 100644 --- a/src/editor.mjs +++ b/src/editor.mjs | |||
@@ -901,6 +901,7 @@ cm.on('keydown', (_, e) => { | |||
901 | }) | 901 | }) |
902 | 902 | ||
903 | document.onkeydown = e => { | 903 | document.onkeydown = e => { |
904 | if (document.activeElement.matches('textarea')) return null | ||
904 | if (e.altKey && e.ctrlKey && e.key === 'm') { | 905 | if (e.altKey && e.ctrlKey && e.key === 'm') { |
905 | toggleEditing() | 906 | toggleEditing() |
906 | e.preventDefault() | 907 | e.preventDefault() |