Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
171f797
Redo `AbpDateTimeModelBinder` to align with the current TZ
gdlcf88 Oct 24, 2025
28d5e65
Fix conditional logic for solution file extension handling
LEIRONGHUA Nov 28, 2025
c7d5fd4
Merge branch 'abpframework:dev' into dev
LEIRONGHUA Nov 28, 2025
fcf835a
Use frozen collections where suitable
MarkCiliaVincenti Dec 8, 2025
9db10bb
Cleaning
MarkCiliaVincenti Dec 9, 2025
94fb4b2
Merge branch 'abpframework:dev' into Frozen
MarkCiliaVincenti Dec 9, 2025
86a69b9
Merge branch 'abpframework:dev' into Frozen
MarkCiliaVincenti Dec 9, 2025
8dcff11
Merge pull request #24510 from abpframework/auto-merge/rel-10-1/4227
maliming Dec 30, 2025
12f4797
Update version for nightly build 10.2.0preview
skoc10 Dec 30, 2025
7771d89
Merge pull request #24511 from abpframework/skoc10-patch-1
MansurBesleney Dec 30, 2025
9a9244c
Merge pull request #24514 from abpframework/auto-merge/rel-10-1/4229
maliming Dec 30, 2025
9f3f25b
Merge pull request #24518 from abpframework/auto-merge/rel-10-1/4231
maliming Dec 30, 2025
f253f99
Improve entity history handling for shared types and JSON
salihozkara Dec 30, 2025
bdd0901
Update framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFram…
salihozkara Dec 30, 2025
d041aeb
Improve JSON navigation property change tracking
salihozkara Dec 30, 2025
fb5dbae
Fix entity type name for shared CLR types
salihozkara Dec 30, 2025
c9a4ab4
Merge pull request #24373 from MarkCiliaVincenti/Frozen
maliming Dec 31, 2025
38a3afd
Merge pull request #24522 from abpframework/auto-merge/rel-10-1/4232
maliming Dec 31, 2025
4d00ee9
Add support and tests for entity history with JSON properties
salihozkara Dec 31, 2025
96a7303
Revert "Add support and tests for entity history with JSON properties"
maliming Dec 31, 2025
6f57ec4
Add audit support for JSON property changes.
maliming Dec 31, 2025
185048f
Merge pull request #24519 from abpframework/salihozkara/improve-entit…
maliming Dec 31, 2025
e67d6ba
Merge pull request #24525 from abpframework/auto-merge/rel-10-1/4233
maliming Jan 2, 2026
8d40a1c
Update post.md
irem1demirci Jan 2, 2026
b5cabd9
Merge pull request #24527 from irem1demirci/patch-8
MansurBesleney Jan 2, 2026
e1359af
Merge pull request #24529 from abpframework/auto-merge/rel-10-1/4235
maliming Jan 2, 2026
9491c46
Merge branch 'rel-10.1' into pr/24049
maliming Jan 3, 2026
275b181
Enhance DateTime handling with timezone support in model binding and …
maliming Jan 3, 2026
d7ae2b9
Merge branch 'dev' into pr/24049
maliming Jan 3, 2026
84cf25f
Refactor DateTime handling to use GetUtcOffset for accurate timezone …
maliming Jan 3, 2026
028362c
Add logging for DateTime conversion failures
maliming Jan 3, 2026
634d805
Merge pull request #24049 from gdlcf88/patch-10
maliming Jan 3, 2026
d3eae63
Merge branch 'abpframework:dev' into dev
LEIRONGHUA Jan 4, 2026
e1640fe
Fix Quartz Cron expression in Excel file cleanup options
LEIRONGHUA Jan 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions common.props
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>10.1.0-preview</Version>
<LeptonXVersion>5.1.0-preview</LeptonXVersion>
<Version>10.2.0-preview</Version>
<LeptonXVersion>5.2.0-preview</LeptonXVersion>
<NoWarn>$(NoWarn);CS1591;CS0436</NoWarn>
<PackageIconUrl>https://abp.io/assets/abp_nupkg.png</PackageIconUrl>
<PackageProjectUrl>https://abp.io/</PackageProjectUrl>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# IMPROVE YOUR ABP SKILLS WITH 33% OFF LIVE TRAININGS!

