233 lines
10 KiB
C#
233 lines
10 KiB
C#
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}");
|
||
}
|
||
}
|
||
}
|