corp-app/CORP-MAUI/Pages/DepartmentDetailsPage.xaml.cs

233 lines
10 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.ObjectModel;
using System.Diagnostics;
using CORP_MAUI.Models;
namespace CORP_MAUI.Pages;
public partial class DepartmentDetailsPage : ContentPage
{
private readonly ObservableCollection<User> _teamMembers;
private readonly int _departmentId;
private Department? _department;
public DepartmentDetailsPage(int departmentId)
{
try
{
Trace.WriteLine($"=== DEPARTMENT DETAILS PAGE CONSTRUCTOR START (ID: {departmentId}) ===");
InitializeComponent();
_departmentId = departmentId;
_teamMembers = new ObservableCollection<User>();
TeamCollectionView.ItemsSource = _teamMembers;
_ = LoadDepartmentDataAsync();
Trace.WriteLine("=== DEPARTMENT DETAILS PAGE CONSTRUCTOR END ===");
}
catch (Exception ex)
{
Trace.WriteLine("=== DEPARTMENT DETAILS PAGE CONSTRUCTOR ERROR ===");
Trace.WriteLine($"[DepartmentDetailsPage] ❌ Тип ошибки: {ex.GetType().FullName}");
Trace.WriteLine($"[DepartmentDetailsPage] ❌ Сообщение: {ex.Message}");
Trace.WriteLine($"[DepartmentDetailsPage] ❌ StackTrace: {ex.StackTrace}");
Task.Run(async () =>
{
await Task.Delay(100);
if (Application.Current?.Windows.Count > 0)
{
Page? mainPage = Application.Current.Windows[0]?.Page;
if (mainPage != null)
{
await mainPage.DisplayAlert("Ошибка DepartmentDetailsPage",
$"Ошибка инициализации:\n{ex.Message}", "OK");
}
}
});
throw;
}
}
private async void OnBackTapped(object sender, TappedEventArgs e)
{
await Navigation.PopAsync();
}
private async Task LoadDepartmentDataAsync()
{
try
{
Trace.WriteLine($"[DepartmentDetailsPage] >>> LoadDepartmentDataAsync START (ID: {_departmentId})");
LoadingIndicator.IsVisible = true;
LoadingIndicator.IsRunning = true;
Trace.WriteLine($"[DepartmentDetailsPage] >>> Вызов GetDepartmentByIdAsync({_departmentId})");
_department = await ServiceProvider.ApiService.GetDepartmentByIdAsync(_departmentId);
if (_department == null)
{
Trace.WriteLine($"[DepartmentDetailsPage] ❌ Отдел с ID {_departmentId} не найден");
await DisplayAlert("Ошибка", "Не удалось загрузить информацию об отделе", "OK");
await Navigation.PopAsync();
return;
}
Trace.WriteLine($"[DepartmentDetailsPage] ✅ Отдел загружен: {_department.Name}");
DepartmentNameLabel.Text = _department.Name;
DepartmentDescriptionLabel.Text = _department.DisplayDescription;
EmployeesCountLabel.Text = $"Сотрудников: {_department.EmployeesCount}";
if (_department.Head != null)
{
Trace.WriteLine($"[DepartmentDetailsPage] >>> Руководитель: {_department.Head.FullName}");
HeadSection.IsVisible = true;
HeadNameLabel.Text = _department.Head.FullName;
HeadPositionLabel.Text = _department.Head.PositionName ?? "Должность не указана";
// Загружаем аватар руководителя
Trace.WriteLine($"[DepartmentDetailsPage] >>> Загрузка аватара руководителя...");
await ServiceProvider.ApiService.LoadUserAvatarAsync(_department.Head);
Trace.WriteLine($"[DepartmentDetailsPage] >>> IsAvatarLoaded: {_department.Head.IsAvatarLoaded}");
Trace.WriteLine($"[DepartmentDetailsPage] >>> CachedAvatarFilePath: {_department.Head.CachedAvatarFilePath}");
var avatarSource = _department.Head.DisplayAvatarSource;
Trace.WriteLine($"[DepartmentDetailsPage] >>> AvatarSource type: {avatarSource?.GetType().Name ?? "null"}");
HeadAvatarImage.Source = avatarSource;
}
Trace.WriteLine($"[DepartmentDetailsPage] >>> Вызов GetDepartmentEmployeesAsync({_departmentId})");
var employees = await ServiceProvider.ApiService.GetDepartmentEmployeesAsync(_departmentId);
Trace.WriteLine($"[DepartmentDetailsPage] >>> Получено сотрудников: {employees.Count}");
_teamMembers.Clear();
if (_department.Head != null && employees.All(e => e.Id != _department.Head.Id))
{
_teamMembers.Add(_department.Head);
Trace.WriteLine($"[DepartmentDetailsPage] >>> Руководитель добавлен в команду");
}
foreach (var employee in employees.OrderBy(e => e.FullName))
{
if (_department.Head != null && employee.Id == _department.Head.Id)
{
_teamMembers.Insert(0, employee);
}
else
{
_teamMembers.Add(employee);
}
}
Trace.WriteLine($"[DepartmentDetailsPage] ✅ Данные загружены успешно. Команда: {_teamMembers.Count} человек");
// Предзагружаем аватары в фоне
_ = PreloadAvatarsAsync();
}
catch (Exception ex)
{
Trace.WriteLine($"[DepartmentDetailsPage] ❌ Ошибка загрузки: {ex.GetType().Name}");
Trace.WriteLine($"[DepartmentDetailsPage] Message: {ex.Message}");
Trace.WriteLine($"[DepartmentDetailsPage] StackTrace: {ex.StackTrace}");
await DisplayAlert("Ошибка", $"Не удалось загрузить информацию об отделе:\n{ex.Message}", "OK");
}
finally
{
LoadingIndicator.IsVisible = false;
LoadingIndicator.IsRunning = false;
}
}
/// <summary>
/// Обработчик клика по карточке сотрудника (открытие профиля)
/// </summary>
private async void OnTeamMemberCardTapped(object sender, TappedEventArgs e)
{
User? selectedUser = null;
// Попробуем получить параметр из TappedEventArgs
if (e.Parameter is User paramUser)
{
selectedUser = paramUser;
}
// Иначе попробуем получить из BindingContext отправителя
else if (sender is BindableObject bindable && bindable.BindingContext is User contextUser)
{
selectedUser = contextUser;
}
if (selectedUser != null)
{
Trace.WriteLine($"[DepartmentDetailsPage] >>> Открытие профиля: {selectedUser.FullName}");
try
{
await Navigation.PushAsync(new EmployeeProfilePage(selectedUser));
}
catch (Exception ex)
{
Trace.WriteLine($"[DepartmentDetailsPage] ❌ Ошибка перехода к профилю: {ex.Message}");
await DisplayAlert("Ошибка", "Не удалось открыть профиль сотрудника", "OK");
}
}
else
{
Trace.WriteLine("[DepartmentDetailsPage] ⚠️ Не удалось определить выбранного сотрудника");
}
}
/// <summary>
/// Обработчик клика по иконке чата (открытие чата)
/// </summary>
private async void OnChatIconTapped(object sender, TappedEventArgs e)
{
User? selectedUser = null;
// Попробуем получить параметр из TappedEventArgs
if (e.Parameter is User paramUser)
{
selectedUser = paramUser;
}
// Иначе попробуем получить из BindingContext отправителя или родительского элемента
else if (sender is BindableObject bindable)
{
if (bindable.BindingContext is User contextUser)
{
selectedUser = contextUser;
}
else if (bindable is View view && view.Parent is View parent && parent.BindingContext is User parentUser)
{
selectedUser = parentUser;
}
}
if (selectedUser != null)
{
Trace.WriteLine($"[DepartmentDetailsPage] >>> Открытие чата с: {selectedUser.FullName}");
try
{
await Navigation.PushAsync(new ChatPage(selectedUser));
}
catch (Exception ex)
{
Trace.WriteLine($"[DepartmentDetailsPage] ❌ Ошибка перехода к чату: {ex.Message}");
await DisplayAlert("Ошибка", "Не удалось открыть чат", "OK");
}
}
else
{
Trace.WriteLine("[DepartmentDetailsPage] ⚠️ Не удалось определить пользователя для чата");
}
}
private async Task PreloadAvatarsAsync()
{
try
{
Trace.WriteLine("[DepartmentDetailsPage] >>> Начинаем предзагрузку аватаров...");
// Загружаем аватар руководителя
if (_department?.Head != null)
{
await ServiceProvider.ApiService.LoadUserAvatarAsync(_department.Head);
}
// Загружаем аватары команды - UI обновится автоматически через INotifyPropertyChanged
await ServiceProvider.ApiService.PreloadUserAvatarsAsync(_teamMembers);
Trace.WriteLine("[DepartmentDetailsPage] ✅ Аватары предзагружены");
}
catch (Exception ex)
{
Trace.WriteLine($"[DepartmentDetailsPage] ⚠️ Ошибка предзагрузки аватаров: {ex.Message}");
}
}
}