Skip to content

Commit beccb8d

Browse files
committed
Add DateTimeOffset support and improve data grid value conversion
1 parent c6c5f5d commit beccb8d

5 files changed

Lines changed: 129 additions & 18 deletions

File tree

framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ public static Type GetInputType(this ObjectExtensionPropertyInfo propertyInfo)
211211
{
212212
foreach (var attribute in propertyInfo.Attributes)
213213
{
214-
var inputTypeByAttribute = GetInputTypeFromAttributeOrNull(attribute);
214+
var inputTypeByAttribute = GetInputTypeFromAttributeOrNull(attribute, propertyInfo.Type);
215215
if (inputTypeByAttribute != null)
216216
{
217217
return inputTypeByAttribute;
@@ -226,7 +226,7 @@ public static bool IsEnum(this ObjectExtensionPropertyInfo propertyInfo)
226226
return propertyInfo.Type.IsEnum || TypeHelper.IsNullableEnum(propertyInfo.Type);
227227
}
228228

229-
private static Type? GetInputTypeFromAttributeOrNull(Attribute attribute)
229+
private static Type? GetInputTypeFromAttributeOrNull(Attribute attribute, Type propertyType)
230230
{
231231
var hasTextEditSupport = TextEditSupportedAttributeTypes.Any(t => t == attribute.GetType());
232232

@@ -235,7 +235,6 @@ public static bool IsEnum(this ObjectExtensionPropertyInfo propertyInfo)
235235
return typeof(TextExtensionProperty<,>);
236236
}
237237

238-
239238
if (attribute is DataTypeAttribute dataTypeAttribute)
240239
{
241240
switch (dataTypeAttribute.DataType)
@@ -247,7 +246,9 @@ public static bool IsEnum(this ObjectExtensionPropertyInfo propertyInfo)
247246
return typeof(TextExtensionProperty<,>);
248247
case DataType.Date:
249248
case DataType.DateTime:
250-
return typeof(DateTimeExtensionProperty<,>);
249+
return propertyType == typeof(DateTimeOffset) || propertyType == typeof(DateTimeOffset?)
250+
? typeof(DateTimeOffsetExtensionProperty<,>)
251+
: typeof(DateTimeExtensionProperty<,>);
251252
case DataType.Time:
252253
return typeof(TimeExtensionProperty<,>);
253254
case DataType.MultilineText:
@@ -265,11 +266,16 @@ public static bool IsEnum(this ObjectExtensionPropertyInfo propertyInfo)
265266
return typeof(CheckExtensionProperty<,>);
266267
}
267268

268-
if (type == typeof(DateTime))
269+
if (type == typeof(DateTime) || type == typeof(DateTime?))
269270
{
270271
return typeof(DateTimeExtensionProperty<,>);
271272
}
272273

274+
if (type == typeof(DateTimeOffset) || type == typeof(DateTimeOffset?))
275+
{
276+
return typeof(DateTimeOffsetExtensionProperty<,>);
277+
}
278+
273279
if (NumberTypes.Contains(type))
274280
{
275281
return typeof(TextExtensionProperty<,>);

framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
{
9393
if (!ExtensionPropertiesRegex.IsMatch(column.Data))
9494
{
95-
@if (column.ValueConverter == null)
95+
@if (column.ValueConverter == null && !IsDateTimeColumn(column))
9696
{
9797
<DataGridColumn TItem="TItem"
9898
Field="@column.Data"
@@ -144,14 +144,7 @@
144144
}
145145
else
146146
{
147-
if (column.DisplayFormat == null)
148-
{
149-
@(propertyValue)
150-
}
151-
else
152-
{
153-
@(string.Format(column.DisplayFormatProvider, column.DisplayFormat, propertyValue))
154-
}
147+
@((MarkupString)GetConvertedFieldValue(propertyValue, column))
155148
}
156149
}
157150
}

framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor.cs

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Globalization;
34
using System.Text.RegularExpressions;
45
using Blazorise.DataGrid;
56
using Blazorise.Extensions;
67
using Localization.Resources.AbpUi;
78
using Microsoft.AspNetCore.Components;
89
using Microsoft.Extensions.Localization;
910
using Volo.Abp.AspNetCore.Components.Web.Extensibility.TableColumns;
11+
using Volo.Abp.Timing;
1012

1113
namespace Volo.Abp.BlazoriseUI.Components;
1214

@@ -45,6 +47,9 @@ public partial class AbpExtensibleDataGrid<TItem> : ComponentBase
4547
[Inject]
4648
public IStringLocalizer<AbpUiResource> UiLocalizer { get; set; } = default!;
4749

50+
[Inject]
51+
public IClock Clock { get; set; } = default!;
52+
4853
protected virtual RenderFragment RenderCustomTableColumnComponent(Type type, object data)
4954
{
5055
return (builder) =>
@@ -57,13 +62,67 @@ protected virtual RenderFragment RenderCustomTableColumnComponent(Type type, obj
5762

5863
protected virtual string GetConvertedFieldValue(TItem item, TableColumn columnDefinition)
5964
{
60-
var convertedValue = columnDefinition.ValueConverter!.Invoke(item!);
65+
if (columnDefinition.ValueConverter != null)
66+
{
67+
var convertedValue = columnDefinition.ValueConverter.Invoke(item!);
68+
if (!columnDefinition.DisplayFormat.IsNullOrEmpty())
69+
{
70+
return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, convertedValue);
71+
}
72+
73+
return convertedValue;
74+
}
75+
76+
var propertyInfo = item!.GetType().GetProperty(columnDefinition.Data);
77+
return GetConvertedFieldValue(propertyInfo?.GetValue(item), columnDefinition);
78+
}
79+
80+
protected virtual string GetConvertedFieldValue(object? value, TableColumn columnDefinition)
81+
{
82+
if (value is DateTime dateTime)
83+
{
84+
var converted = Clock.ConvertToUserTime(dateTime);
85+
if (!columnDefinition.DisplayFormat.IsNullOrEmpty())
86+
{
87+
return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, converted);
88+
}
89+
90+
return converted.ToString(columnDefinition.DisplayFormatProvider as CultureInfo ?? CultureInfo.CurrentCulture);
91+
}
92+
93+
if (value is DateTimeOffset dateTimeOffset)
94+
{
95+
var converted = Clock.ConvertToUserTime(dateTimeOffset);
96+
if (!columnDefinition.DisplayFormat.IsNullOrEmpty())
97+
{
98+
return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, converted);
99+
}
100+
101+
return converted.ToString(columnDefinition.DisplayFormatProvider as CultureInfo ?? CultureInfo.CurrentCulture);
102+
}
103+
104+
if (value == null)
105+
{
106+
return string.Empty;
107+
}
108+
61109
if (!columnDefinition.DisplayFormat.IsNullOrEmpty())
62110
{
63-
return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!,
64-
convertedValue);
111+
return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, value);
112+
}
113+
114+
return value.ToString() ?? string.Empty;
115+
}
116+
117+
protected virtual bool IsDateTimeColumn(TableColumn columnDefinition)
118+
{
119+
var propertyInfo = typeof(TItem).GetProperty(columnDefinition.Data);
120+
if (propertyInfo == null)
121+
{
122+
return false;
65123
}
66124

67-
return convertedValue;
125+
var propertyType = Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType;
126+
return propertyType == typeof(DateTime) || propertyType == typeof(DateTimeOffset);
68127
}
69128
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
@typeparam TEntity
2+
@typeparam TResourceType
3+
@using Volo.Abp.BlazoriseUI
4+
@using Volo.Abp.Localization
5+
@using Volo.Abp.ObjectExtending
6+
@inherits ExtensionPropertyComponentBase<TEntity, TResourceType>
7+
8+
@if (PropertyInfo != null && Entity != null)
9+
{
10+
<Validation Validator="@Validate" MessageLocalizer="@LH.Localize">
11+
<Field>
12+
<FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel>
13+
<DateInput TValue="DateTimeOffset?"
14+
InputMode="@(PropertyInfo.IsDate() ? DateInputMode.Date : DateInputMode.DateTime)"
15+
Pattern="@PropertyInfo.GetDateEditInputFormatOrNull()"
16+
Disabled="IsReadonlyField"
17+
@bind-Value="@Value">
18+
<Feedback>
19+
<ValidationError/>
20+
</Feedback>
21+
</DateInput>
22+
</Field>
23+
</Validation>
24+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System;
2+
using Volo.Abp.Data;
3+
4+
namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending;
5+
6+
public partial class DateTimeOffsetExtensionProperty<TEntity, TResourceType>
7+
where TEntity : IHasExtraProperties
8+
{
9+
protected DateTimeOffset? Value {
10+
get {
11+
var raw = Entity.GetProperty(PropertyInfo.Name);
12+
return raw switch
13+
{
14+
null => null,
15+
DateTimeOffset dto => dto,
16+
DateTime dt => dt.Kind switch
17+
{
18+
DateTimeKind.Utc => new DateTimeOffset(dt, TimeSpan.Zero),
19+
DateTimeKind.Local => new DateTimeOffset(dt),
20+
_ => new DateTimeOffset(DateTime.SpecifyKind(dt, DateTimeKind.Utc), TimeSpan.Zero)
21+
},
22+
_ => null
23+
};
24+
}
25+
set {
26+
Entity.SetProperty(PropertyInfo.Name, value, false);
27+
}
28+
}
29+
}

0 commit comments

Comments
 (0)