We have exciting news to share\! As you know, we offer live training packages to help you improve your skills and knowledge of ABP. From September 8th to 19th, we are giving you 33% OFF our live trainings, so you can learn more about the product at a discounted price\!
We have exciting news to share\! As you know, we offer live training packages to help you improve your skills and knowledge of ABP. For a limited time, we are giving you 33% OFF our live trainings, so you can learn more about the product at a discounted price\!

#### Why Join ABP.IO Training?

Expand Down
4 changes: 2 additions & 2 deletions docs/en/modules/audit-logging-pro.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ Configure<ExpiredAuditLogDeleterOptions>(options =>
// The Hangfire Cron expression is different from the Quartz Cron expression, Please refer to the following links:
// https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/crontriggers.html#cron-expressions
// https://docs.hangfire.io/en/latest/background-methods/performing-recurrent-tasks.html
options.ExcelFileCleanupOptions.CronExpression = "0 23 * * *"; // Quartz Cron expression is "0 23 * * * ?"
options.ExcelFileCleanupOptions.CronExpression = "0 23 * * *"; // Quartz Cron expression is "0 0 23 * * ?"
});
```

Expand All @@ -164,7 +164,7 @@ Configure<AuditLogExcelFileOptions>(options =>
// The Hangfire Cron expression is different from the Quartz Cron expression, Please refer to the following links:
// https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/crontriggers.html#cron-expressions
// https://docs.hangfire.io/en/latest/background-methods/performing-recurrent-tasks.html
options.ExcelFileCleanupOptions.CronExpression = "0 23 * * *"; // Quartz Cron expression is "0 23 * * * ?"
options.ExcelFileCleanupOptions.CronExpression = "0 23 * * *"; // Quartz Cron expression is "0 0 23 * * ?"
});
```

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Frozen;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
Expand All @@ -23,7 +24,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker;
public abstract class AbpDatePickerBaseTagHelperService<TTagHelper> : AbpTagHelperService<TTagHelper>
where TTagHelper : AbpDatePickerBaseTagHelper<TTagHelper>
{
protected readonly Dictionary<Type, Func<object, string>> SupportedInputTypes;
protected readonly FrozenDictionary<Type, Func<object, string>> SupportedInputTypes;

protected readonly IJsonSerializer JsonSerializer;
protected readonly IHtmlGenerator Generator;
Expand Down Expand Up @@ -103,7 +104,7 @@ protected AbpDatePickerBaseTagHelperService(IJsonSerializer jsonSerializer, IHtm
return string.Empty;
}
}
};
}.ToFrozenDictionary();
}

