Fix some crashes when deleting assignments

This commit is contained in:
2025-06-11 15:01:38 +02:00
parent 59d97f8ce5
commit 0d6f361a45
2 changed files with 14 additions and 10 deletions

View File

@ -64,14 +64,14 @@ fun EditionView(state: EditionState) = Row(Modifier.padding(0.dp)) {
{ name, note, contact, add -> state.newStudent(name, contact, note, add) }, { name, note, contact, add -> state.newStudent(name, contact, note, add) },
{ students -> state.addToCourse(students) }, { students -> state.addToCourse(students) },
{ s, name -> state.setStudentName(s, name) } { s, name -> state.setStudentName(s, name) }
) { s -> state.delete(s) } ) { s, idx -> state.delete(s); if(id == idx) state.clearHistoryIndex() }
OpenPanel.Group -> GroupPanel( OpenPanel.Group -> GroupPanel(
course, edition, groups, id, course, edition, groups, id,
{ state.navTo(it) }, { state.navTo(it) },
{ name -> state.newGroup(name) }, { name -> state.newGroup(name) },
{ g, name -> state.setGroupName(g, name) } { g, name -> state.setGroupName(g, name) }
) { g -> state.delete(g) } ) { g, idx -> state.delete(g); if(id == idx) state.clearHistoryIndex() }
OpenPanel.Assignment -> AssignmentPanel( OpenPanel.Assignment -> AssignmentPanel(
course, edition, mergedAssignments, id, course, edition, mergedAssignments, id,
@ -79,7 +79,7 @@ fun EditionView(state: EditionState) = Row(Modifier.padding(0.dp)) {
{ type, name -> state.newAssignment(type, name) }, { type, name -> state.newAssignment(type, name) },
{ a, name -> state.setAssignmentTitle(a, name) }, { a, name -> state.setAssignmentTitle(a, name) },
{ a1, a2 -> state.swapOrder(a1, a2) } { a1, a2 -> state.swapOrder(a1, a2) }
) { a -> state.delete(a) } ) { a, idx -> state.delete(a); if(id == idx) state.clearHistoryIndex() }
} }
} }
} }
@ -133,7 +133,7 @@ fun StudentPanel(
course: Course, edition: Edition, students: List<Student>, available: List<Student>, course: Course, edition: Edition, students: List<Student>, available: List<Student>,
selected: Int, onSelect: (Int) -> Unit, selected: Int, onSelect: (Int) -> Unit,
onAdd: (name: String, note: String, contact: String, addToEdition: Boolean) -> Unit, onAdd: (name: String, note: String, contact: String, addToEdition: Boolean) -> Unit,
onImport: (List<Student>) -> Unit, onUpdate: (Student, String) -> Unit, onDelete: (Student) -> Unit onImport: (List<Student>) -> Unit, onUpdate: (Student, String) -> Unit, onDelete: (Student, Int) -> Unit
) = Column(Modifier.padding(10.dp)) { ) = Column(Modifier.padding(10.dp)) {
var showDialog by remember { mutableStateOf(false) } var showDialog by remember { mutableStateOf(false) }
var deleting by remember { mutableStateOf(-1) } var deleting by remember { mutableStateOf(-1) }
@ -171,7 +171,7 @@ fun StudentPanel(
ConfirmDeleteDialog( ConfirmDeleteDialog(
"a student", "a student",
{ deleting = -1 }, { deleting = -1 },
{ onDelete(students[deleting]) } { onDelete(students[deleting], deleting) }
) { Text(students[deleting].name) } ) { Text(students[deleting].name) }
} }
} }
@ -180,7 +180,7 @@ fun StudentPanel(
fun GroupPanel( fun GroupPanel(
course: Course, edition: Edition, groups: List<Group>, course: Course, edition: Edition, groups: List<Group>,
selected: Int, onSelect: (Int) -> Unit, selected: Int, onSelect: (Int) -> Unit,
onAdd: (String) -> Unit, onUpdate: (Group, String) -> Unit, onDelete: (Group) -> Unit onAdd: (String) -> Unit, onUpdate: (Group, String) -> Unit, onDelete: (Group, Int) -> Unit
) = Column(Modifier.padding(10.dp)) { ) = Column(Modifier.padding(10.dp)) {
var showDialog by remember { mutableStateOf(false) } var showDialog by remember { mutableStateOf(false) }
var deleting by remember { mutableStateOf(-1) } var deleting by remember { mutableStateOf(-1) }
@ -218,7 +218,7 @@ fun GroupPanel(
ConfirmDeleteDialog( ConfirmDeleteDialog(
"a group", "a group",
{ deleting = -1 }, { deleting = -1 },
{ onDelete(groups[deleting]) } { onDelete(groups[deleting], deleting) }
) { Text(groups[deleting].name) } ) { Text(groups[deleting].name) }
} }
} }
@ -228,7 +228,7 @@ fun AssignmentPanel(
course: Course, edition: Edition, assignments: List<Assignment>, course: Course, edition: Edition, assignments: List<Assignment>,
selected: Int, onSelect: (Int) -> Unit, selected: Int, onSelect: (Int) -> Unit,
onAdd: (AssignmentType, String) -> Unit, onUpdate: (Assignment, String) -> Unit, onAdd: (AssignmentType, String) -> Unit, onUpdate: (Assignment, String) -> Unit,
onSwapOrder: (Assignment, Assignment) -> Unit, onDelete: (Assignment) -> Unit onSwapOrder: (Assignment, Assignment) -> Unit, onDelete: (Assignment, Int) -> Unit
) = Column(Modifier.padding(10.dp)) { ) = Column(Modifier.padding(10.dp)) {
var showDialog by remember { mutableStateOf(false) } var showDialog by remember { mutableStateOf(false) }
var deleting by remember { mutableStateOf(-1) } var deleting by remember { mutableStateOf(-1) }
@ -315,8 +315,8 @@ fun AssignmentPanel(
ConfirmDeleteDialog( ConfirmDeleteDialog(
"an assignment", "an assignment",
{ deleting = -1 }, { deleting = -1 },
{ onDelete(assignments[deleting]) } { onDelete(assignments[deleting], deleting) }
) { Text(assignments[deleting].name()) } ) { if(deleting != -1) Text(assignments[deleting].name()) }
} }
} }

View File

@ -362,6 +362,10 @@ class EditionState(val edition: Edition) {
while(temp.last().first == -1 && temp.size >= 2) temp = temp.dropLast(1) while(temp.last().first == -1 && temp.size >= 2) temp = temp.dropLast(1)
_history.value = temp _history.value = temp
} }
fun clearHistoryIndex() {
val last = _history.value.lastOrNull() ?: return
_history.value = _history.value.filter { (i, panel) -> panel != last.second || i != last.first } + (-1 to last.second)
}
} }
class StudentState(val student: Student, edition: Edition) { class StudentState(val student: Student, edition: Edition) {