Inhalt

Aktueller Ordner: duesseldorfer-schuelerinventar-swift-client/Duesk/Views
⬅ Übergeordnet

GroupManagerView.swift

import SwiftUI

struct GroupManagerView: View {
    @Environment(\.dismiss) private var dismiss
    @StateObject private var viewModel = GroupManagerViewModel()
    @State private var newGroupName = ""
    @State private var editingGroup: Group?
    @State private var editGroupName = ""
    let onChanged: (() -> Void)?
    
    init(onChanged: (() -> Void)? = nil) {
        self.onChanged = onChanged
    }
    
    var body: some View {
        NavigationView {
            List {
                ForEach(viewModel.groups) { group in
                    HStack {
                        Text(group.name)
                        Spacer()
                        Text("ID: \(group.gruppeID)")
                            .font(.caption)
                            .foregroundColor(.secondary)
                    }
                    .contextMenu {
                        Button("Umbenennen") {
                            editingGroup = group
                            editGroupName = group.name
                        }
                        Button("Löschen", role: .destructive) {
                            Task {
                                if let index = viewModel.groups.firstIndex(where: { $0.id == group.id }) {
                                    await viewModel.deleteGroup(at: IndexSet(integer: index))
                                    onChanged?()
                                }
                            }
                        }
                    }
                }
                .onDelete { indexSet in
                    Task {
                        await viewModel.deleteGroup(at: indexSet)
                        onChanged?()
                    }
                }
            }
            .navigationTitle("Gruppenverwaltung")
            .toolbar {
                ToolbarItem(placement: .cancellationAction) {
                    Button("Schließen") { dismiss() }
                }
                ToolbarItem(placement: .primaryAction) {
                    HStack {
                        TextField("Neue Gruppe", text: $newGroupName)
                            .textFieldStyle(.roundedBorder)
                            .frame(width: 150)
                        Button("Hinzufügen") {
                            Task {
                                if await viewModel.addGroup(name: newGroupName) {
                                    newGroupName = ""
                                    onChanged?()
                                }
                            }
                        }
                        .disabled(newGroupName.isEmpty)
                    }
                }
            }
            .overlay {
                if viewModel.isLoading {
                    ProgressView()
                }
            }
            .alert("Fehler", isPresented: .constant(viewModel.errorMessage != nil)) {
                Button("OK") { viewModel.errorMessage = nil }
            } message: {
                Text(viewModel.errorMessage ?? "")
            }
            .sheet(item: $editingGroup) { group in
                NavigationView {
                    Form {
                        TextField("Gruppenname", text: $editGroupName)
                    }
                    .navigationTitle("Gruppe umbenennen")
                    .toolbar {
                        ToolbarItem(placement: .cancellationAction) {
                            Button("Abbrechen") { editingGroup = nil }
                        }
                        ToolbarItem(placement: .confirmationAction) {
                            Button("Speichern") {
                                Task {
                                    if await viewModel.renameGroup(group: group, newName: editGroupName) {
                                        editingGroup = nil
                                        onChanged?()
                                    }
                                }
                            }
                            .disabled(editGroupName.isEmpty)
                        }
                    }
                }
                .frame(width: 400, height: 200)
            }
        }
        .task {
            await viewModel.loadGroups()
        }
    }
}