protected virtual T? GetAttribute<T>() where T : Attribute
Expand Down Expand Up @@ -136,7 +137,7 @@ public async override Task ProcessAsync(TagHelperContext context, TagHelperOutpu
? await ProcessButtonAndGetContentAsync(context, output, "calendar", "open")
: "";
var clearButtonContent = TagHelper.ClearButton == true || (!TagHelper.ClearButton.HasValue && TagHelper.AutoUpdateInput != true)
? await ProcessButtonAndGetContentAsync(context, output, "times", "clear", visible:!TagHelper.SingleOpenAndClearButton)
? await ProcessButtonAndGetContentAsync(context, output, "times", "clear", visible: !TagHelper.SingleOpenAndClearButton)
: "";

var labelContent = await GetLabelAsHtmlAsync(context, output, TagHelperOutput);
Expand Down Expand Up @@ -269,7 +270,7 @@ protected TagHelperAttributeList ConvertDatePickerOptionsToAttributeList(IAbpDat
{
var attrList = new TagHelperAttributeList();

if(options == null)
if (options == null)
{
return attrList;
}
Expand Down Expand Up @@ -401,29 +402,29 @@ protected TagHelperAttributeList ConvertDatePickerOptionsToAttributeList(IAbpDat
attrList.Add("data-visible-date-format", options.VisibleDateFormat);
}

if(!options.InputDateFormat.IsNullOrEmpty())
if (!options.InputDateFormat.IsNullOrEmpty())
{
attrList.Add("data-input-date-format", options.InputDateFormat);
}

if(options.Ranges != null && options.Ranges.Any())
if (options.Ranges != null && options.Ranges.Any())
{
var ranges = options.Ranges.ToDictionary(r => r.Label, r => r.Dates);

attrList.Add("data-ranges", JsonSerializer.Serialize(ranges));
}

if(options.AlwaysShowCalendars != null)
if (options.AlwaysShowCalendars != null)
{
attrList.Add("data-always-show-calendars", options.AlwaysShowCalendars.ToString()!.ToLowerInvariant());
}

if(options.ShowCustomRangeLabel == false)
if (options.ShowCustomRangeLabel == false)
{
attrList.Add("data-show-custom-range-label", options.ShowCustomRangeLabel.ToString()!.ToLowerInvariant());
}

if(options.Options != null)
if (options.Options != null)
{
attrList.Add("data-options", JsonSerializer.Serialize(options.Options));
}
Expand All @@ -443,7 +444,7 @@ protected TagHelperAttributeList ConvertDatePickerOptionsToAttributeList(IAbpDat
attrList.Add("id", options.PickerId);
}

if(!options.SingleOpenAndClearButton)
if (!options.SingleOpenAndClearButton)
{
attrList.Add("data-single-open-and-clear-button", options.SingleOpenAndClearButton.ToString().ToLowerInvariant());
}
Expand Down Expand Up @@ -614,7 +615,8 @@ protected virtual async Task<string> GetLabelAsHtmlUsingTagHelperAsync(TagHelper
{
return string.Empty;
}
var labelTagHelper = new LabelTagHelper(Generator) {
var labelTagHelper = new LabelTagHelper(Generator)
{
ViewContext = TagHelper.ViewContext,
For = modelExpression
};
Expand Down Expand Up @@ -764,7 +766,8 @@ protected virtual string GetSize(TagHelperContext context, TagHelperOutput outpu
TagHelper.Size = attribute.Size;
}

return TagHelper.Size switch {
return TagHelper.Size switch
{
AbpFormControlSize.Small => "form-control-sm",
AbpFormControlSize.Medium => "form-control-md",
AbpFormControlSize.Large => "form-control-lg",
Expand All @@ -785,14 +788,14 @@ protected virtual Task<string> GetValidationAsHtmlAsync(TagHelperContext context

protected virtual async Task<string> GetValidationAsHtmlByInputAsync(TagHelperContext context,
TagHelperOutput output,
[NotNull]ModelExpression @for)
[NotNull] ModelExpression @for)
{
var validationMessageTagHelper =
new ValidationMessageTagHelper(Generator) { For = @for, ViewContext = TagHelper.ViewContext };

var attributeList = new TagHelperAttributeList { { "class", "text-danger" } };

if(!output.Attributes.TryGetAttribute("name", out var nameAttribute) || nameAttribute == null || nameAttribute.Value == null)
if (!output.Attributes.TryGetAttribute("name", out var nameAttribute) || nameAttribute == null || nameAttribute.Value == null)
{
if (nameAttribute != null)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Frozen;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
Expand All @@ -8,7 +9,8 @@ namespace Volo.Abp.ObjectExtending;

public static class MvcUiObjectExtensionPropertyInfoExtensions
{
private static readonly HashSet<Type> NumberTypes = new HashSet<Type> {
private static readonly FrozenSet<Type> NumberTypes = new HashSet<Type>
{
typeof(int),
typeof(long),
typeof(byte),
Expand All @@ -33,7 +35,7 @@ public static class MvcUiObjectExtensionPropertyInfoExtensions
typeof(float?),
typeof(double?),
typeof(decimal?)
};
}.ToFrozenSet();

public static string? GetInputFormatOrNull(this IBasicObjectExtensionPropertyInfo property)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,57 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
using Microsoft.Extensions.Logging;
using Volo.Abp.Timing;

namespace Volo.Abp.AspNetCore.Mvc.ModelBinding;

public class AbpDateTimeModelBinder : IModelBinder
{
private readonly ILogger<AbpDateTimeModelBinder> _logger;
private readonly DateTimeModelBinder _dateTimeModelBinder;
private readonly IClock _clock;
private readonly ICurrentTimezoneProvider _currentTimezoneProvider;
private readonly ITimezoneProvider _timezoneProvider;

public AbpDateTimeModelBinder(IClock clock, DateTimeModelBinder dateTimeModelBinder)
public AbpDateTimeModelBinder(
ILogger<AbpDateTimeModelBinder> logger,
DateTimeModelBinder dateTimeModelBinder,
IClock clock,
ICurrentTimezoneProvider currentTimezoneProvider,
ITimezoneProvider timezoneProvider)
{
_clock = clock;
_logger = logger;
_dateTimeModelBinder = dateTimeModelBinder;
_clock = clock;
_currentTimezoneProvider = currentTimezoneProvider;
_timezoneProvider = timezoneProvider;
}

public async Task BindModelAsync(ModelBindingContext bindingContext)
{
await _dateTimeModelBinder.BindModelAsync(bindingContext);
if (bindingContext.Result.IsModelSet && bindingContext.Result.Model is DateTime dateTime)

if (!bindingContext.Result.IsModelSet || bindingContext.Result.Model is not DateTime dateTime)
{
bindingContext.Result = ModelBindingResult.Success(_clock.Normalize(dateTime));
return;
}

if (dateTime.Kind == DateTimeKind.Unspecified &&
_clock.SupportsMultipleTimezone &&
!_currentTimezoneProvider.TimeZone.IsNullOrWhiteSpace())
{
try
{
var timezoneInfo = _timezoneProvider.GetTimeZoneInfo(_currentTimezoneProvider.TimeZone);
dateTime = new DateTimeOffset(dateTime, timezoneInfo.GetUtcOffset(dateTime)).UtcDateTime;
}
catch
{
_logger.LogWarning("Could not convert DateTime with unspecified Kind using timezone '{TimeZone}'.", _currentTimezoneProvider.TimeZone);
}
}

bindingContext.Result = ModelBindingResult.Success(_clock.Normalize(dateTime));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,6 @@ protected virtual AbpDateTimeModelBinder CreateAbpDateTimeModelBinder(ModelBinde
{
const DateTimeStyles supportedStyles = DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AdjustToUniversal;
var dateTimeModelBinder = new DateTimeModelBinder(supportedStyles, context.Services.GetRequiredService<ILoggerFactory>());
return new AbpDateTimeModelBinder(context.Services.GetRequiredService<IClock>(), dateTimeModelBinder);
return ActivatorUtilities.CreateInstance<AbpDateTimeModelBinder>(context.Services, dateTimeModelBinder);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ namespace Volo.Abp.BackgroundWorkers.TickerQ;

public class AbpBackgroundWorkersTickerQOptions
{
private readonly Dictionary<Type, AbpBackgroundWorkersCronTickerConfiguration> _onfigurations;
private readonly Dictionary<Type, AbpBackgroundWorkersCronTickerConfiguration> _configurations;

public AbpBackgroundWorkersTickerQOptions()
{
_onfigurations = new Dictionary<Type, AbpBackgroundWorkersCronTickerConfiguration>();
_configurations = new Dictionary<Type, AbpBackgroundWorkersCronTickerConfiguration>();
}

public void AddConfiguration<TWorker>(AbpBackgroundWorkersCronTickerConfiguration configuration)
Expand All @@ -19,7 +19,7 @@ public void AddConfiguration<TWorker>(AbpBackgroundWorkersCronTickerConfiguratio

public void AddConfiguration(Type workerType, AbpBackgroundWorkersCronTickerConfiguration configuration)
{
_onfigurations[workerType] = configuration;
_configurations[workerType] = configuration;
}

public AbpBackgroundWorkersCronTickerConfiguration? GetConfigurationOrNull<TJob>()
Expand All @@ -29,6 +29,6 @@ public void AddConfiguration(Type workerType, AbpBackgroundWorkersCronTickerConf

public AbpBackgroundWorkersCronTickerConfiguration? GetConfigurationOrNull(Type workerType)
{
return _onfigurations.GetValueOrDefault(workerType);
return _configurations.GetValueOrDefault(workerType);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Blazorise;
using System;
using System.Collections.Frozen;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
Expand All @@ -11,7 +12,8 @@ namespace Volo.Abp.BlazoriseUI;

public static class BlazoriseUiObjectExtensionPropertyInfoExtensions
{
private static readonly HashSet<Type> NumberTypes = new HashSet<Type> {
private static readonly FrozenSet<Type> NumberTypes = new HashSet<Type>
{
typeof(int),
typeof(long),
typeof(byte),
Expand All @@ -36,13 +38,14 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions
typeof(float?),
typeof(double?),
typeof(decimal?)
};
}.ToFrozenSet();

private static readonly HashSet<Type> TextEditSupportedAttributeTypes = new HashSet<Type> {
private static readonly FrozenSet<Type> TextEditSupportedAttributeTypes = new HashSet<Type>
{
typeof(EmailAddressAttribute),
typeof(UrlAttribute),
typeof(PhoneAttribute)
};
}.ToFrozenSet();

public static string? GetDateEditInputFormatOrNull(this IBasicObjectExtensionPropertyInfo property)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ public RemoveProjectFromSolutionStep(
{
_solutionFilePathWithoutFileExtension = solutionFilePathWithoutFileExtension.RemovePostFix(".sln");
}

if (solutionFilePathWithoutFileExtension != null && solutionFilePathWithoutFileExtension.EndsWith(".slnx"))
else if (solutionFilePathWithoutFileExtension != null && solutionFilePathWithoutFileExtension.EndsWith(".slnx"))
{
_solutionFilePathWithoutFileExtension = solutionFilePathWithoutFileExtension.RemovePostFix(".slnx");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,12 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NuGet.Versioning;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.LIbs;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
Expand All @@ -28,14 +26,12 @@ public class NpmPackagesUpdater : ITransientDependency

private readonly PackageJsonFileFinder _packageJsonFileFinder;
private readonly NpmGlobalPackagesChecker _npmGlobalPackagesChecker;
private readonly Dictionary<string, string> _fileVersionStorage = new Dictionary<string, string>();
private readonly CliHttpClientFactory _cliHttpClientFactory;
private readonly Dictionary<string, string> _fileVersionStorage = [];

public NpmPackagesUpdater(
PackageJsonFileFinder packageJsonFileFinder,
NpmGlobalPackagesChecker npmGlobalPackagesChecker,
ICancellationTokenProvider cancellationTokenProvider,
CliHttpClientFactory cliHttpClientFactory,
IInstallLibsService installLibsService,
ICmdHelper cmdHelper)
{
Expand All @@ -44,7 +40,6 @@ public NpmPackagesUpdater(
CancellationTokenProvider = cancellationTokenProvider;
InstallLibsService = installLibsService;
CmdHelper = cmdHelper;
_cliHttpClientFactory = cliHttpClientFactory;
Logger = NullLogger<NpmPackagesUpdater>.Instance;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ namespace Volo.Abp.Logging;

public class DefaultInitLoggerFactory : IInitLoggerFactory
{
private readonly Dictionary<Type, object> _cache = new Dictionary<Type, object>();
private readonly Dictionary<Type, object> _cache = [];

public virtual IInitLogger<T> Create<T>()
{
return (IInitLogger<T>)_cache.GetOrAdd(typeof(T), () => new DefaultInitLogger<T>()); ;
return (IInitLogger<T>)_cache.GetOrAdd(typeof(T), () => new DefaultInitLogger<T>());
}
}
Loading