@page "/employee-management" @using MudBlazor @inject ISnackbar Snackbar Mitarbeiterverwaltung | OnProf
Mitarbeiterverwaltung Verwalte Rollen, Mandanten und Arbeitszeiten deiner Mitarbeiter.
AAD Sync Neuer Mitarbeiter
@(string.IsNullOrWhiteSpace(context.Item.Name) ? "?" : context.Item.Name[0].ToString().ToUpper())
@context.Item.Name @context.Item.Email
@context.Item.Tenant
@context.Item.DailyWorkHours h / Tag
@if (context.Item.IsAadSynced) { } else { }
@(_isEditing ? "Mitarbeiter bearbeiten" : "Neuen Mitarbeiter anlegen") @foreach (var tenant in _availableTenants) { @tenant } @foreach (var role in _availableRoles) { @role } Abbrechen Speichern @code { private string _searchString = ""; private bool _isModalOpen = false; private bool _isEditing = false; private Employee _currentEmployee = new(); // Listen für Dropdowns private List _availableTenants = new() { "OnProf GmbH", "SubCorp AG", "Freelancer Network" }; private List _availableRoles = new() { "Teamleiter", "Entwickler", "Projektleiter", "Designer", "Tester", "Administrator" }; public class Employee { public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = string.Empty; public string Email { get; set; } = string.Empty; public string Tenant { get; set; } = string.Empty; public string Role { get; set; } = string.Empty; public double DailyWorkHours { get; set; } = 8.0; public bool IsAadSynced { get; set; } = false; } private List _employees = new() { new Employee { Name = "Marc Mustermann", Email = "marc@onprof.de", Tenant = "OnProf GmbH", Role = "Entwickler", DailyWorkHours = 8.0, IsAadSynced = true }, new Employee { Name = "Anna Schmidt", Email = "anna@onprof.de", Tenant = "OnProf GmbH", Role = "Projektleiter", DailyWorkHours = 8.0, IsAadSynced = true }, new Employee { Name = "John Doe", Email = "john@subcorp.com", Tenant = "SubCorp AG", Role = "Entwickler", DailyWorkHours = 4.0, IsAadSynced = false }, new Employee { Name = "Maria Mayer", Email = "maria@onprof.de", Tenant = "OnProf GmbH", Role = "Tester", DailyWorkHours = 6.0, IsAadSynced = true }, new Employee { Name = "Peter Parker", Email = "peter@freelance.net", Tenant = "Freelancer Network", Role = "Designer", DailyWorkHours = 8.0, IsAadSynced = false }, }; private Func _quickFilter => x => { if (string.IsNullOrWhiteSpace(_searchString)) return true; if (x.Name.Contains(_searchString, StringComparison.OrdinalIgnoreCase)) return true; if (x.Email.Contains(_searchString, StringComparison.OrdinalIgnoreCase)) return true; if (x.Role.Contains(_searchString, StringComparison.OrdinalIgnoreCase)) return true; if (x.Tenant.Contains(_searchString, StringComparison.OrdinalIgnoreCase)) return true; return false; }; private void SyncWithAzureAd() { Snackbar.Add("Synchronisation mit Azure AD wird gestartet (Mock)...", Severity.Info); // Hier käme später die MS Graph API Integration hin } private void OpenAddModal() { _isEditing = false; _currentEmployee = new Employee { Tenant = _availableTenants.First(), Role = _availableRoles.First() }; _isModalOpen = true; } private void EditEmployee(Employee employee) { _isEditing = true; // Deep Copy für die Bearbeitung, um direkte Listen-Updates bei Abbruch zu vermeiden _currentEmployee = new Employee { Id = employee.Id, Name = employee.Name, Email = employee.Email, Tenant = employee.Tenant, Role = employee.Role, DailyWorkHours = employee.DailyWorkHours, IsAadSynced = employee.IsAadSynced }; _isModalOpen = true; } private void SaveEmployee() { if (string.IsNullOrWhiteSpace(_currentEmployee.Name) || string.IsNullOrWhiteSpace(_currentEmployee.Email)) { Snackbar.Add("Name und E-Mail sind Pflichtfelder.", Severity.Error); return; } if (_isEditing) { var index = _employees.FindIndex(e => e.Id == _currentEmployee.Id); if (index != -1) { _employees[index] = _currentEmployee; Snackbar.Add("Änderungen gespeichert.", Severity.Success); } } else { _employees.Add(_currentEmployee); Snackbar.Add("Neuer Mitarbeiter angelegt.", Severity.Success); } CloseModal(); } private void CloseModal() { _isModalOpen = false; } }