Added support for virtual backoffice icons (#12833)

This commit is contained in:
Anders Bjerner
2022-09-09 12:50:21 +02:00
committed by GitHub
parent 4df012e8e9
commit 902f126e6b

View File

@@ -136,6 +136,9 @@ public class IconService : IIconService
}
}
// Get icons from the web root file provider (both physical and virtual)
icons.UnionWith(GetIconsFiles(_webHostEnvironment.WebRootFileProvider, Constants.SystemDirectories.AppPlugins));
IDirectoryContents? iconFolder =
_webHostEnvironment.WebRootFileProvider.GetDirectoryContents(_globalSettings.IconsPath);
@@ -148,6 +151,63 @@ public class IconService : IIconService
return icons;
}
/// <summary>
/// Finds all SVG icon files based on the specified <paramref name="fileProvider"/> and <paramref name="path"/>.
/// The method will find both physical and virtual (eg. from a Razor Class Library) icons.
/// </summary>
/// <param name="fileProvider">The file provider to be used.</param>
/// <param name="path">The sub path to start from - should probably always be <see cref="Constants.SystemDirectories.AppPlugins"/>.</param>
/// <returns>A collection of <see cref="FileInfo"/> representing the found SVG icon files.</returns>
private static IEnumerable<FileInfo> GetIconsFiles(IFileProvider fileProvider, string path)
{
// Iterate through all plugin folders, this is necessary because on Linux we'll get casing issues when
// we directly try to access {path}/{pluginDirectory.Name}/{Constants.SystemDirectories.PluginIcons}
foreach (IFileInfo pluginDirectory in fileProvider.GetDirectoryContents(path))
{
// Ideally there shouldn't be any files, but we'd better check to be sure
if (!pluginDirectory.IsDirectory)
{
continue;
}
// Iterate through the sub directories of each plugin folder
foreach (IFileInfo subDir1 in fileProvider.GetDirectoryContents($"{path}/{pluginDirectory.Name}"))
{
// Skip files again
if (!subDir1.IsDirectory)
{
continue;
}
// Iterate through second level sub directories
foreach (IFileInfo subDir2 in fileProvider.GetDirectoryContents($"{path}/{pluginDirectory.Name}/{subDir1.Name}"))
{
// Skip files again
if (!subDir2.IsDirectory)
{
continue;
}
// Does the directory match the plugin icons folder? (case insensitive for legacy support)
if (!$"/{subDir1.Name}/{subDir2.Name}".InvariantEquals(Constants.SystemDirectories.PluginIcons))
{
continue;
}
// Iterate though the files of the second level sub directory. This should be where the SVG files are located :D
foreach (IFileInfo file in fileProvider.GetDirectoryContents($"{path}/{pluginDirectory.Name}/{subDir1.Name}/{subDir2.Name}"))
{
if (file.Name.InvariantEndsWith(".svg"))
{
yield return new FileInfo(file.PhysicalPath);
}
}
}
}
}
}
private IReadOnlyDictionary<string, string>? GetIconDictionary() => _cache.GetCacheItem(
$"{typeof(IconService).FullName}.{nameof(GetIconDictionary)}",
() => GetAllIconsFiles()