Extending automatic Workflows CSS discovery with caching (extends #8201) (#8216)

Lombiq Technologies: ORCH-197
This commit is contained in:
Márk Bartha
2019-05-27 18:42:28 +02:00
committed by Benedek Farkas
parent bbb5376594
commit 63b1674d09
3 changed files with 39 additions and 20 deletions

View File

@@ -110,7 +110,6 @@
<Content Include="Scripts\orchard-workflows.js" />
<Content Include="Styles\images\menu.workflows.png" />
<Content Include="Styles\menu.workflows-admin.css" />
<Content Include="Styles\workflows-activity.css" />
<Content Include="Styles\images\cog.png" />
<Content Include="Styles\workflows-activity-delete.css" />
<Content Include="Styles\workflows-activity-timer.css" />

View File

@@ -1,6 +1,8 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Linq;
using Orchard.Caching;
using Orchard.Environment;
using Orchard.Environment.Extensions;
using Orchard.FileSystems.VirtualPath;
@@ -14,16 +16,19 @@ namespace Orchard.Workflows {
private readonly IHostEnvironment _hostEnvironment;
private readonly IExtensionManager _extensionManager;
private readonly IVirtualPathProvider _virtualPathProvider;
private readonly ICacheManager _cacheManager;
public ResourceManifest(
Work<IActivitiesManager> activitiesManager,
IHostEnvironment hostEnvironment,
IExtensionManager extensionManager,
IVirtualPathProvider virtualPathProvider) {
IVirtualPathProvider virtualPathProvider,
ICacheManager cacheManager) {
_activitiesManager = activitiesManager;
_hostEnvironment = hostEnvironment;
_extensionManager = extensionManager;
_virtualPathProvider = virtualPathProvider;
_cacheManager = cacheManager;
}
public void BuildManifests(ResourceManifestBuilder builder) {
@@ -31,28 +36,44 @@ namespace Orchard.Workflows {
manifest.DefineStyle("WorkflowsAdmin").SetUrl("orchard-workflows-admin.css").SetDependencies("~/Themes/TheAdmin/Styles/Site.css");
var resourceNames = new List<string>();
manifest.DefineScript("jsPlumb").SetUrl("jquery.jsPlumb-1.4.1-all-min.js").SetDependencies("jQueryUI");
foreach (var activity in _activitiesManager.Value.GetActivities()) {
var assemblyName = activity.GetType().Assembly.GetName().Name;
var descriptor = _extensionManager.GetExtension(assemblyName);
if (descriptor == null) continue;
var stylesPath = _virtualPathProvider.Combine(descriptor.VirtualPath, "Styles");
var resourceName = "WorkflowsActivity-" + activity.Name;
var filename = resourceName.HtmlClassify() + ".css";
var filePath = _virtualPathProvider.Combine(_hostEnvironment.MapPath(stylesPath), filename);
// Trying to find a matching activity CSS for each activity in the extensions they come from.
var resourceNamesAndPaths = _cacheManager.Get("Orchard.Workflows.ActivityResourceNames", context => {
var resourceNameAndPathList = new List<Tuple<string, string>>();
if (File.Exists(filePath)) {
resourceNames.Add(resourceName);
foreach (var activity in _activitiesManager.Value.GetActivities()) {
var assemblyName = activity.GetType().Assembly.GetName().Name;
var extension = _extensionManager.GetExtension(assemblyName);
if (extension == null) continue;
manifest.DefineStyle(resourceName).SetUrl(filename).SetDependencies("WorkflowsAdmin");
var stylesPath = _virtualPathProvider.Combine(extension.VirtualPath, "Styles");
var resourceName = "WorkflowsActivity-" + activity.Name;
var filename = resourceName.HtmlClassify() + ".css";
var filePath = _virtualPathProvider.Combine(_hostEnvironment.MapPath(stylesPath), filename);
if (File.Exists(filePath)) {
/* Since stylesheets are shapes, we don't need to create the resource with the full path to the CSS file,
* because extensions can override those shapes by file name if they reference Orchard.Workflows,
* even when they don't exist in Orchard.Workflows. */
resourceNameAndPathList.Add(Tuple.Create(resourceName, filename));
}
}
return resourceNameAndPathList;
});
foreach (var resourceNameAndPath in resourceNamesAndPaths) {
manifest
.DefineStyle(resourceNameAndPath.Item1)
.SetUrl(resourceNameAndPath.Item2)
.SetDependencies("WorkflowsAdmin");
}
manifest.DefineStyle("WorkflowsActivities").SetUrl("workflows-activity.css").SetDependencies(resourceNames.ToArray());
manifest.DefineScript("jsPlumb").SetUrl("jquery.jsPlumb-1.4.1-all-min.js").SetDependencies("jQueryUI");
manifest
.DefineStyle("WorkflowsActivities")
.SetDependencies(resourceNamesAndPaths.Select(resourceNameAndPath => resourceNameAndPath.Item1).ToArray());
}
}
}