Skip to content

Commit 3a237c6

Browse files
Merge pull request #5 from robinsimonklein/fix/number-value-cursor-on-increment-decrement
Keep cursor at end on number value when decrement/increment
2 parents 34e4d80 + c0a7038 commit 3a237c6

File tree

3 files changed

+15
-12
lines changed

3 files changed

+15
-12
lines changed

src/components/core/value-tree/type/ValueTreeNumber.vue

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import { nextTick, onMounted, ref, watch } from 'vue';
5555
import ValueTreeWrapper from '@/components/core/value-tree/ValueTreeWrapper.vue';
5656
import { Button } from '@/components/ui/button';
5757
import { Pencil, Check, XIcon, TriangleAlert } from 'lucide-vue-next';
58+
import { placeCursorAtEnd } from '@/utils/dom.ts';
5859
5960
const props = withDefaults(
6061
defineProps<{
@@ -89,26 +90,23 @@ const decrement = () => {
8990
if (!valueElement.value) return;
9091
const value = parseFloat(valueElement.value.innerText);
9192
if (!isNaN(value)) valueElement.value.innerText = (value - 1).toString();
93+
placeCursorAtEnd(valueElement.value);
9294
};
9395
9496
const increment = () => {
9597
if (!isEditing.value) return;
9698
if (!valueElement.value) return;
9799
const value = parseFloat(valueElement.value.innerText);
98100
if (!isNaN(value)) valueElement.value.innerText = (value + 1).toString();
101+
placeCursorAtEnd(valueElement.value);
99102
};
100103
101104
const edit = () => {
102105
isEditing.value = true;
103106
104107
nextTick(() => {
105108
if (!valueElement.value) return;
106-
const range = document.createRange();
107-
const sel = window.getSelection();
108-
range.setStart(valueElement.value.childNodes[0], modelValue.value.toString().length);
109-
range.collapse(true);
110-
sel?.removeAllRanges();
111-
sel?.addRange(range);
109+
placeCursorAtEnd(valueElement.value);
112110
valueElement.value.focus();
113111
validate();
114112
});

src/components/core/value-tree/type/ValueTreeString.vue

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import { nextTick, onMounted, ref, watch } from 'vue';
5151
import ValueTreeWrapper from '@/components/core/value-tree/ValueTreeWrapper.vue';
5252
import { Button } from '@/components/ui/button';
5353
import { Pencil, Check, XIcon } from 'lucide-vue-next';
54+
import { placeCursorAtEnd } from '@/utils/dom.ts';
5455
5556
const props = withDefaults(
5657
defineProps<{
@@ -77,12 +78,7 @@ const edit = () => {
7778
isEditing.value = true;
7879
nextTick(() => {
7980
if (!valueElement.value) return;
80-
const range = document.createRange();
81-
const sel = window.getSelection();
82-
range.setStart(valueElement.value.childNodes[0], modelValue.value.length);
83-
range.collapse(true);
84-
sel?.removeAllRanges();
85-
sel?.addRange(range);
81+
placeCursorAtEnd(valueElement.value);
8682
valueElement.value.focus();
8783
});
8884
};

src/utils/dom.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,12 @@ export const getElementSelectorString = (element: Element) => {
99
}
1010
return str;
1111
};
12+
13+
export const placeCursorAtEnd = (element: HTMLElement) => {
14+
const range = document.createRange();
15+
const sel = window.getSelection();
16+
range.setStart(element.childNodes[0], element.innerText?.length);
17+
range.collapse(true);
18+
sel?.removeAllRanges();
19+
sel?.addRange(range);
20+
};

0 commit comments

Comments
 (0)