feat(commission): add per-package filtering to commission pages

- New PackageSelect component: reusable dropdown for package filtering
- UserPayouts: add package filter + package column with MudChip
- BalancesReport: add package filter + package column with MudChip
- Update NuGet Foursat.CMSMicroservice.Protobuf to v0.0.187
This commit is contained in:
masoodafar-web
2026-02-26 21:08:16 +03:30
parent c96377a674
commit 8be98ae33e
6 changed files with 98 additions and 6 deletions
+1 -1
View File
@@ -138,7 +138,7 @@
<!-- CMS Protobuf NuGet package (used for both local dev and Docker builds) --> <!-- CMS Protobuf NuGet package (used for both local dev and Docker builds) -->
<ItemGroup> <ItemGroup>
<PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="0.0.186" /> <PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="0.0.187" />
</ItemGroup> </ItemGroup>
<!-- ============================================================ --> <!-- ============================================================ -->
@@ -0,0 +1,16 @@
@using CMSMicroservice.Protobuf.Protos.Package
<MudSelect T="long?"
Label="@Label"
Value="@SelectedPackageId"
ValueChanged="OnValueChanged"
Variant="Variant.Outlined"
Margin="Margin.Dense"
Clearable="true"
Style="min-width: 160px;">
<MudSelectItem T="long?" Value="@((long?)null)">همه پکیج‌ها</MudSelectItem>
@foreach (var pkg in _packages)
{
<MudSelectItem T="long?" Value="@((long?)pkg.Id)">@pkg.Title</MudSelectItem>
}
</MudSelect>
@@ -0,0 +1,46 @@
using CMSMicroservice.Protobuf.Protos.Package;
using Microsoft.AspNetCore.Components;
namespace BackOffice.Pages.AutoComplete;
public partial class PackageSelect
{
[Inject] public PackageContract.PackageContractClient PackageClient { get; set; }
[Parameter] public string Label { get; set; } = "پکیج";
[Parameter] public long? SelectedPackageId { get; set; }
[Parameter] public EventCallback<long?> SelectedPackageIdChanged { get; set; }
private List<GetAllPackageByFilterResponseModel> _packages = new();
protected override async Task OnInitializedAsync()
{
await LoadPackages();
}
private async Task LoadPackages()
{
try
{
var request = new GetAllPackageByFilterRequest
{
PaginationState = new() { PageNumber = 1, PageSize = 100 },
Filter = new()
};
var result = await PackageClient.GetAllPackageByFilterAsync(request);
_packages = result.Models?.OrderBy(p => p.SortOrder).ToList()
?? new List<GetAllPackageByFilterResponseModel>();
}
catch
{
_packages = new List<GetAllPackageByFilterResponseModel>();
}
}
private async Task OnValueChanged(long? value)
{
SelectedPackageId = value;
await SelectedPackageIdChanged.InvokeAsync(value);
}
}
@@ -36,6 +36,8 @@
<MudSelectItem T="int?" Value="@((int?)4)">شکست خورده</MudSelectItem> <MudSelectItem T="int?" Value="@((int?)4)">شکست خورده</MudSelectItem>
<MudSelectItem T="int?" Value="@((int?)5)">لغو شده</MudSelectItem> <MudSelectItem T="int?" Value="@((int?)5)">لغو شده</MudSelectItem>
</MudSelect> </MudSelect>
<PackageSelect Label="پکیج"
@bind-SelectedPackageId="_filterPackageId" />
<MudButton Variant="Variant.Filled" <MudButton Variant="Variant.Filled"
Color="Color.Primary" Color="Color.Primary"
OnClick="ApplyFilter" OnClick="ApplyFilter"
@@ -64,6 +66,14 @@
</CellTemplate> </CellTemplate>
</PropertyColumn> </PropertyColumn>
<PropertyColumn Property="x => x.PackageTitle" Title="پکیج">
<CellTemplate>
<MudChip T="string" Color="Color.Tertiary" Size="Size.Small">
@(string.IsNullOrEmpty(context.Item.PackageTitle) ? "-" : context.Item.PackageTitle)
</MudChip>
</CellTemplate>
</PropertyColumn>
<PropertyColumn Property="x => x.BalancesEarned" Title="بالانس‌ها"> <PropertyColumn Property="x => x.BalancesEarned" Title="بالانس‌ها">
<CellTemplate> <CellTemplate>
<MudChip T="string" Color="Color.Info" Size="Size.Small"> <MudChip T="string" Color="Color.Info" Size="Size.Small">
@@ -17,6 +17,7 @@ public partial class UserPayouts
private long? _filterUserId; private long? _filterUserId;
private long? _filterWeekDefinitionId; private long? _filterWeekDefinitionId;
private int? _filterStatus; private int? _filterStatus;
private long? _filterPackageId;
private async Task<GridData<UserCommissionPayoutModel>> ServerReload(GridState<UserCommissionPayoutModel> state) private async Task<GridData<UserCommissionPayoutModel>> ServerReload(GridState<UserCommissionPayoutModel> state)
{ {
@@ -44,6 +45,11 @@ public partial class UserPayouts
request.Status = _filterStatus.Value; request.Status = _filterStatus.Value;
} }
if (_filterPackageId.HasValue && _filterPackageId.Value > 0)
{
request.PackageId = _filterPackageId.Value;
}
var result = await CommissionContract.GetUserCommissionPayoutsAsync(request); var result = await CommissionContract.GetUserCommissionPayoutsAsync(request);
if (result?.Models != null && result.Models.Any()) if (result?.Models != null && result.Models.Any())
@@ -33,10 +33,8 @@
Min="0" /> Min="0" />
</MudItem> </MudItem>
<MudItem xs="12" md="2"> <MudItem xs="12" md="2">
<MudNumericField @bind-Value="_maxBalance" <PackageSelect Label="پکیج"
Label="حداکثر موجودی" @bind-SelectedPackageId="_filterPackageId" />
Variant="Variant.Outlined"
Min="0" />
</MudItem> </MudItem>
<MudItem xs="12" md="2" Class="d-flex align-center"> <MudItem xs="12" md="2" Class="d-flex align-center">
<MudButton Variant="Variant.Filled" <MudButton Variant="Variant.Filled"
@@ -72,6 +70,14 @@
<PropertyColumn Property="x => x.UserFullName" Title="نام کاربر" /> <PropertyColumn Property="x => x.UserFullName" Title="نام کاربر" />
<PropertyColumn Property="x => x.WeekDisplayName" Title="هفته" /> <PropertyColumn Property="x => x.WeekDisplayName" Title="هفته" />
<PropertyColumn Property="x => x.PackageTitle" Title="پکیج">
<CellTemplate>
<MudChip T="string" Color="Color.Tertiary" Size="Size.Small">
@(string.IsNullOrEmpty(context.Item.PackageTitle) ? "-" : context.Item.PackageTitle)
</MudChip>
</CellTemplate>
</PropertyColumn>
<TemplateColumn Title="چپ (جدید + قبلی = مجموع)"> <TemplateColumn Title="چپ (جدید + قبلی = مجموع)">
<CellTemplate> <CellTemplate>
<MudStack Row="true" Spacing="1" AlignItems="AlignItems.Center"> <MudStack Row="true" Spacing="1" AlignItems="AlignItems.Center">
@@ -193,6 +199,7 @@
private MudDataGrid <UserWeeklyBalanceModel> _grid { get; set; } private MudDataGrid <UserWeeklyBalanceModel> _grid { get; set; }
private long? _filterUserId = null; private long? _filterUserId = null;
private long? _filterWeekDefinitionId = null; private long? _filterWeekDefinitionId = null;
private long? _filterPackageId = null;
private int? _minBalance = null; private int? _minBalance = null;
private int? _maxBalance = null; private int? _maxBalance = null;
private bool _onlyActive = false; private bool _onlyActive = false;
@@ -222,6 +229,11 @@ private MudDataGrid <UserWeeklyBalanceModel> _grid { get; set; }
request.WeekDefinitionId = _filterWeekDefinitionId.Value; request.WeekDefinitionId = _filterWeekDefinitionId.Value;
} }
if (_filterPackageId.HasValue && _filterPackageId.Value > 0)
{
request.PackageId = _filterPackageId.Value;
}
var response = await CommissionClient.GetUserWeeklyBalancesAsync(request); var response = await CommissionClient.GetUserWeeklyBalancesAsync(request);
var items = response.Models.Select(b => new UserWeeklyBalanceModel var items = response.Models.Select(b => new UserWeeklyBalanceModel
@@ -238,7 +250,8 @@ private MudDataGrid <UserWeeklyBalanceModel> _grid { get; set; }
MatchedBalance = b.TotalBalances, MatchedBalance = b.TotalBalances,
PoolContribution = b.WeeklyPoolContribution, PoolContribution = b.WeeklyPoolContribution,
CalculatedAt = b.CalculatedAt?.ToDateTime(), CalculatedAt = b.CalculatedAt?.ToDateTime(),
IsExpired = b.IsExpired IsExpired = b.IsExpired,
PackageTitle = b.PackageTitle
}).ToList(); }).ToList();
// Apply balance range filter if specified // Apply balance range filter if specified
@@ -308,5 +321,6 @@ private MudDataGrid <UserWeeklyBalanceModel> _grid { get; set; }
public long PoolContribution { get; set; } public long PoolContribution { get; set; }
public DateTime? CalculatedAt { get; set; } public DateTime? CalculatedAt { get; set; }
public bool IsExpired { get; set; } public bool IsExpired { get; set; }
public string PackageTitle { get; set; } = string.Empty;
} }
} }