diff --git a/README.md b/README.md index 4ddb43259..eabba2930 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ Check out the [Quickstart guides](https://elsa-workflows.github.io/elsa-core/doc A quick and easy way to give Elsa a spin is to run the following Docker command: ```bash -docker run -t -i -e ELSA__HTTP__BASEURL='http://localhost:13000' -p 13000:80 elsaworkflows/elsa-dashboard-and-server:latest +docker run -t -i -e ELSA__SERVER__BASEURL='http://localhost:13000' -p 13000:80 elsaworkflows/elsa-dashboard-and-server:latest ``` Then navigate to http://localhost:13000. diff --git a/src/activities/Elsa.Activities.Http/Activities/Redirect/Redirect.cs b/src/activities/Elsa.Activities.Http/Activities/Redirect/Redirect.cs index 129ee2262..ff0c9ac2b 100644 --- a/src/activities/Elsa.Activities.Http/Activities/Redirect/Redirect.cs +++ b/src/activities/Elsa.Activities.Http/Activities/Redirect/Redirect.cs @@ -42,7 +42,7 @@ namespace Elsa.Activities.Http if (response.HasStarted) return Fault(T["Response has already started"]!); - return new RedirectResult(_httpContextAccessor, Location, Permanent); + return Combine(new RedirectResult(_httpContextAccessor, Location, Permanent), Done()); } } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Extensions/ElsaOptionBuilderExtensions.cs b/src/core/Elsa.Core/Extensions/ElsaOptionBuilderExtensions.cs index 8afb73553..ec1f3dda1 100644 --- a/src/core/Elsa.Core/Extensions/ElsaOptionBuilderExtensions.cs +++ b/src/core/Elsa.Core/Extensions/ElsaOptionBuilderExtensions.cs @@ -15,6 +15,9 @@ namespace Elsa public static ElsaOptionsBuilder AddFeatures(this ElsaOptionsBuilder builder, IEnumerable assemblies, IConfiguration configuration) { + if (builder.ElsaOptions.FeatureOptions.Features == null!) // Null when configuration binding finds an empty array. + return builder; + var enabledFeatures = builder.ElsaOptions.FeatureOptions.Features.ToHashSet(); var startupTypesQuery = from assembly in assemblies diff --git a/src/designer/elsa-workflows-studio/src/index.html b/src/designer/elsa-workflows-studio/src/index.html index 1d3662fbb..3c7220ea4 100644 --- a/src/designer/elsa-workflows-studio/src/index.html +++ b/src/designer/elsa-workflows-studio/src/index.html @@ -15,6 +15,8 @@ + + @@ -30,11 +32,6 @@ service.register({ onRequest(request) { console.log('onRequest'); - request.headers = { - ...request.headers, - 'X-Client': 'Elsa Dashboard', - Authorization: 'Bearer secret-token' // For example, set a JWT value here. - }; return request; }, diff --git a/src/samples/dashboard/aspnetcore/ElsaDashboard.Samples.AspNetCore.Monolith/HeartbeatWorkflowsFeature.cs b/src/samples/dashboard/aspnetcore/ElsaDashboard.Samples.AspNetCore.Monolith/HeartbeatWorkflowsFeature.cs new file mode 100644 index 000000000..6cfb6fd2d --- /dev/null +++ b/src/samples/dashboard/aspnetcore/ElsaDashboard.Samples.AspNetCore.Monolith/HeartbeatWorkflowsFeature.cs @@ -0,0 +1,17 @@ +using Elsa; +using Elsa.Attributes; +using Elsa.Services.Startup; +using ElsaDashboard.Samples.AspNetCore.Monolith.Workflows; +using Microsoft.Extensions.Configuration; + +namespace ElsaDashboard.Samples.AspNetCore.Monolith +{ + [Feature("Workflows:Heartbeat")] + public class HeartbeatWorkflowsFeature : StartupBase + { + public override void ConfigureElsa(ElsaOptionsBuilder elsa, IConfiguration configuration) + { + elsa.AddWorkflow(); + } + } +} \ No newline at end of file diff --git a/src/samples/dashboard/aspnetcore/ElsaDashboard.Samples.AspNetCore.Monolith/Startup.cs b/src/samples/dashboard/aspnetcore/ElsaDashboard.Samples.AspNetCore.Monolith/Startup.cs index cd0f94ee7..0941b4024 100644 --- a/src/samples/dashboard/aspnetcore/ElsaDashboard.Samples.AspNetCore.Monolith/Startup.cs +++ b/src/samples/dashboard/aspnetcore/ElsaDashboard.Samples.AspNetCore.Monolith/Startup.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using Elsa; using Elsa.Persistence.EntityFramework.Core.Extensions; using Elsa.Persistence.EntityFramework.Sqlite; @@ -22,26 +23,26 @@ namespace ElsaDashboard.Samples.AspNetCore.Monolith public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); - + // Elsa Server. var elsaSection = Configuration.GetSection("Elsa"); - + services .AddElsa(options => options - .UseEntityFrameworkPersistence(ef => ef.UseSqlite()) - .AddConsoleActivities() - .AddHttpActivities(elsaSection.GetSection("Server").Bind) - .AddEmailActivities(elsaSection.GetSection("Smtp").Bind) - .AddQuartzTemporalActivities() - .AddJavaScriptActivities() - .AddActivitiesFrom() - .AddWorkflowsFrom() + .UseEntityFrameworkPersistence(ef => ef.UseSqlite()) + .AddConsoleActivities() + .AddHttpActivities(elsaSection.GetSection("Server").Bind) + .AddEmailActivities(elsaSection.GetSection("Smtp").Bind) + .AddQuartzTemporalActivities() + .AddJavaScriptActivities() + .AddActivitiesFrom() + .AddFeatures(new[] { typeof(Startup) }, Configuration, elsaSection.GetSection("Features").Get>()) ); services .AddElsaSwagger() .AddElsaApiEndpoints(); - + // Allow arbitrary client browser apps to access the API. // In a production environment, make sure to allow only origins you trust. services.AddCors(cors => cors.AddDefaultPolicy(policy => policy.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().WithExposedHeaders("Content-Disposition"))); @@ -72,9 +73,9 @@ namespace ElsaDashboard.Samples.AspNetCore.Monolith { // Elsa Server uses ASP.NET Core Controllers. endpoints.MapControllers(); - + endpoints.MapFallbackToPage("/_Host"); }); } } -} +} \ No newline at end of file diff --git a/src/samples/dashboard/aspnetcore/ElsaDashboard.Samples.AspNetCore.Monolith/appsettings.json b/src/samples/dashboard/aspnetcore/ElsaDashboard.Samples.AspNetCore.Monolith/appsettings.json index bdc4af7a8..2dd150d5b 100644 --- a/src/samples/dashboard/aspnetcore/ElsaDashboard.Samples.AspNetCore.Monolith/appsettings.json +++ b/src/samples/dashboard/aspnetcore/ElsaDashboard.Samples.AspNetCore.Monolith/appsettings.json @@ -8,6 +8,7 @@ }, "AllowedHosts": "*", "Elsa": { + "Features": [], "Server": { "BaseUrl": "https://localhost:15265", "BasePath": "/workflows"