aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorHsieh Chin Fan <pham@topo.tw>2024-10-28 12:23:25 +0800
committerHsieh Chin Fan <pham@topo.tw>2024-10-28 19:44:05 +0800
commit6d8400e11ac5ebb05b43a12367384e686f834d7c (patch)
treeb82e4d38d71921943dcb9882ee4333d0d0cb94c9
parent65680175fc04e71b362458745727974af73f711c (diff)
feat: add menu-item for edit map without editor
-rw-r--r--src/MenuItem.mjs33
-rw-r--r--src/css/dumbymap.css7
-rw-r--r--src/dumbymap.mjs41
-rw-r--r--src/editor.mjs1
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 */
532export 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
744textarea .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
903document.onkeydown = e => { 903document.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()