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
|
public partial class DateRangePicker
|
||||||
{
|
{
|
||||||
private DateRange _dateRange = new();
|
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 string Label { get; set; } = "انتخاب بازه زمانی";
|
||||||
[Parameter] public DateTime? DefaultStart { get; set; }
|
[Parameter] public DateTime? DefaultStart { get; set; }
|
||||||
[Parameter] public DateTime? DefaultEnd { get; set; }
|
[Parameter] public DateTime? DefaultEnd { get; set; }
|
||||||
[Parameter] public EventCallback<DateRange> OnChanged { 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()
|
protected override void OnInitialized()
|
||||||
{
|
{
|
||||||
base.OnInitialized();
|
base.OnInitialized();
|
||||||
if (DefaultStart.HasValue)
|
var start = From ?? DefaultStart;
|
||||||
_dateRange.Start = DefaultStart.Value.Date;
|
var end = To ?? DefaultEnd;
|
||||||
|
ApplyExternalRange(start, end);
|
||||||
if (DefaultEnd.HasValue)
|
_lastSyncedFrom = From;
|
||||||
_dateRange.End = DefaultEnd.Value.Date;
|
_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()
|
public CultureInfo GetPersianCulture()
|
||||||
{
|
{
|
||||||
var culture = new CultureInfo("fa-IR");
|
var culture = new CultureInfo("fa-IR");
|
||||||
@@ -53,19 +78,35 @@ public partial class DateRangePicker
|
|||||||
culture.NumberFormat.NumberNegativePattern = 0;
|
culture.NumberFormat.NumberNegativePattern = 0;
|
||||||
return culture;
|
return culture;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OnClickOK()
|
private async Task OnClickOK()
|
||||||
{
|
{
|
||||||
if (_picker.DateRange is not null)
|
var range = _picker.DateRange ?? _dateRange;
|
||||||
{
|
_dateRange = range ?? new DateRange();
|
||||||
await OnChanged.InvokeAsync(_picker.DateRange);
|
await NotifyRangeChangedAsync(_dateRange);
|
||||||
}
|
|
||||||
|
|
||||||
await _picker.CloseAsync();
|
await _picker.CloseAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OnClickClear()
|
private async Task OnClickClear()
|
||||||
{
|
{
|
||||||
_dateRange = new DateRange();
|
_dateRange = new DateRange();
|
||||||
await OnChanged.InvokeAsync(_dateRange);
|
await NotifyRangeChangedAsync(_dateRange);
|
||||||
await _picker.CloseAsync();
|
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