Merge remote-tracking branch 'refs/remotes/origin/contrib' into v14/dev

# Conflicts:
#	tests/Umbraco.Tests.AcceptanceTest/package-lock.json
This commit is contained in:
Bjarke Berg
2024-09-18 11:05:15 +02:00
88 changed files with 503 additions and 338 deletions

View File

@@ -126,7 +126,7 @@ public static class UmbracoBuilderDependencyInjectionExtensions
builder.AddNotificationHandler<UmbracoRequestEndNotification, AutoModelsNotificationHandler>();
builder.AddNotificationHandler<ContentTypeCacheRefresherNotification, AutoModelsNotificationHandler>();
builder.AddNotificationHandler<DataTypeCacheRefresherNotification, AutoModelsNotificationHandler>();
builder.AddNotificationHandler<ContentTypeCacheRefresherNotification, OutOfDateModelsStatus>();
builder.AddNotificationHandler<DataTypeCacheRefresherNotification, OutOfDateModelsStatus>();
}
@@ -135,7 +135,7 @@ public static class UmbracoBuilderDependencyInjectionExtensions
// Register required services for ModelsBuilderDashboardController
builder.Services.AddSingleton<IModelsGenerator, ModelsGenerator>();
// TODO: Remove in v13 - this is only here in case someone is already using this generator directly
builder.Services.AddSingleton<ModelsGenerator>();
builder.Services.AddSingleton<OutOfDateModelsStatus>();
@@ -165,7 +165,7 @@ public static class UmbracoBuilderDependencyInjectionExtensions
// This is what the community MB would replace, all of the above services are fine to be registered
builder.Services.AddSingleton<IPublishedModelFactory>(factory => factory.CreateDefaultPublishedModelFactory());
return builder;
}
}

View File

@@ -165,7 +165,8 @@ public abstract class UmbracoSignInManager<TUser> : SignInManager<TUser>
public override async Task<SignInResult> PasswordSignInAsync(string userName, string password, bool isPersistent, bool lockoutOnFailure)
{
// override to handle logging/events
TUser? user = await UserManager.FindByNameAsync(userName);
string strippedUsername = userName.Trim();
TUser? user = await UserManager.FindByNameAsync(strippedUsername);
if (user == null)
{
return await HandleSignIn(null, userName, SignInResult.Failed);

View File

@@ -5,7 +5,10 @@
<Description>Contains the web assembly needed to run Umbraco CMS.</Description>
<RootNamespace>Umbraco.Cms.Web.Common</RootNamespace>
</PropertyGroup>
<PropertyGroup>
<!-- TODO: Fix all warnings and remove this override -->
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

View File

@@ -4,6 +4,7 @@ using Umbraco.Cms.Core.Dictionary;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.Strings;
using Umbraco.Cms.Core.Templates;
using Umbraco.Extensions;
namespace Umbraco.Cms.Web.Common;
@@ -18,7 +19,7 @@ public class UmbracoHelper
private readonly IUmbracoComponentRenderer _componentRenderer;
private readonly ICultureDictionaryFactory _cultureDictionaryFactory;
private readonly IPublishedContentQuery _publishedContentQuery;
private ICultureDictionary? _cultureDictionary;
private readonly Dictionary<CultureInfo, ICultureDictionary> _cultureDictionaries = [];
private IPublishedContent? _currentPage;
@@ -103,29 +104,29 @@ public class UmbracoHelper
/// <summary>
/// Returns the dictionary value for the key specified
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public string? GetDictionaryValue(string key) => CultureDictionary[key];
/// <param name="key">Key of dictionary item.</param>
/// <returns>The dictionary value, should one exist.</returns>
public string? GetDictionaryValue(string key) => GetDictionaryValue(key, Thread.CurrentThread.CurrentUICulture);
/// <summary>
/// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value
/// </summary>
/// <param name="key">key of dictionary item</param>
/// <param name="key">Key of dictionary item.</param>
/// <param name="specificCulture">the specific culture on which the result well be back upon</param>
/// <returns></returns>
/// <returns>The dictionary value, should one exist.</returns>
public string? GetDictionaryValue(string key, CultureInfo specificCulture)
{
_cultureDictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture);
return GetDictionaryValue(key);
ICultureDictionary cultureDictionary = GetCultureDictionary(specificCulture);
return cultureDictionary[key];
}
/// <summary>
/// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value
/// </summary>
/// <param name="key">key of dictionary item</param>
/// <param name="defaultValue">fall back text if dictionary item is empty - Name altText to match Umbraco.Field</param>
/// <returns></returns>
/// <param name="key">key of dictionary item.</param>
/// <param name="defaultValue">fall back text if dictionary item is empty - Name altText to match Umbraco.Field.</param>
/// <returns>Returns the dictionary value, or a default value if none exists.</returns>
public string GetDictionaryValueOrDefault(string key, string defaultValue)
{
var dictionaryValue = GetDictionaryValue(key);
@@ -140,26 +141,51 @@ public class UmbracoHelper
/// <summary>
/// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value
/// </summary>
/// <param name="key">key of dictionary item</param>
/// <param name="specificCulture">the specific culture on which the result well be back upon</param>
/// <param name="defaultValue">fall back text if dictionary item is empty - Name altText to match Umbraco.Field</param>
/// <returns></returns>
/// <param name="key">Key of dictionary item.</param>
/// <param name="specificCulture">The specific culture on which the result well be back upon.</param>
/// <param name="defaultValue">Fall back text if dictionary item is empty - Name altText to match Umbraco.Field.</param>
/// <returns>Returns the dictionary value, or a default value if none exists.</returns>
public string GetDictionaryValueOrDefault(string key, CultureInfo specificCulture, string defaultValue)
{
_cultureDictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture);
var dictionaryValue = GetDictionaryValue(key);
var dictionaryValue = GetDictionaryValue(key, specificCulture);
if (string.IsNullOrWhiteSpace(dictionaryValue))
{
dictionaryValue = defaultValue;
}
return dictionaryValue;
}
/// <summary>
/// Gets the ICultureDictionary for the current UI Culture for access to dictionary items
/// </summary>
public ICultureDictionary CultureDictionary => GetCultureDictionary(Thread.CurrentThread.CurrentUICulture);
/// <summary>
/// Returns the ICultureDictionary for access to dictionary items
/// Gets the ICultureDictionary for access to dictionary items for a specific culture
/// </summary>
public ICultureDictionary CultureDictionary => _cultureDictionary ??= _cultureDictionaryFactory.CreateDictionary();
/// <param name="specificCulture">The culture of the culture dictionary you want to retrieve.</param>
/// <returns>Returns the culture dictionary for the specified culture.</returns>
public ICultureDictionary GetCultureDictionary(CultureInfo specificCulture)
{
CreateCultureDictionary(specificCulture);
return _cultureDictionaries.GetValue(specificCulture)!;
}
/// <summary>
/// Creates a culture dictionary for a specific culture if it doesn't already exist
/// </summary>
/// <param name="specificCulture">The culture to create a culture dictionary for.</param>
internal void CreateCultureDictionary(CultureInfo specificCulture)
{
if (_cultureDictionaries.ContainsKey(specificCulture))
{
return;
}
ICultureDictionary dictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture);
_cultureDictionaries.Add(specificCulture, dictionary);
}
#endregion