Files
FrontOffice/src/FrontOffice.Main/Pages/Commission/WeeklyBalancePage.razor.cs
T
masoodafar-web 8588db949a
Build and Deploy / build (push) Successful in 1m22s
fix: ensure state update before loading weekly balance in WeeklyBalancePage
2025-12-28 23:59:07 +03:30

146 lines
4.7 KiB
C#

using FrontOffice.Main.Utilities;
using FrontOffice.Main.Shared;
using Microsoft.AspNetCore.Components;
using MudBlazor;
namespace FrontOffice.Main.Pages.Commission;
public partial class WeeklyBalancePage : ComponentBase
{
[Inject] private CommissionService CommissionService { get; set; } = default!;
[Inject] private ISnackbar SnackbarService { get; set; } = default!;
[Parameter]
[SupplyParameterFromQuery(Name = "week")]
public string? QueryWeekNumber { get; set; }
private WeekSelector? _weekSelector;
private WeekDefinitionDto? _selectedWeekDefinition;
private WeeklyBalanceDto? _weeklyBalance;
private bool _isLoading = true;
private bool _hasError = false;
private readonly ChartOptions _chartOptions = new()
{
ChartPalette = new[]
{
"#2196F3", // Info (Left)
"#4CAF50", // Success (Right)
"#FF9800" // Warning (Min)
}
};
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
// Wait for WeekSelector to initialize and load its cached weeks
if (_weekSelector != null)
{
await _weekSelector.EnsureLoadedAsync();
// Handle query parameter ?week=7 (WeekDefinitionId)
if (!string.IsNullOrEmpty(QueryWeekNumber))
{
// Try to parse as WeekDefinitionId first (most common from dashboard links)
if (long.TryParse(QueryWeekNumber, out long id))
{
_selectedWeekDefinition = _weekSelector.FindById(id);
// Fallback: try as WeekOrder if not found by Id
if (_selectedWeekDefinition == null && int.TryParse(QueryWeekNumber, out int weekOrder))
{
_selectedWeekDefinition = _weekSelector.FindByWeekOrder(weekOrder);
}
// If still not found in cache, create a temporary definition with just the Id
// so we can still query the balance from BFF
if (_selectedWeekDefinition == null)
{
_selectedWeekDefinition = new WeekDefinitionDto { Id = id, DisplayName = $"هفته {id}" };
}
}
}
// If no week selected and no query param, select current week
if (_selectedWeekDefinition == null)
{
_selectedWeekDefinition = _weekSelector.GetCurrentWeek();
}
await LoadWeeklyBalanceAsync();
StateHasChanged();
}
}
}
protected override void OnInitialized()
{
_isLoading = true;
}
private async Task LoadWeeklyBalanceAsync()
{
try
{
_isLoading = true;
_hasError = false;
long? weekDefinitionId = _selectedWeekDefinition?.Id;
_weeklyBalance = await CommissionService.GetMyWeeklyBalanceAsync(weekDefinitionId);
// Update week display name from selected definition if available
if (_selectedWeekDefinition != null && _weeklyBalance != null)
{
_weeklyBalance.WeekDisplayName = _selectedWeekDefinition.DisplayName;
return;
}
_weeklyBalance = new WeeklyBalanceDto()
{
};
}
catch (Exception ex)
{
_hasError = true;
SnackbarService.Add($"خطا در دریافت تعادل: {ex.Message}", Severity.Error);
}
finally
{
_isLoading = false;
}
}
private async Task LoadCurrentWeekAsync()
{
if (_weekSelector != null)
{
await _weekSelector.SelectCurrentWeekAsync();
}
_selectedWeekDefinition = _weekSelector?.GetCurrentWeek();
await LoadWeeklyBalanceAsync();
}
private double GetLeftPercentage()
{
if (_weeklyBalance is null)
return 0;
var total = _weeklyBalance.LeftBalance + _weeklyBalance.RightBalance;
if (total == 0)
return 0;
return (_weeklyBalance.LeftBalance / (double)total) * 100;
}
private double GetRightPercentage()
{
if (_weeklyBalance is null)
return 0;
var total = _weeklyBalance.LeftBalance + _weeklyBalance.RightBalance;
if (total == 0)
return 0;
return (_weeklyBalance.RightBalance / (double)total) * 100;
}
}