@@ -132,38 +132,49 @@ function closeDialog() {
132
132
}
133
133
134
134
function handleKeyDown(event : KeyboardEvent ) {
135
- if (! props .isDraggable ) return ;
136
- if (focusedIndex .value === null ) return ;
135
+ if (! props .isDraggable || focusedIndex .value === null ) return ;
137
136
138
137
const maxIndex = props .modelValue .length - 1 ;
139
-
140
138
if (event .key === " Enter" ) {
141
- if (draggedIndex .value === null ) {
142
- draggedIndex .value = focusedIndex .value ;
143
- } else {
144
- draggedIndex .value = null ;
145
- }
146
- } else if (draggedIndex .value !== null ) {
147
- if (event .key === " ArrowUp" && draggedIndex .value > 0 ) {
148
- event .preventDefault ();
149
- const list = [... props .modelValue ];
150
- const temp = list [draggedIndex .value ];
151
- list [draggedIndex .value ] = list [draggedIndex .value - 1 ];
152
- list [draggedIndex .value - 1 ] = temp ;
153
- emit (" update:modelValue" , list );
154
- draggedIndex .value = draggedIndex .value - 1 ;
155
- focusedIndex .value = draggedIndex .value ;
156
- } else if (event .key === " ArrowDown" && draggedIndex .value < maxIndex ) {
157
- event .preventDefault ();
158
- const list = [... props .modelValue ];
159
- const temp = list [draggedIndex .value ];
160
- list [draggedIndex .value ] = list [draggedIndex .value + 1 ];
161
- list [draggedIndex .value + 1 ] = temp ;
162
- emit (" update:modelValue" , list );
163
- draggedIndex .value = draggedIndex .value + 1 ;
164
- focusedIndex .value = draggedIndex .value ;
165
- }
139
+ draggedIndex .value =
140
+ draggedIndex .value === null ? focusedIndex .value : null ;
141
+ return ;
166
142
}
143
+ if (draggedIndex .value === null ) return ;
144
+
145
+ const move = (direction : number ) => {
146
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
147
+ const newIndex = draggedIndex .value ! + direction ;
148
+ if (newIndex < 0 || newIndex > maxIndex ) return ;
149
+
150
+ event .preventDefault ();
151
+
152
+ const updatedList = swapItems (
153
+ [... props .modelValue ],
154
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
155
+ draggedIndex .value ! ,
156
+ newIndex
157
+ );
158
+ emit (" update:modelValue" , updatedList );
159
+ draggedIndex .value = newIndex ;
160
+ focusedIndex .value = newIndex ;
161
+ };
162
+
163
+ if (event .key === " ArrowUp" ) move (- 1 );
164
+ if (event .key === " ArrowDown" ) move (1 );
165
+ }
166
+
167
+ function swapItems(
168
+ array : DummyChecklistItem [],
169
+ i : number ,
170
+ j : number
171
+ ): DummyChecklistItem [] {
172
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
173
+ const temp = array [i ]! ;
174
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
175
+ array [i ] = array [j ]! ;
176
+ array [j ] = temp ;
177
+ return array ;
167
178
}
168
179
</script >
169
180
0 commit comments