From 24ae4ec15c10b7c6b3925ac38ea443403a6cd1d4 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Sun, 9 Aug 2026 00:02:54 +0330 Subject: [PATCH] feat(date-range-picker): enhance date range picker functionality with external parameters and notifications - Added support for external From and To parameters to synchronize date range selections. - Implemented OnParametersSet to handle updates from parent components without triggering unnecessary updates. - Introduced NotifyRangeChangedAsync to streamline notifications for date range changes. - Refactored date range application logic to improve clarity and maintainability. --- .../BaseComponents/DateRangePicker.razor.cs | 65 +++++++++++++++---- 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/src/BackOffice/Common/BaseComponents/DateRangePicker.razor.cs b/src/BackOffice/Common/BaseComponents/DateRangePicker.razor.cs index 39cd928..d7d31dc 100644 --- a/src/BackOffice/Common/BaseComponents/DateRangePicker.razor.cs +++ b/src/BackOffice/Common/BaseComponents/DateRangePicker.razor.cs @@ -8,21 +8,46 @@ namespace BackOffice.Common.BaseComponents; public partial class DateRangePicker { private DateRange _dateRange = new(); + private MudDateRangePicker _picker = default!; + private DateTime? _lastSyncedFrom; + private DateTime? _lastSyncedTo; - private MudDateRangePicker _picker; [Parameter] public string Label { get; set; } = "انتخاب بازه زمانی"; [Parameter] public DateTime? DefaultStart { get; set; } [Parameter] public DateTime? DefaultEnd { get; set; } [Parameter] public EventCallback OnChanged { get; set; } + + [Parameter] public DateTime? From { get; set; } + [Parameter] public EventCallback FromChanged { get; set; } + [Parameter] public DateTime? To { get; set; } + [Parameter] public EventCallback ToChanged { get; set; } + protected override void OnInitialized() { base.OnInitialized(); - if (DefaultStart.HasValue) - _dateRange.Start = DefaultStart.Value.Date; - - if (DefaultEnd.HasValue) - _dateRange.End = DefaultEnd.Value.Date; + var start = From ?? DefaultStart; + var end = To ?? DefaultEnd; + ApplyExternalRange(start, end); + _lastSyncedFrom = From; + _lastSyncedTo = To; } + + protected override void OnParametersSet() + { + // فقط وقتی والد From/To را عوض کرده (مثلاً پاک کردن فیلتر)، نه هنگام انتخاب داخل پیکر + if (From == _lastSyncedFrom && To == _lastSyncedTo) + return; + + _lastSyncedFrom = From; + _lastSyncedTo = To; + ApplyExternalRange(From, To); + } + + private void ApplyExternalRange(DateTime? start, DateTime? end) + { + _dateRange = new DateRange(start?.Date, end?.Date); + } + public CultureInfo GetPersianCulture() { var culture = new CultureInfo("fa-IR"); @@ -53,19 +78,35 @@ public partial class DateRangePicker culture.NumberFormat.NumberNegativePattern = 0; return culture; } + private async Task OnClickOK() { - if (_picker.DateRange is not null) - { - await OnChanged.InvokeAsync(_picker.DateRange); - } - + var range = _picker.DateRange ?? _dateRange; + _dateRange = range ?? new DateRange(); + await NotifyRangeChangedAsync(_dateRange); await _picker.CloseAsync(); } + private async Task OnClickClear() { _dateRange = new DateRange(); - await OnChanged.InvokeAsync(_dateRange); + await NotifyRangeChangedAsync(_dateRange); await _picker.CloseAsync(); } + + private async Task NotifyRangeChangedAsync(DateRange range) + { + var start = range.Start?.Date; + var end = range.End?.Date; + + _lastSyncedFrom = start; + _lastSyncedTo = end; + + if (From != start) + await FromChanged.InvokeAsync(start); + if (To != end) + await ToChanged.InvokeAsync(end); + + await OnChanged.InvokeAsync(range); + } }