From 869cf7e516c944b461364fc8b0a9621f41999366 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Sat, 20 Dec 2025 03:17:04 +0330 Subject: [PATCH] feat: Update week number handling to use WeekDefinitionId and improve UI components --- src/BackOffice/BackOffice.csproj | 372 ++++++++---------- .../Pages/AutoComplete/WeekNumberPicker.razor | 2 +- .../AutoComplete/WeekNumberPicker.razor.cs | 48 ++- .../Components/PayoutDetailsDialog.razor | 2 +- .../Pages/Commission/Dashboard.razor | 21 +- .../Pages/Commission/Dashboard.razor.cs | 62 +-- .../Pages/Commission/UserPayouts.razor | 13 +- .../Pages/Commission/UserPayouts.razor.cs | 6 +- .../Pages/Commission/WeeklyReports.razor | 12 +- .../Pages/Dashboard/SystemOverview.razor | 42 +- .../Pages/Network/BalancesReport.razor | 14 +- .../Pages/Network/NetworkTreeViewer.razor | 14 +- .../Products/Components/CreateDialog.razor | 9 +- .../Products/Components/UpdateDialog.razor | 9 +- .../Pages/Products/ProductsMainPage.razor | 17 + .../Pages/Products/ProductsMainPage.razor.cs | 54 +-- .../SystemManagement/WorkerControl.razor | 28 +- 17 files changed, 372 insertions(+), 353 deletions(-) diff --git a/src/BackOffice/BackOffice.csproj b/src/BackOffice/BackOffice.csproj index b9d23cf..026414b 100644 --- a/src/BackOffice/BackOffice.csproj +++ b/src/BackOffice/BackOffice.csproj @@ -1,212 +1,184 @@  - - net9.0 - enable - enable - service-worker-assets.js - false - false - false - Linux - + + net9.0 + enable + enable + service-worker-assets.js + false + false + false + Linux + - - - - - .dockerignore - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + .dockerignore + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/src/BackOffice/Pages/AutoComplete/WeekNumberPicker.razor b/src/BackOffice/Pages/AutoComplete/WeekNumberPicker.razor index 72ab58e..3efac66 100644 --- a/src/BackOffice/Pages/AutoComplete/WeekNumberPicker.razor +++ b/src/BackOffice/Pages/AutoComplete/WeekNumberPicker.razor @@ -5,7 +5,7 @@ Value="@_selectedWeek" DebounceInterval="300" ValueChanged="@OnSelected" - ToStringFunc="@(e => e?.WeekNumber ?? string.Empty)" + ToStringFunc="@(e => e?.DisplayName ?? string.Empty)" SearchFunc="@Search" Variant="Variant.Outlined" Clearable="true" diff --git a/src/BackOffice/Pages/AutoComplete/WeekNumberPicker.razor.cs b/src/BackOffice/Pages/AutoComplete/WeekNumberPicker.razor.cs index e379674..5e4b3c9 100644 --- a/src/BackOffice/Pages/AutoComplete/WeekNumberPicker.razor.cs +++ b/src/BackOffice/Pages/AutoComplete/WeekNumberPicker.razor.cs @@ -11,8 +11,15 @@ public partial class WeekNumberPicker [Inject] public IPersianDateTimeService PersianDateTime { get; set; } = default!; [Parameter] public string Label { get; set; } = "انتخاب هفته"; - [Parameter] public string? SelectedWeekNumber { get; set; } - [Parameter] public EventCallback SelectedWeekNumberChanged { get; set; } + + // WeekDefinitionId based binding (preferred) + [Parameter] public long? SelectedWeekDefinitionId { get; set; } + [Parameter] public EventCallback SelectedWeekDefinitionIdChanged { get; set; } + + // Legacy string-based binding (deprecated, kept for compatibility) + // [Parameter] public long? SelectedWeekNumber { get; set; } + // [Parameter] public EventCallback SelectedWeekNumberChanged { get; set; } + [Parameter] public bool CoerceText { get; set; } = true; // اجازه ورود دستی [Parameter] public int FutureWeeksCount { get; set; } = 4; [Parameter] public int PastWeeksCount { get; set; } = 12; @@ -25,20 +32,30 @@ public partial class WeekNumberPicker { await LoadWeeks(); - if (!string.IsNullOrWhiteSpace(SelectedWeekNumber) && _allWeeks.Any()) + if (SelectedWeekDefinitionId.HasValue && SelectedWeekDefinitionId.Value > 0 && _allWeeks.Any()) { - _selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekNumber == SelectedWeekNumber); + _selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == SelectedWeekDefinitionId.Value); } + // else if (SelectedWeekNumber!=null && SelectedWeekNumber>0 && _allWeeks.Any()) + // { + // _selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == SelectedWeekNumber); + // } } protected override async Task OnParametersSetAsync() { - if (!string.IsNullOrWhiteSpace(SelectedWeekNumber) && - _selectedWeek?.WeekNumber != SelectedWeekNumber && + if (SelectedWeekDefinitionId.HasValue && SelectedWeekDefinitionId.Value > 0 && + _selectedWeek?.WeekDefinitionId != SelectedWeekDefinitionId.Value && _isLoaded) { - _selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekNumber == SelectedWeekNumber); + _selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == SelectedWeekDefinitionId.Value); } + // else if (SelectedWeekNumber!=null && SelectedWeekNumber>0 && + // _selectedWeek?.WeekDefinitionId != SelectedWeekNumber && + // _isLoaded) + // { + // _selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == SelectedWeekNumber); + // } } private async Task LoadWeeks() @@ -85,23 +102,28 @@ public partial class WeekNumberPicker if (string.IsNullOrWhiteSpace(value)) return _allWeeks; - // جستجو در شماره هفته + // جستجو در DisplayName یا DisplayText return _allWeeks - .Where(w => w.WeekNumber.Contains(value, StringComparison.OrdinalIgnoreCase)) + .Where(w => w.DisplayName.Contains(value, StringComparison.OrdinalIgnoreCase) || + w.DisplayText.Contains(value, StringComparison.OrdinalIgnoreCase)) .ToList(); } private async Task OnSelected(WeekInfo? selected) { _selectedWeek = selected; - SelectedWeekNumber = selected?.WeekNumber; - await SelectedWeekNumberChanged.InvokeAsync(SelectedWeekNumber); + SelectedWeekDefinitionId = selected?.WeekDefinitionId; + // SelectedWeekNumber = selected.WeekDefinitionId; + await SelectedWeekDefinitionIdChanged.InvokeAsync(SelectedWeekDefinitionId); + // await SelectedWeekNumberChanged.InvokeAsync(SelectedWeekNumber); } private async Task OnClear() { _selectedWeek = null; - SelectedWeekNumber = null; - await SelectedWeekNumberChanged.InvokeAsync(null); + SelectedWeekDefinitionId = null; + // SelectedWeekNumber = null; + await SelectedWeekDefinitionIdChanged.InvokeAsync(null); + // await SelectedWeekNumberChanged.InvokeAsync(null); } } diff --git a/src/BackOffice/Pages/Commission/Components/PayoutDetailsDialog.razor b/src/BackOffice/Pages/Commission/Components/PayoutDetailsDialog.razor index 50ba8f2..061c9bb 100644 --- a/src/BackOffice/Pages/Commission/Components/PayoutDetailsDialog.razor +++ b/src/BackOffice/Pages/Commission/Components/PayoutDetailsDialog.razor @@ -33,7 +33,7 @@ شماره هفته: - @Payout.WeekNumber + @Payout.WeekDisplayName تعداد بالانس: diff --git a/src/BackOffice/Pages/Commission/Dashboard.razor b/src/BackOffice/Pages/Commission/Dashboard.razor index 7a11ef4..6df9550 100644 --- a/src/BackOffice/Pages/Commission/Dashboard.razor +++ b/src/BackOffice/Pages/Commission/Dashboard.razor @@ -21,7 +21,7 @@ استخر هفتگی @(_poolData?.TotalPoolAmount.ToString("N0") ?? "0") ریال - هفته @(_currentWeekNumberPersian) + @_currentWeekDisplayText @@ -79,8 +79,8 @@ @if (_allWeeks.Any()) { - + @_availableWeeks.CurrentWeek.DisplayText @@ -104,7 +104,7 @@ هفته‌های محاسبه شده @foreach (var week in _availableWeeks.CalculatedWeeks) { - + @week.DisplayText @@ -125,7 +125,7 @@ هفته‌های محاسبه نشده @foreach (var week in _availableWeeks.PendingWeeks) { - + @week.DisplayText @@ -140,7 +140,7 @@ هفته‌های آینده @foreach (var week in _availableWeeks.FutureWeeks) { - + @week.DisplayText @@ -152,10 +152,7 @@ } else { - + لیست هفته‌ها بارگذاری نشده } شماره هفته: - @_poolData.WeekNumber + @_currentWeekDisplayName مجموع استخر: diff --git a/src/BackOffice/Pages/Commission/Dashboard.razor.cs b/src/BackOffice/Pages/Commission/Dashboard.razor.cs index b9a32f5..6cc47f4 100644 --- a/src/BackOffice/Pages/Commission/Dashboard.razor.cs +++ b/src/BackOffice/Pages/Commission/Dashboard.razor.cs @@ -14,12 +14,13 @@ public partial class Dashboard [Inject] public NavigationManager NavigationManager { get; set; } - [SupplyParameterFromQuery(Name = "week")] - public string? WeekQueryParam { get; set; } + [SupplyParameterFromQuery(Name = "weekId")] + public long? WeekIdQueryParam { get; set; } private bool _isLoading = true; - private string _currentWeekNumber = string.Empty; - private string _currentWeekNumberPersian = string.Empty; // هفته به شمسی + private long _currentWeekDefinitionId; + private string _currentWeekDisplayName = string.Empty; + private string _currentWeekDisplayText = string.Empty; // نمایش فارسی private GetWeeklyCommissionPoolResponse? _poolData; // Available weeks data @@ -32,19 +33,22 @@ public partial class Dashboard await LoadAvailableWeeks(); // اگر query string آمده، از آن استفاده کن - if (!string.IsNullOrWhiteSpace(WeekQueryParam)) + if (WeekIdQueryParam.HasValue && WeekIdQueryParam.Value > 0) { - _currentWeekNumber = WeekQueryParam; + _currentWeekDefinitionId = WeekIdQueryParam.Value; + // پیدا کردن نام نمایشی از لیست هفته‌ها + var weekInfo = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == _currentWeekDefinitionId); + _currentWeekDisplayName = weekInfo?.DisplayName ?? ""; + _currentWeekDisplayText = weekInfo?.DisplayText ?? ""; } - else + else if (_availableWeeks?.CurrentWeek != null) { - // محاسبه شماره هفته جاری (میلادی برای API) - _currentWeekNumber = GetCurrentWeekNumber(); + // استفاده از هفته جاری + _currentWeekDefinitionId = _availableWeeks.CurrentWeek.WeekDefinitionId; + _currentWeekDisplayName = _availableWeeks.CurrentWeek.DisplayName; + _currentWeekDisplayText = _availableWeeks.CurrentWeek.DisplayText; } - // تبدیل به شمسی برای نمایش - _currentWeekNumberPersian = PersianDateTime.ConvertWeekNumberToPersian(_currentWeekNumber); - await LoadPoolData(); } @@ -71,18 +75,18 @@ public partial class Dashboard catch (Exception ex) { Snackbar.Add($"خطا در بارگذاری لیست هفته‌ها: {ex.Message}", Severity.Warning); - // Fallback to current week - _currentWeekNumber = GetCurrentWeekNumber(); } } - private async Task OnWeekChanged(string weekNumber) + private async Task OnWeekChanged(long weekDefinitionId) { - _currentWeekNumber = weekNumber; - _currentWeekNumberPersian = PersianDateTime.ConvertWeekNumberToPersian(weekNumber); + _currentWeekDefinitionId = weekDefinitionId; + var weekInfo = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == weekDefinitionId); + _currentWeekDisplayName = weekInfo?.DisplayName ?? ""; + _currentWeekDisplayText = weekInfo?.DisplayText ?? ""; // به‌روزرسانی URL با query string - var uri = NavigationManager.GetUriWithQueryParameter("week", weekNumber); + var uri = NavigationManager.GetUriWithQueryParameter("weekId", weekDefinitionId.ToString()); NavigationManager.NavigateTo(uri, false); await LoadPoolData(); @@ -90,6 +94,12 @@ public partial class Dashboard private async Task LoadPoolData() { + if (_currentWeekDefinitionId <= 0) + { + Snackbar.Add("هفته انتخاب نشده است", Severity.Warning); + return; + } + try { _isLoading = true; @@ -97,12 +107,12 @@ public partial class Dashboard var request = new GetWeeklyCommissionPoolRequest { - WeekNumber = _currentWeekNumber + WeekDefinitionId = _currentWeekDefinitionId }; _poolData = await CommissionContract.GetWeeklyCommissionPoolAsync(request); Console.WriteLine(JsonSerializer.Serialize(_poolData)); - Snackbar.Add($"اطلاعات Pool هفته {_currentWeekNumber} بارگذاری شد", Severity.Success); + Snackbar.Add($"اطلاعات Pool هفته {_currentWeekDisplayName} بارگذاری شد", Severity.Success); } catch (Exception ex) { @@ -120,7 +130,7 @@ public partial class Dashboard { var confirmed = await DialogService.ShowMessageBox( "تایید", - $"آیا از اجرای محاسبه دستی برای هفته {_currentWeekNumber} مطمئن هستید؟", + $"آیا از اجرای محاسبه دستی برای هفته {_currentWeekDisplayName} مطمئن هستید؟", yesText: "بله", cancelText: "خیر"); if (confirmed == true) @@ -129,7 +139,7 @@ public partial class Dashboard { await CommissionContract.TriggerWeeklyCalculationAsync(new TriggerWeeklyCalculationRequest() { - WeekNumber = _currentWeekNumber, + WeekDefinitionId = _currentWeekDefinitionId, ForceRecalculate = true, SkipBalances = false, SkipPayouts = false, @@ -147,12 +157,4 @@ public partial class Dashboard } } } - - private string GetCurrentWeekNumber() - { - var today = DateTime.Now; - var calendar = CultureInfo.CurrentCulture.Calendar; - var weekOfYear = calendar.GetWeekOfYear(today, CalendarWeekRule.FirstDay, DayOfWeek.Saturday); - return $"{today.Year}-W{weekOfYear:D2}"; - } } \ No newline at end of file diff --git a/src/BackOffice/Pages/Commission/UserPayouts.razor b/src/BackOffice/Pages/Commission/UserPayouts.razor index ecfea3b..e08fd7e 100644 --- a/src/BackOffice/Pages/Commission/UserPayouts.razor +++ b/src/BackOffice/Pages/Commission/UserPayouts.razor @@ -20,10 +20,8 @@ - + - + - @{ - var persianWeek = PersianDateTime.ConvertWeekNumberToPersian(context.Item.WeekNumber); - } - @persianWeek + @context.Item.WeekDisplayName diff --git a/src/BackOffice/Pages/Commission/UserPayouts.razor.cs b/src/BackOffice/Pages/Commission/UserPayouts.razor.cs index c703b29..5c70181 100644 --- a/src/BackOffice/Pages/Commission/UserPayouts.razor.cs +++ b/src/BackOffice/Pages/Commission/UserPayouts.razor.cs @@ -15,7 +15,7 @@ public partial class UserPayouts private MudDataGrid _gridData; private long? _filterUserId; - private string? _filterWeekNumber; + private long? _filterWeekDefinitionId; private int? _filterStatus; private async Task> ServerReload(GridState state) @@ -37,9 +37,9 @@ public partial class UserPayouts request.Filter.UserId = _filterUserId.Value; } - if (!string.IsNullOrWhiteSpace(_filterWeekNumber)) + if (_filterWeekDefinitionId.HasValue && _filterWeekDefinitionId.Value > 0) { - request.Filter.WeekNumber = _filterWeekNumber; + request.Filter.WeekDefinitionId = _filterWeekDefinitionId.Value; } if (_filterStatus.HasValue) diff --git a/src/BackOffice/Pages/Commission/WeeklyReports.razor b/src/BackOffice/Pages/Commission/WeeklyReports.razor index 8f9e59c..632c630 100644 --- a/src/BackOffice/Pages/Commission/WeeklyReports.razor +++ b/src/BackOffice/Pages/Commission/WeeklyReports.razor @@ -60,7 +60,7 @@ Filterable="true" SortMode="SortMode.Multiple"> - + @context.Item.TotalPoolAmount.ToString("N0") ریال @@ -106,7 +106,7 @@ Variant="Variant.Text" Color="Color.Info" StartIcon="@Icons.Material.Filled.People" - Href="@($"/commission/payouts?week={context.Item.WeekNumber}")"> + Href="@($"/commission/payouts?weekDefinitionId={context.Item.WeekDefinitionId}")"> پرداخت‌ها @@ -197,7 +197,8 @@ _reports = response.Models.Select(x => new WeeklyPoolReportModel { - WeekNumber = x.WeekNumber, + WeekDefinitionId = x.WeekDefinitionId, + WeekDisplayName = x.WeekDisplayName, TotalPoolAmount = x.TotalPoolAmount, TotalBalances = x.TotalBalances, ValuePerBalance = x.ValuePerBalance, @@ -224,7 +225,7 @@ private void ViewDetails(WeeklyPoolReportModel report) { - Navigation.NavigateTo($"/commission/dashboard?week={report.WeekNumber}"); + Navigation.NavigateTo($"/commission/dashboard?weekId={report.WeekDefinitionId}"); } private void CalculateStatistics() @@ -242,7 +243,8 @@ // Model for weekly pool reports private class WeeklyPoolReportModel { - public string WeekNumber { get; set; } + public long WeekDefinitionId { get; set; } + public string WeekDisplayName { get; set; } = ""; public long TotalPoolAmount { get; set; } public int TotalBalances { get; set; } public long ValuePerBalance { get; set; } diff --git a/src/BackOffice/Pages/Dashboard/SystemOverview.razor b/src/BackOffice/Pages/Dashboard/SystemOverview.razor index f7bc2fb..835db42 100644 --- a/src/BackOffice/Pages/Dashboard/SystemOverview.razor +++ b/src/BackOffice/Pages/Dashboard/SystemOverview.razor @@ -41,7 +41,7 @@ هفته جاری - @_currentWeek + @_currentWeekDisplayName @@ -219,7 +219,8 @@ [Inject] public ClubMembershipContract.ClubMembershipContractClient ClubClient { get; set; } private bool _loading = false; - private string _currentWeek = ""; + private long _currentWeekDefinitionId = 0; + private string _currentWeekDisplayName = string.Empty; private GetWeeklyCommissionPoolResponse? _currentPool; private long _totalClubMembers = 0; @@ -236,22 +237,39 @@ _loading = true; try { - // Get current week in ISO 8601 format - _currentWeek = GetCurrentWeekNumber(); - - // Load Commission data + // Get current week from available weeks API try { - var commissionRequest = new GetWeeklyCommissionPoolRequest + var availableWeeksRequest = new GetAvailableWeeksRequest { - WeekNumber = _currentWeek + FutureWeeksCount = 0, + PastWeeksCount = 0 }; - var commissionResponse = await CommissionClient.GetWeeklyCommissionPoolAsync(commissionRequest); - _currentPool = commissionResponse; + var availableWeeksResponse = await CommissionClient.GetAvailableWeeksAsync(availableWeeksRequest); + if (availableWeeksResponse?.CurrentWeek != null) + { + _currentWeekDefinitionId = availableWeeksResponse.CurrentWeek.WeekDefinitionId; + _currentWeekDisplayName = availableWeeksResponse.CurrentWeek.DisplayName; + } } - catch (Exception ex) + catch { /* Ignore - will skip pool loading */ } + + // Load Commission data + if (_currentWeekDefinitionId > 0) { - Snackbar.Add($"خطا در بارگذاری داده‌های کمیسیون: {ex.Message}", Severity.Warning); + try + { + var commissionRequest = new GetWeeklyCommissionPoolRequest + { + WeekDefinitionId = _currentWeekDefinitionId + }; + var commissionResponse = await CommissionClient.GetWeeklyCommissionPoolAsync(commissionRequest); + _currentPool = commissionResponse; + } + catch (Exception ex) + { + Snackbar.Add($"خطا در بارگذاری داده‌های کمیسیون: {ex.Message}", Severity.Warning); + } } // Load Club membership data diff --git a/src/BackOffice/Pages/Network/BalancesReport.razor b/src/BackOffice/Pages/Network/BalancesReport.razor index 7317109..27b04fb 100644 --- a/src/BackOffice/Pages/Network/BalancesReport.razor +++ b/src/BackOffice/Pages/Network/BalancesReport.razor @@ -23,7 +23,7 @@ @@ -69,7 +69,7 @@ Hover="true"> - + @@ -153,7 +153,7 @@ [Inject] public CommissionContract.CommissionContractClient CommissionClient { get; set; } private MudDataGrid _grid { get; set; } private long? _filterUserId = null; - private string _filterWeekNumber = ""; + private long? _filterWeekDefinitionId = null; private int? _minBalance = null; private int? _maxBalance = null; private bool _onlyActive = false; @@ -178,9 +178,9 @@ private MudDataGrid _grid { get; set; } request.UserId = _filterUserId.Value; } - if (!string.IsNullOrWhiteSpace(_filterWeekNumber)) + if (_filterWeekDefinitionId.HasValue && _filterWeekDefinitionId.Value > 0) { - request.WeekNumber = _filterWeekNumber; + request.WeekDefinitionId = _filterWeekDefinitionId.Value; } var response = await CommissionClient.GetUserWeeklyBalancesAsync(request); @@ -188,7 +188,7 @@ private MudDataGrid _grid { get; set; } var items = response.Models.Select(b => new UserWeeklyBalanceModel { UserId = b.UserId, - WeekNumber = b.WeekNumber, + WeekDisplayName = b.WeekDisplayName, LeftBalance = b.LeftLegBalances, RightBalance = b.RightLegBalances, MatchedBalance = b.TotalBalances, @@ -247,7 +247,7 @@ private MudDataGrid _grid { get; set; } private class UserWeeklyBalanceModel { public long UserId { get; set; } - public string WeekNumber { get; set; } + public string WeekDisplayName { get; set; } public int LeftBalance { get; set; } public int RightBalance { get; set; } public int MatchedBalance { get; set; } diff --git a/src/BackOffice/Pages/Network/NetworkTreeViewer.razor b/src/BackOffice/Pages/Network/NetworkTreeViewer.razor index fcd3ec2..2753f5a 100644 --- a/src/BackOffice/Pages/Network/NetworkTreeViewer.razor +++ b/src/BackOffice/Pages/Network/NetworkTreeViewer.razor @@ -34,7 +34,7 @@
+ @bind-SelectedWeekDefinitionId="_activationWeekFilter" />
@@ -118,11 +118,11 @@
- + - @if (!string.IsNullOrEmpty(context.Item.ActivationWeekNumber)) + @if (context.Item.ActivationWeekDefinitionId != null) { - @context.Item.ActivationWeekNumber + @context.Item.ActivationWeekDefinitionId } else { @@ -180,7 +180,7 @@ private int _rightCount; private DotNetObjectReference _dotNetRef; private bool? _clubActiveFilter; - private string? _activationWeekFilter; + private long? _activationWeekFilter; protected override void OnInitialized() { @@ -213,7 +213,7 @@ UserId = _searchUserId.Value, MaxDepth = 20, IsClubActive = _clubActiveFilter.HasValue ? _clubActiveFilter.Value : null, - ActivationWeekNumber = !string.IsNullOrEmpty(_activationWeekFilter) ? _activationWeekFilter : null + ActivationWeekDefinitionId = _activationWeekFilter!=null ? _activationWeekFilter : null }; _treeData = await NetworkContract.GetNetworkTreeAsync(request); @@ -248,7 +248,7 @@ isActive = n.IsClubActive, isClubActive = n.IsClubActive, isActivatedInTargetWeek = n.IsActivatedInTargetWeek, - activationWeekNumber = _activationWeekFilter ?? "", // فیلتر UI + activationWeekNumber = _activationWeekFilter ?? 0, // فیلتر UI clubActivatedAt = n.ClubActivatedAt?.ToDateTime().ToLocalTime().ToString("yyyy/MM/dd") ?? "", userCreated = n.UserCreated?.ToDateTime().ToLocalTime().ToString("yyyy/MM/dd") ?? "" }).ToArray(); diff --git a/src/BackOffice/Pages/Products/Components/CreateDialog.razor b/src/BackOffice/Pages/Products/Components/CreateDialog.razor index c0469b3..7f4b0bc 100644 --- a/src/BackOffice/Pages/Products/Components/CreateDialog.razor +++ b/src/BackOffice/Pages/Products/Components/CreateDialog.razor @@ -56,7 +56,14 @@
- + + + + + + + + diff --git a/src/BackOffice/Pages/Products/Components/UpdateDialog.razor b/src/BackOffice/Pages/Products/Components/UpdateDialog.razor index 7b0f058..f29f147 100644 --- a/src/BackOffice/Pages/Products/Components/UpdateDialog.razor +++ b/src/BackOffice/Pages/Products/Components/UpdateDialog.razor @@ -42,7 +42,14 @@ - + + + + + + + + diff --git a/src/BackOffice/Pages/Products/ProductsMainPage.razor b/src/BackOffice/Pages/Products/ProductsMainPage.razor index 15aa2f4..29f24c1 100644 --- a/src/BackOffice/Pages/Products/ProductsMainPage.razor +++ b/src/BackOffice/Pages/Products/ProductsMainPage.razor @@ -142,6 +142,23 @@ + + + @if (context.Item.RemainingCount <= 0) + { + ناموجود + } + else if (context.Item.RemainingCount < 10) + { + @context.Item.RemainingCount + } + else + { + @context.Item.RemainingCount + } + + + diff --git a/src/BackOffice/Pages/Products/ProductsMainPage.razor.cs b/src/BackOffice/Pages/Products/ProductsMainPage.razor.cs index 88d20a8..0d11997 100644 --- a/src/BackOffice/Pages/Products/ProductsMainPage.razor.cs +++ b/src/BackOffice/Pages/Products/ProductsMainPage.razor.cs @@ -2,8 +2,7 @@ using BackOffice.BFF.Products.Protobuf.Protos.Products; using BackOffice.BFF.Protobuf.Common; using BackOffice.Common.BaseComponents; using BackOffice.Common.Utilities; -// TODO: Uncomment when Tag proto project is created -// using BackOffice.Pages.Tag.Components; +using BackOffice.Pages.Tag.Components; using BackOffice.Pages.Products.Components; using Mapster; using Microsoft.AspNetCore.Components; @@ -163,9 +162,6 @@ public partial class ProductsMainPage } } - // TODO: Re-enable when CreateProductDialog and UpdateProductDialog are available - // These dialogs need ImageFile/ThumbnailFile fields in proto - /* public async Task Update(DataModel model) { var parameters = new DialogParameters { { x => x.Model, model.Adapt() } }; @@ -179,12 +175,6 @@ public partial class ProductsMainPage Snackbar.Add("عملیات با موفقیت انجام شد", Severity.Success); } } - */ - - public async Task Update(DataModel model) - { - Snackbar.Add("ویرایش محصول موقتاً غیرفعال است - در حال توسعه", Severity.Warning); - } private async Task OnDelete(DataModel model) { @@ -208,8 +198,6 @@ public partial class ProductsMainPage await _gridData.ReloadServerData(); } - // TODO: Re-enable when CreateProductDialog is available - /* public async Task CreateNew() { var dialog = await DialogService.ShowAsync("افزودن محصول", new DialogParameters { { x => x.Model, new CreateNewProductsRequest() } }, new DialogOptions { CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.Small }); @@ -220,12 +208,6 @@ public partial class ProductsMainPage Snackbar.Add("عملیات با موفقیت انجام شد", Severity.Success); } } - */ - - public async Task CreateNew() - { - Snackbar.Add("افزودن محصول موقتاً غیرفعال است - در حال توسعه", Severity.Warning); - } public async Task OnFilterSubmit() { @@ -245,15 +227,13 @@ public partial class ProductsMainPage // TODO: Enable when GalleryDialog is working (needs AddProductImageAsync/RemoveProductImageAsync in proto) public async Task OpenGallery(DataModel model) { - // var parameters = new DialogParameters - // { - // { x => x.ProductId, model.Id }, - // { x => x.ProductTitle, model.Title } - // }; - // await DialogService.ShowAsync("گالری تصاویر", parameters, - // new DialogOptions { CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.Medium }); - Snackbar.Add("گالری تصاویر در حال توسعه است", Severity.Info); - await Task.CompletedTask; + var parameters = new DialogParameters + { + { x => x.ProductId, model.Id }, + { x => x.ProductTitle, model.Title } + }; + await DialogService.ShowAsync("گالری تصاویر", parameters, + new DialogOptions { CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.Medium }); } public void OpenCategoryMapping(DataModel model) @@ -261,20 +241,16 @@ public partial class ProductsMainPage Navigation.NavigateTo($"{RouteConstance.ProductCategories}{model.Id}"); } - // TODO: Enable when Tag proto project is created public async Task OpenTagAssignment(DataModel model) { - // var parameters = new DialogParameters - // { - // { x => x.ProductId, model.Id }, - // { x => x.ProductTitle, model.Title } - // }; + var parameters = new DialogParameters + { + { x => x.ProductId, model.Id }, + { x => x.ProductTitle, model.Title } + }; - // await DialogService.ShowAsync("مدیریت تگ‌های محصول", parameters, - // new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true }); - - await Task.CompletedTask; - Snackbar.Add("قابلیت تگ‌گذاری در حال توسعه است", Severity.Info); + await DialogService.ShowAsync("مدیریت تگ‌های محصول", parameters, + new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true }); } public async Task OpenImagePreview(string imagePath, string title) diff --git a/src/BackOffice/Pages/SystemManagement/WorkerControl.razor b/src/BackOffice/Pages/SystemManagement/WorkerControl.razor index 6442a19..59b85c7 100644 --- a/src/BackOffice/Pages/SystemManagement/WorkerControl.razor +++ b/src/BackOffice/Pages/SystemManagement/WorkerControl.razor @@ -61,7 +61,8 @@ @PersianDateTime.ConvertToPersianDateTime(context.ExecutionTime) - @PersianDateTime.ConvertWeekNumberToPersian(context.WeekNumber) + @context.WeekDisplayName _executionLog = new(); @@ -210,15 +212,15 @@ private async Task RunManualCalculation() { - if (string.IsNullOrWhiteSpace(_manualWeekNumber)) + if (!_manualWeekDefinitionId.HasValue || _manualWeekDefinitionId.Value <= 0) { - Snackbar.Add("لطفا شماره هفته را وارد کنید", Severity.Warning); + Snackbar.Add("لطفا هفته را انتخاب کنید", Severity.Warning); return; } var confirmed = await DialogService.ShowMessageBox( "اجرای دستی محاسبات", - $"آیا از اجرای محاسبات برای هفته {PersianDateTime.ConvertWeekNumberToPersian(_manualWeekNumber)} اطمینان دارید؟", + $"آیا از اجرای محاسبات برای هفته {_manualWeekDisplayName} اطمینان دارید؟", yesText: "بله، اجرا شود", cancelText: "لغو"); if (confirmed == true) @@ -228,13 +230,13 @@ { var request = new Foursat.BackOffice.BFF.Commission.Protos.TriggerWeeklyCalculationRequest { - WeekNumber = _manualWeekNumber + WeekDefinitionId = _manualWeekDefinitionId.Value }; await CommissionClient.TriggerWeeklyCalculationAsync(request); - var persianWeek = PersianDateTime.ConvertWeekNumberToPersian(_manualWeekNumber); - Snackbar.Add($"محاسبات هفته {persianWeek} با موفقیت آغاز شد", Severity.Success); - _manualWeekNumber = ""; + Snackbar.Add($"محاسبات هفته {_manualWeekDisplayName} با موفقیت آغاز شد", Severity.Success); + _manualWeekDefinitionId = null; + _manualWeekDisplayName = ""; await RefreshLog(); } catch (Exception ex) @@ -283,7 +285,8 @@ _executionLog = response.Models.Select(log => new ExecutionLogModel { ExecutionTime = log.StartedAt?.ToDateTime() ?? DateTime.MinValue, - WeekNumber = log.WeekNumber, + WeekDefinitionId = log.WeekDefinitionId, + WeekDisplayName = log.WeekDisplayName, Status = log.Success ? "موفق" : "ناموفق", Duration = $"{log.DurationMs / 1000.0:F1} ثانیه", ProcessedCount = log.RecordsProcessed, @@ -319,7 +322,8 @@ private class ExecutionLogModel { public DateTime ExecutionTime { get; set; } - public string WeekNumber { get; set; } = ""; + public long WeekDefinitionId { get; set; } + public string WeekDisplayName { get; set; } = ""; public string Status { get; set; } = ""; public string Duration { get; set; } = ""; public int ProcessedCount { get; set; }