From 70fa3e8cabc3cce260abec7c17c692a3d59e0e5a Mon Sep 17 00:00:00 2001 From: Furkan Evran Date: Thu, 13 Jun 2024 19:32:13 +0300 Subject: [PATCH 1/3] fix criteria json parsing not trying to convert datetimeoffset and datetime --- src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs b/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs index 33fbf057b3..ce4d7e2b2e 100644 --- a/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs +++ b/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs @@ -93,7 +93,15 @@ public override BaseCriteria Read(ref Utf8JsonReader reader, Type typeToConvert, private BaseCriteria ParseValue(JsonElement value) { if (value.ValueKind == JsonValueKind.String) + { + if (value.TryGetDateTimeOffset(out var dto)) + return new ValueCriteria(dto); + + if (value.TryGetDateTime(out var dt)) + return new ValueCriteria(dt); + return new ValueCriteria(value.GetString()); + } else if (value.ValueKind == JsonValueKind.Number) return new ValueCriteria(value.GetDouble()); else if (value.ValueKind == JsonValueKind.True) From a82ec3485050f3bb6334b578a18e9e7e95e689e9 Mon Sep 17 00:00:00 2001 From: Furkan Evran Date: Thu, 13 Jun 2024 21:31:11 +0300 Subject: [PATCH 2/3] handle array of items in criteria --- src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs b/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs index ce4d7e2b2e..a6e229dc17 100644 --- a/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs +++ b/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs @@ -134,7 +134,14 @@ private BaseCriteria Parse(JsonElement[] array) throw new ArgumentNullException("item"); if (item.ValueKind == JsonValueKind.String) - list.Add(item.GetString()); + { + if (item.TryGetDateTimeOffset(out var dto)) + list.Add(dto); + else if (item.TryGetDateTime(out var dt)) + list.Add(dt); + else + list.Add(item.GetString()); + } else if (item.ValueKind == JsonValueKind.Number) list.Add(item.GetDouble()); else if (item.ValueKind == JsonValueKind.True) From bf61e671fa87fd9c58e39e9ce756c03516932e69 Mon Sep 17 00:00:00 2001 From: Furkan Evran Date: Fri, 14 Jun 2024 15:38:31 +0300 Subject: [PATCH 3/3] add convert value override to DateTimeOffsetField that tries to parse it as DateTimeOffset isn't extending IConvertible revert CriteriaJsonConverter --- .../Criteria/CriteriaJsonConverter.cs | 15 -------- .../FieldTypes/DateTimeOffsetField.cs | 35 +++++++++++++++++++ .../FieldTypes/GenericValueField.cs | 10 +++--- 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs b/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs index a6e229dc17..cec82c275b 100644 --- a/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs +++ b/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs @@ -93,15 +93,7 @@ public override BaseCriteria Read(ref Utf8JsonReader reader, Type typeToConvert, private BaseCriteria ParseValue(JsonElement value) { if (value.ValueKind == JsonValueKind.String) - { - if (value.TryGetDateTimeOffset(out var dto)) - return new ValueCriteria(dto); - - if (value.TryGetDateTime(out var dt)) - return new ValueCriteria(dt); - return new ValueCriteria(value.GetString()); - } else if (value.ValueKind == JsonValueKind.Number) return new ValueCriteria(value.GetDouble()); else if (value.ValueKind == JsonValueKind.True) @@ -134,14 +126,7 @@ private BaseCriteria Parse(JsonElement[] array) throw new ArgumentNullException("item"); if (item.ValueKind == JsonValueKind.String) - { - if (item.TryGetDateTimeOffset(out var dto)) - list.Add(dto); - else if (item.TryGetDateTime(out var dt)) - list.Add(dt); - else list.Add(item.GetString()); - } else if (item.ValueKind == JsonValueKind.Number) list.Add(item.GetDouble()); else if (item.ValueKind == JsonValueKind.True) diff --git a/src/Serenity.Net.Entity/FieldTypes/DateTimeOffsetField.cs b/src/Serenity.Net.Entity/FieldTypes/DateTimeOffsetField.cs index 82ef74300c..86bf174181 100644 --- a/src/Serenity.Net.Entity/FieldTypes/DateTimeOffsetField.cs +++ b/src/Serenity.Net.Entity/FieldTypes/DateTimeOffsetField.cs @@ -36,6 +36,41 @@ public static DateTimeOffsetField Factory(ICollection collection, string return new DateTimeOffsetField(collection, name, caption, size, flags, getValue, setValue); } + /// + /// Converts the value. + /// + /// The source. + /// The provider. + /// + public override object ConvertValue(object source, IFormatProvider provider) + { + if (source is Newtonsoft.Json.Linq.JValue jValue) + source = jValue.Value; + + if (source == null) + return null; + + if (source is DateTime dt) + return dt; + + if (source is DateTimeOffset dto) + return dto.DateTime; + + if (source is string s) + { + if (DateTimeOffset.TryParse(s, provider, DateTimeStyles.None, out var dtOffset)) + return dtOffset; + + if (s.TryParseISO8601DateTime(out var dateTime)) + return dateTime; + + if (DateTime.TryParse(s, provider, DateTimeStyles.None, out dateTime)) + return dateTime; + } + + return Convert.ChangeType(source, typeof(DateTime), provider); + } + /// /// Gets field value from a data reader. /// diff --git a/src/Serenity.Net.Entity/FieldTypes/GenericValueField.cs b/src/Serenity.Net.Entity/FieldTypes/GenericValueField.cs index e089879d85..7a4500ca0b 100644 --- a/src/Serenity.Net.Entity/FieldTypes/GenericValueField.cs +++ b/src/Serenity.Net.Entity/FieldTypes/GenericValueField.cs @@ -42,13 +42,11 @@ public override object ConvertValue(object source, IFormatProvider provider) if (source == null) return null; - else - { - if (source is TValue val) - return val; - return Convert.ChangeType(source, typeof(TValue), provider); - } + if (source is TValue val) + return val; + + return Convert.ChangeType(source, typeof(TValue), provider); } ///