diff options
| author | Hsieh Chin Fan <pham@topo.tw> | 2024-10-12 20:28:31 +0800 |
|---|---|---|
| committer | Hsieh Chin Fan <pham@topo.tw> | 2024-10-13 11:06:46 +0800 |
| commit | 528036f50d5dac0076b479c266350812a39180b5 (patch) | |
| tree | 1d22dcba033e1b265070e94b5a9b035cc5f66e50 | |
| parent | 124353ca30b36e69b94e50e6171ff61d7c20709e (diff) | |
refactor: don't re-render HTML by dragging
| -rw-r--r-- | src/css/dumbymap.css | 2 | ||||
| -rw-r--r-- | src/editor.mjs | 22 |
2 files changed, 15 insertions, 9 deletions
diff --git a/src/css/dumbymap.css b/src/css/dumbymap.css index 416c216..7ddb21a 100644 --- a/src/css/dumbymap.css +++ b/src/css/dumbymap.css | |||
| @@ -761,7 +761,7 @@ root { | |||
| 761 | .dragging-geolink { | 761 | .dragging-geolink { |
| 762 | user-select: none; | 762 | user-select: none; |
| 763 | 763 | ||
| 764 | .dumby-block > :not(:has(.mapclay)) { | 764 | .dumby-block > :not(:has(.mapclay[data-render="fulfilled"])) { |
| 765 | opacity: 0.3; | 765 | opacity: 0.3; |
| 766 | } | 766 | } |
| 767 | } | 767 | } |
diff --git a/src/editor.mjs b/src/editor.mjs index c3c51ef..cdbd5cc 100644 --- a/src/editor.mjs +++ b/src/editor.mjs | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | import { markdown2HTML, generateMaps } from './dumbymap' | 2 | import { markdown2HTML, generateMaps } from './dumbymap' |
| 3 | import { defaultAliases, parseConfigsFromYaml } from 'mapclay' | 3 | import { defaultAliases, parseConfigsFromYaml } from 'mapclay' |
| 4 | import * as menuItem from './MenuItem' | 4 | import * as menuItem from './MenuItem' |
| 5 | import { addAnchorByPoint } from './dumbyUtils.mjs' | 5 | import { addAnchorByPoint, createGeoLink } from './dumbyUtils.mjs' |
| 6 | import { shiftByWindow } from './utils.mjs' | 6 | import { shiftByWindow } from './utils.mjs' |
| 7 | import LeaderLine from 'leader-line' | 7 | import LeaderLine from 'leader-line' |
| 8 | import * as tutorial from './tutorial' | 8 | import * as tutorial from './tutorial' |
| @@ -1084,6 +1084,7 @@ dumbyContainer.onmousedown = (e) => { | |||
| 1084 | const geoLink = document.createElement('a') | 1084 | const geoLink = document.createElement('a') |
| 1085 | geoLink.textContent = range.toString() | 1085 | geoLink.textContent = range.toString() |
| 1086 | geoLink.classList.add('with-leader-line', 'geolink', 'drag') | 1086 | geoLink.classList.add('with-leader-line', 'geolink', 'drag') |
| 1087 | const originContent = range.cloneContents() | ||
| 1087 | range.deleteContents() | 1088 | range.deleteContents() |
| 1088 | range.insertNode(geoLink) | 1089 | range.insertNode(geoLink) |
| 1089 | 1090 | ||
| @@ -1113,15 +1114,16 @@ dumbyContainer.onmousedown = (e) => { | |||
| 1113 | line?.remove() | 1114 | line?.remove() |
| 1114 | lineEnd.remove() | 1115 | lineEnd.remove() |
| 1115 | dumbymap.utils.renderedMaps().forEach(map => map.style.removeProperty('cursor')) | 1116 | dumbymap.utils.renderedMaps().forEach(map => map.style.removeProperty('cursor')) |
| 1116 | const resumeContent = () => updateDumbyMap(newDumbymap => { | 1117 | const resumeContent = () => { |
| 1117 | const scrollTop = dumbymap.htmlHolder.scrollTop | 1118 | range.deleteContents() |
| 1118 | newDumbymap.htmlHolder.scrollBy(0, scrollTop) | 1119 | range.insertNode(originContent) |
| 1119 | }) | 1120 | } |
| 1120 | 1121 | ||
| 1121 | const map = document.elementFromPoint(e.clientX, e.clientY).closest('.mapclay') | 1122 | const map = document.elementFromPoint(e.clientX, e.clientY) |
| 1123 | .closest('.mapclay[data-render="fulfilled"]') | ||
| 1122 | const selection = cm.getSelection() | 1124 | const selection = cm.getSelection() |
| 1123 | if (!map || !selection) { | 1125 | if (!map || !selection) { |
| 1124 | resumeContent() | 1126 | resumeContent('map/selection') |
| 1125 | return | 1127 | return |
| 1126 | } | 1128 | } |
| 1127 | 1129 | ||
| @@ -1132,16 +1134,20 @@ dumbyContainer.onmousedown = (e) => { | |||
| 1132 | validateAnchorName, | 1134 | validateAnchorName, |
| 1133 | }) | 1135 | }) |
| 1134 | if (!refLink) { | 1136 | if (!refLink) { |
| 1135 | resumeContent() | 1137 | resumeContent('reflink') |
| 1136 | return | 1138 | return |
| 1137 | } | 1139 | } |
| 1138 | 1140 | ||
| 1141 | const scrollTop = dumbymap.htmlHolder.scrollTop | ||
| 1142 | geoLink.href = refLink.link | ||
| 1143 | createGeoLink(geoLink) | ||
| 1139 | appendRefLink(cm, refLink) | 1144 | appendRefLink(cm, refLink) |
| 1140 | if (selection === refLink.ref) { | 1145 | if (selection === refLink.ref) { |
| 1141 | cm.replaceSelection(`[${selection}]`) | 1146 | cm.replaceSelection(`[${selection}]`) |
| 1142 | } else { | 1147 | } else { |
| 1143 | cm.replaceSelection(`[${selection}][${refLink.ref}]`) | 1148 | cm.replaceSelection(`[${selection}][${refLink.ref}]`) |
| 1144 | } | 1149 | } |
| 1150 | dumbymap.htmlHolder.scrollBy(0, scrollTop) | ||
| 1145 | } | 1151 | } |
| 1146 | } | 1152 | } |
| 1147 | 1153 | ||