feat(date-range-picker): enhance date range picker functionality with external parameters and notifications
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 7m20s
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 7m20s
- 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.
This commit is contained in:
@@ -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<DateRange> OnChanged { get; set; }
|
||||
|
||||
[Parameter] public DateTime? From { get; set; }
|
||||
[Parameter] public EventCallback<DateTime?> FromChanged { get; set; }
|
||||
[Parameter] public DateTime? To { get; set; }
|
||||
[Parameter] public EventCallback<DateTime?> 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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user