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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user