Skip to content

Commit

Permalink
CalendarDatePicker - use CustomDateFormatString for parsing the text …
Browse files Browse the repository at this point in the history
…input (#17465)

* fix: #17291 use CustomDateFormatString for parsing the text input

* fix: use CustomDateFormatString also for watermark

* fix: #17291 check also for SelectedDateFormat == Custom
  • Loading branch information
punker76 authored Nov 14, 2024
1 parent a5c0f2b commit 9fb3a13
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 8 deletions.
10 changes: 9 additions & 1 deletion src/Avalonia.Controls/CalendarDatePicker/CalendarDatePicker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -730,7 +730,9 @@ private void OpenDropDown()
// the TextParseError event
try
{
newSelectedDate = DateTime.Parse(text, DateTimeHelper.GetCurrentDateFormat());
newSelectedDate = SelectedDateFormat == CalendarDatePickerFormat.Custom && !string.IsNullOrEmpty(CustomDateFormatString) ?
DateTime.ParseExact(text, CustomDateFormatString, DateTimeHelper.GetCurrentDateFormat()) :
DateTime.Parse(text, DateTimeHelper.GetCurrentDateFormat());

if (Calendar.IsValidDateSelection(this._calendar!, newSelectedDate))
{
Expand Down Expand Up @@ -899,6 +901,11 @@ private void SetWaterMarkText()

switch (SelectedDateFormat)
{
case CalendarDatePickerFormat.Custom:
{
watermarkText = string.Format(CultureInfo.CurrentCulture, watermarkFormat, CustomDateFormatString);
break;
}
case CalendarDatePickerFormat.Long:
{
watermarkText = string.Format(CultureInfo.CurrentCulture, watermarkFormat, dtfi.LongDatePattern.ToString());
Expand All @@ -911,6 +918,7 @@ private void SetWaterMarkText()
break;
}
}

_textBox.Watermark = watermarkText;
}
else
Expand Down
65 changes: 58 additions & 7 deletions tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System;
using System.Linq;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
using Avalonia.Data;
using Avalonia.Markup.Data;
using Avalonia.Input;
using Avalonia.Platform;
using Avalonia.UnitTests;
using Moq;
using Xunit;
using System.Globalization;

namespace Avalonia.Controls.UnitTests
{
Expand Down Expand Up @@ -73,6 +69,34 @@ public void Adding_Blackout_Dates_Containing_Selected_Date_Should_Throw()
}
}

[Fact]
public void Setting_Date_Manually_With_CustomDateFormatString_Should_Be_Accepted()
{
CultureInfo.CurrentCulture = CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
using (UnitTestApplication.Start(Services))
{
CalendarDatePicker datePicker = CreateControl();
datePicker.SelectedDateFormat = CalendarDatePickerFormat.Custom;
datePicker.CustomDateFormatString = "dd.MM.yyyy";

var tb = GetTextBox(datePicker);

tb.Clear();
RaiseTextEvent(tb, "17.10.2024");
RaiseKeyEvent(tb, Key.Enter, KeyModifiers.None);

Assert.Equal("17.10.2024", datePicker.Text);
Assert.True(CompareDates(datePicker.SelectedDate.Value, new DateTime(2024, 10, 17)));

tb.Clear();
RaiseTextEvent(tb, "12.10.2024");
RaiseKeyEvent(tb, Key.Enter, KeyModifiers.None);

Assert.Equal("12.10.2024", datePicker.Text);
Assert.True(CompareDates(datePicker.SelectedDate.Value, new DateTime(2024, 10, 12)));
}
}

private static TestServices Services => TestServices.MockThreadingInterface.With(
standardCursorFactory: Mock.Of<ICursorFactory>());

Expand Down Expand Up @@ -127,5 +151,32 @@ private static IControlTemplate CreateTemplate()
});

}

private TextBox GetTextBox(CalendarDatePicker control)
{
return control.GetTemplateChildren()
.OfType<TextBox>()
.First();
}

private static void RaiseKeyEvent(TextBox textBox, Key key, KeyModifiers inputModifiers)
{
textBox.RaiseEvent(new KeyEventArgs
{
RoutedEvent = InputElement.KeyDownEvent,
KeyModifiers = inputModifiers,
Key = key
});
}

private static void RaiseTextEvent(TextBox textBox, string text)
{
textBox.RaiseEvent(new TextInputEventArgs
{
RoutedEvent = InputElement.TextInputEvent,
Text = text
});
}

}
}

0 comments on commit 9fb3a13

Please sign in to comment.