using Duesk.Api; using Duesk.Api.Models; namespace Duesk.Forms; public partial class MainForm : Form { private DataGridView dgvProfiles; private ToolStrip toolStrip; private ToolStripButton btnNew; private ToolStripButton btnRefresh; private ToolStripButton btnGroups; private ToolStripButton btnLogout; private StatusStrip statusStrip; private ToolStripStatusLabel statusLabel; private List _profiles = new List(); public MainForm() { InitializeComponent(); LoadProfiles(); } private void InitializeComponent() { this.Text = "DÜSK - Düsseldorfer Schülerinventar"; this.Size = new Size(900, 600); this.StartPosition = FormStartPosition.CenterScreen; // Toolbar toolStrip = new ToolStrip(); btnNew = new ToolStripButton("Neues Profil", null, (s, e) => NewProfile()); btnRefresh = new ToolStripButton("Aktualisieren", null, (s, e) => LoadProfiles()); btnGroups = new ToolStripButton("Gruppen", null, (s, e) => ManageGroups()); btnLogout = new ToolStripButton("Abmelden", null, (s, e) => Logout()); toolStrip.Items.Add(btnNew); toolStrip.Items.Add(btnRefresh); toolStrip.Items.Add(btnGroups); toolStrip.Items.Add(new ToolStripSeparator()); toolStrip.Items.Add(btnLogout); // DataGridView dgvProfiles = new DataGridView { Dock = DockStyle.Fill, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, SelectionMode = DataGridViewSelectionMode.FullRowSelect, MultiSelect = false, ReadOnly = true, AllowUserToAddRows = false }; dgvProfiles.Columns.Add("Name", "Name"); dgvProfiles.Columns.Add("Group", "Gruppe"); dgvProfiles.Columns.Add("Id", "ProfilID"); dgvProfiles.CellDoubleClick += (s, e) => ViewProfile(); // Context Menu var contextMenu = new ContextMenuStrip(); contextMenu.Items.Add("Anzeigen", null, (s, e) => ViewProfile()); contextMenu.Items.Add("Bearbeiten", null, (s, e) => EditProfile()); contextMenu.Items.Add("Löschen", null, (s, e) => DeleteProfile()); contextMenu.Items.Add("-"); contextMenu.Items.Add("Zeitreihe", null, (s, e) => ShowTimeSeries()); dgvProfiles.ContextMenuStrip = contextMenu; // Statusbar statusStrip = new StatusStrip(); statusLabel = new ToolStripStatusLabel("Bereit"); statusStrip.Items.Add(statusLabel); this.Controls.Add(dgvProfiles); this.Controls.Add(toolStrip); this.Controls.Add(statusStrip); this.FormClosed += (s, e) => Application.Exit(); } private async void LoadProfiles() { statusLabel.Text = "Lade Profile..."; Cursor = Cursors.WaitCursor; try { _profiles = await ApiClient.GetProfilesAsync() ?? new List(); dgvProfiles.Rows.Clear(); foreach (var profile in _profiles) { dgvProfiles.Rows.Add(profile.Name, profile.GroupName, profile.ProfileId); } statusLabel.Text = $"{_profiles.Count} Profile geladen"; } catch (Exception ex) { statusLabel.Text = "Fehler beim Laden"; MessageBox.Show($"Fehler: {ex.Message}", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { Cursor = Cursors.Default; } } private Profile? GetSelectedProfile() { if (dgvProfiles.SelectedRows.Count == 0) return null; int index = dgvProfiles.SelectedRows[0].Index; return index < _profiles.Count ? _profiles[index] : null; } private void NewProfile() { var dialog = new ProfileEditForm(null); if (dialog.ShowDialog() == DialogResult.OK) { LoadProfiles(); } } private void EditProfile() { var profile = GetSelectedProfile(); if (profile == null) { MessageBox.Show("Bitte wählen Sie ein Profil aus.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } var dialog = new ProfileEditForm(profile); if (dialog.ShowDialog() == DialogResult.OK) { LoadProfiles(); } } private void ViewProfile() { var profile = GetSelectedProfile(); if (profile == null) { MessageBox.Show("Bitte wählen Sie ein Profil aus.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } var dialog = new ProfileDetailForm(profile); dialog.ShowDialog(); } private async void DeleteProfile() { var profile = GetSelectedProfile(); if (profile == null) { MessageBox.Show("Bitte wählen Sie ein Profil aus.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } var result = MessageBox.Show($"Möchten Sie das Profil '{profile.Name}' wirklich löschen?", "Profil löschen", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { statusLabel.Text = "Lösche Profil..."; Cursor = Cursors.WaitCursor; var success = await ApiClient.DeleteProfileAsync(profile.ProfileId!); Cursor = Cursors.Default; if (success) { LoadProfiles(); } else { MessageBox.Show("Fehler beim Löschen des Profils.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private async void ShowTimeSeries() { var profile = GetSelectedProfile(); if (profile == null) { MessageBox.Show("Bitte wählen Sie ein Profil aus.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (string.IsNullOrEmpty(profile.GroupId)) { MessageBox.Show("Dieses Profil gehört keiner Gruppe an.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } // Alle Profile der gleichen Gruppe laden var allProfiles = await ApiClient.GetProfilesAsync(); var groupProfiles = allProfiles?.Where(p => p.GroupId == profile.GroupId).ToList(); if (groupProfiles == null || groupProfiles.Count == 0) { MessageBox.Show("Keine weiteren Profile in dieser Gruppe.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } var dialog = new TimeSeriesForm(groupProfiles, profile.GroupName ?? "Gruppe"); dialog.ShowDialog(); } private void ManageGroups() { var dialog = new GroupManagerForm(); dialog.ShowDialog(); LoadProfiles(); // Gruppen haben sich möglicherweise geändert } private void Logout() { SessionManager.Instance.Clear(); this.Close(); new LoginForm().Show(); } }