Inhalt
Aktueller Ordner:
duesseldorfer-schuelerinventar-visualstudio-client/duesk-wpf/ViewsProfileEditWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using DueskWPF.Models;
using DueskWPF.Services;
namespace DueskWPF.Views;
public partial class ProfileEditWindow : Window
{
private readonly Profile? _editProfile;
private readonly ApiService _apiService = new();
private List<Group> _groups = new();
private List<int> _seItems = new List<int>(Enumerable.Repeat(2, 36));
private List<int> _feItems = new List<int>(Enumerable.Repeat(2, 36));
private List<ItemRating> _seRatings = new();
private List<ItemRating> _feRatings = new();
public ProfileEditWindow(Profile? profile = null)
{
InitializeComponent();
_editProfile = profile;
if (profile != null)
{
NameBox.Text = profile.Name;
_seItems = profile.GetAllSEItems();
_feItems = profile.GetAllFEItems();
}
Loaded += async (s, e) => await LoadGroupsAsync();
InitializeItemsControls();
}
private async Task LoadGroupsAsync()
{
_groups = await _apiService.GetGroupsAsync();
GroupCombo.ItemsSource = new List<object> { "Keine Gruppe" }
.Concat(_groups.Select(g => g.Name))
.Concat(new[] { "+ Neue Gruppe..." })
.ToList();
GroupCombo.SelectedIndex = 0;
if (_editProfile?.Gruppename != null)
{
var index = GroupCombo.Items.Cast<string>().ToList()
.FindIndex(x => x == _editProfile.Gruppename);
if (index >= 0) GroupCombo.SelectedIndex = index;
}
}
private void InitializeItemsControls()
{
for (int i = 0; i < 36; i++)
{
_seRatings.Add(new ItemRating { Index = i, Name = Norms.Items[i], Value = _seItems[i] });
_feRatings.Add(new ItemRating { Index = i, Name = Norms.Items[i], Value = _feItems[i] });
}
SEItemsControl.ItemsSource = _seRatings;
FEItemsControl.ItemsSource = _feRatings;
}
private void GroupCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var selected = GroupCombo.SelectedItem as string;
NewGroupPanel.Visibility = selected == "+ Neue Gruppe..." ? Visibility.Visible : Visibility.Collapsed;
}
private void Rating_Checked(object sender, RoutedEventArgs e)
{
var radio = sender as RadioButton;
var tag = radio?.Tag?.ToString();
var value = int.TryParse(tag, out var v) ? v : 2;
var parent = FindParent<Border>(radio);
if (parent?.DataContext is ItemRating rating)
{
rating.Value = value;
// Find which items control this belongs to
if (FindParent<ItemsControl>(radio) == SEItemsControl)
_seItems[rating.Index] = value;
else
_feItems[rating.Index] = value;
}
}
private T? FindParent<T>(DependencyObject child) where T : DependencyObject
{
var parent = System.Windows.Media.VisualTreeHelper.GetParent(child);
while (parent != null && !(parent is T))
parent = System.Windows.Media.VisualTreeHelper.GetParent(parent);
return parent as T;
}
private async void SaveButton_Click(object sender, RoutedEventArgs e)
{
var name = NameBox.Text.Trim();
if (string.IsNullOrEmpty(name))
{
MessageBox.Show("Bitte geben Sie einen Namen ein", "Fehler",
MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
SaveButton.IsEnabled = false;
int? groupId = null;
var selectedGroup = GroupCombo.SelectedItem as string;
if (selectedGroup == "+ Neue Gruppe..." && !string.IsNullOrEmpty(NewGroupBox.Text))
{
var success = await _apiService.CreateGroupAsync(NewGroupBox.Text.Trim());
if (success)
{
_groups = await _apiService.GetGroupsAsync();
var newGroup = _groups.FirstOrDefault(g => g.Name == NewGroupBox.Text.Trim());
if (newGroup != null) groupId = newGroup.GruppeID;
}
}
else if (selectedGroup != null && selectedGroup != "Keine Gruppe" && selectedGroup != "+ Neue Gruppe...")
{
var group = _groups.FirstOrDefault(g => g.Name == selectedGroup);
if (group != null) groupId = group.GruppeID;
}
var profileData = new ProfileCreate
{
Name = name,
GruppeID = groupId,
Gruppename = selectedGroup?.StartsWith("+") == true ? NewGroupBox.Text : selectedGroup
};
// Set all 72 items
for (int i = 0; i < 36; i++)
{
typeof(ProfileCreate).GetProperty($"Item{i + 1}")?.SetValue(profileData, _seItems[i]);
typeof(ProfileCreate).GetProperty($"Feitem{i + 1}")?.SetValue(profileData, _feItems[i]);
}
bool success;
if (_editProfile != null)
success = await _apiService.UpdateProfileAsync(_editProfile);
else
success = await _apiService.CreateProfileAsync(profileData);
if (success)
{
DialogResult = true;
Close();
}
else
{
MessageBox.Show("Fehler beim Speichern des Profils", "Fehler",
MessageBoxButton.OK, MessageBoxImage.Error);
SaveButton.IsEnabled = true;
}
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
Close();
}
private class ItemRating
{
public int Index { get; set; }
public string Name { get; set; } = string.Empty;
public int Value { get; set; }
}
}