fix: improve drag-and-drop reordering logic in ManageColumnsDialog for better stability and index handling
This commit is contained in:
+21
-11
@@ -2435,14 +2435,8 @@ fun ManageColumnsDialog(
|
|||||||
var fieldToEdit by remember { mutableStateOf<Field?>(null) }
|
var fieldToEdit by remember { mutableStateOf<Field?>(null) }
|
||||||
var fieldToDelete by remember { mutableStateOf<Field?>(null) }
|
var fieldToDelete by remember { mutableStateOf<Field?>(null) }
|
||||||
|
|
||||||
// Use derivedStateOf to keep reorderedFields in sync with fields
|
// Keep a single stable list instance; synchronize its contents from 'fields'
|
||||||
val reorderedFields =
|
val reorderedFields = remember { mutableStateListOf<Field>() }
|
||||||
remember(fields) {
|
|
||||||
mutableStateListOf<Field>().apply {
|
|
||||||
clear()
|
|
||||||
addAll(fields)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Watch for changes in fields and update reorderedFields
|
// Watch for changes in fields and update reorderedFields
|
||||||
LaunchedEffect(fields) {
|
LaunchedEffect(fields) {
|
||||||
@@ -2506,9 +2500,25 @@ fun ManageColumnsDialog(
|
|||||||
// Column list with drag-and-drop reordering
|
// Column list with drag-and-drop reordering
|
||||||
val reorderState =
|
val reorderState =
|
||||||
rememberReorderableLazyListState(onMove = { from, to ->
|
rememberReorderableLazyListState(onMove = { from, to ->
|
||||||
val item = reorderedFields.removeAt(from.index)
|
if (reorderedFields.isEmpty()) return@rememberReorderableLazyListState
|
||||||
val target = if (to.index > reorderedFields.size) reorderedFields.size else to.index
|
val lastIndex = reorderedFields.lastIndex
|
||||||
reorderedFields.add(target, item)
|
if (lastIndex < 0) return@rememberReorderableLazyListState
|
||||||
|
|
||||||
|
val fromIndex = from.index.coerceIn(0, lastIndex)
|
||||||
|
// Clamp target index into valid range; drop-at-end maps to lastIndex
|
||||||
|
val toIndex = to.index.coerceIn(0, lastIndex)
|
||||||
|
|
||||||
|
if (fromIndex in 0..lastIndex && toIndex in 0..lastIndex) {
|
||||||
|
if (fromIndex != toIndex && reorderedFields.isNotEmpty()) {
|
||||||
|
val item = reorderedFields.removeAt(fromIndex)
|
||||||
|
val newLastIndex = reorderedFields.lastIndex
|
||||||
|
var insertIndex = toIndex
|
||||||
|
// Adjust target when moving forward due to index shift after removal
|
||||||
|
if (fromIndex < toIndex) insertIndex = (toIndex - 1).coerceIn(0, newLastIndex + 1)
|
||||||
|
insertIndex = insertIndex.coerceIn(0, newLastIndex + 1)
|
||||||
|
reorderedFields.add(insertIndex, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
|
|||||||
Reference in New Issue
Block a user