diff --git a/Elsa.sln.DotSettings b/Elsa.sln.DotSettings
index 2850b89bf..12055bae2 100644
--- a/Elsa.sln.DotSettings
+++ b/Elsa.sln.DotSettings
@@ -2,4 +2,5 @@
True
True
True
+ True
True
\ No newline at end of file
diff --git a/src/designer/elsa-workflows-designer/package.json b/src/designer/elsa-workflows-designer/package.json
index 565390623..d82e82166 100644
--- a/src/designer/elsa-workflows-designer/package.json
+++ b/src/designer/elsa-workflows-designer/package.json
@@ -1,6 +1,6 @@
{
"name": "@elsa-workflows/elsa-workflows-designer",
- "version": "3.0.2-preview.43",
+ "version": "3.0.2-preview.44",
"description": "A workflow designer for Elsa 3",
"main": "./dist/index.cjs.js",
"module": "./dist/index.js",
diff --git a/src/designer/elsa-workflows-designer/src/modules/login/components/login-page.tsx b/src/designer/elsa-workflows-designer/src/modules/login/components/login-page.tsx
index c9f72e1a6..96740e08b 100644
--- a/src/designer/elsa-workflows-designer/src/modules/login/components/login-page.tsx
+++ b/src/designer/elsa-workflows-designer/src/modules/login/components/login-page.tsx
@@ -1,7 +1,6 @@
import {Component, h, State, Event, EventEmitter} from "@stencil/core";
import {LoginApi} from "../services";
import {Container} from "typedi";
-import jwt_decode from "jwt-decode";
import {AuthContext} from "../../../services";
import {SignedInArgs} from "../models";
@@ -43,7 +42,7 @@ export class LoginPage {
const accessToken = loginResponse.accessToken;
const refreshToken = loginResponse.refreshToken;
const authContext = Container.get(AuthContext);
- await authContext.signinTokens(accessToken, refreshToken, rememberMe);
+ await authContext.signin(accessToken, refreshToken, rememberMe);
}
private renderError = () => {
diff --git a/src/designer/elsa-workflows-designer/src/modules/login/plugin.tsx b/src/designer/elsa-workflows-designer/src/modules/login/plugin.tsx
index 58621ca6b..e80e31bee 100644
--- a/src/designer/elsa-workflows-designer/src/modules/login/plugin.tsx
+++ b/src/designer/elsa-workflows-designer/src/modules/login/plugin.tsx
@@ -6,7 +6,6 @@ import {Container, Service} from "typedi";
import {StudioService, AuthContext, EventBus, ElsaClient, ElsaClientProvider} from "../../services";
import descriptorsStore from '../../data/descriptors-store';
import {SignedInArgs} from "./models";
-import {AxiosInstance} from "axios";
import {LoginApi} from "./services";
@Service()
@@ -64,14 +63,16 @@ export class LoginPlugin implements Plugin {
},
async onResponseError(error) {
- if (error.response.status !== 401 || error.response.config.hasRetriedRequest)
+
+ if (error.response.status !== 401 || error.response.config.hasRetriedRequest)
return;
const authContext = Container.get(AuthContext);
const loginResponse = await loginApi.refreshAccessToken(authContext.getRefreshToken());
+
if (loginResponse.isAuthenticated) {
-
- await authContext.signinTokens(loginResponse.accessToken, loginResponse.refreshToken, true);
+
+ await authContext.updateTokens(loginResponse.accessToken, loginResponse.refreshToken, true);
const t = await service.http({
...error.config,
@@ -85,7 +86,7 @@ export class LoginPlugin implements Plugin {
return t;
}
else {
- authContext.signOut();
+ await authContext.signOut();
}
}
});
diff --git a/src/designer/elsa-workflows-designer/src/modules/login/services.ts b/src/designer/elsa-workflows-designer/src/modules/login/services.ts
index 8c40a0727..93ae3e8f9 100644
--- a/src/designer/elsa-workflows-designer/src/modules/login/services.ts
+++ b/src/designer/elsa-workflows-designer/src/modules/login/services.ts
@@ -1,9 +1,8 @@
import 'reflect-metadata';
-import {Container, Service} from "typedi";
-import {ElsaClientProvider, EventBus, ServerSettings} from "../../services";
+import {Service} from "typedi";
+import {ElsaClientProvider, ServerSettings} from "../../services";
import {LoginResponse} from "./models";
-import axios, {AxiosError, AxiosRequestConfig} from "axios";
-import {EventTypes} from "../../models";
+import axios, {AxiosRequestConfig} from "axios";
@Service()
export class LoginApi {
@@ -32,4 +31,4 @@ export class LoginApi {
.then(response => response.data)
.catch(error => error.response)
}
-}
\ No newline at end of file
+}
diff --git a/src/designer/elsa-workflows-designer/src/services/auth.ts b/src/designer/elsa-workflows-designer/src/services/auth.ts
index 7703987c5..dd23e3d2d 100644
--- a/src/designer/elsa-workflows-designer/src/services/auth.ts
+++ b/src/designer/elsa-workflows-designer/src/services/auth.ts
@@ -29,14 +29,19 @@ export class AuthContext {
}
}
- async signinTokens(accessToken: string, refreshToken: string, createPersistentCookie: boolean){
+ async signin(accessToken: string, refreshToken: string, createPersistentCookie: boolean){
+ await this.updateTokens(accessToken, refreshToken, createPersistentCookie);
+ await this.eventBus.emit(EventTypes.Auth.SignedIn)
+ }
+
+ async updateTokens(accessToken: string, refreshToken: string, createPersistentCookie: boolean){
const claims = jwt_decode(accessToken);
const permissions = claims.permissions || [];
const name = claims.name || '';
- await this.signIn(name, permissions, accessToken, refreshToken, createPersistentCookie);
+ await this.updateSession(name, permissions, accessToken, refreshToken, createPersistentCookie);
}
- async signIn(name: string, permissions: Array, accessToken: string, refreshToken: string, createPersistentCookie: boolean) {
+ updateSession(name: string, permissions: Array, accessToken: string, refreshToken: string, createPersistentCookie: boolean) {
authStore.name = name;
authStore.permissions = permissions;
authStore.signedIn = true;
@@ -49,8 +54,6 @@ export class AuthContext {
if (createPersistentCookie) {
cookies.set("dashboard-session", data);
}
-
- await this.eventBus.emit(EventTypes.Auth.SignedIn)
}
async signOut() {
diff --git a/src/modules/Elsa.Expressions/Models/JsonLiteral.cs b/src/modules/Elsa.Expressions/Models/JsonLiteral.cs
index e38cf5836..60b5e0979 100644
--- a/src/modules/Elsa.Expressions/Models/JsonLiteral.cs
+++ b/src/modules/Elsa.Expressions/Models/JsonLiteral.cs
@@ -1,30 +1,53 @@
using System.Text.Json;
+using System.Text.Json.Serialization;
namespace Elsa.Expressions.Models;
+///
+/// Represents a literal JSON expression.
+///
public class JsonLiteral : MemoryBlockReference
{
+ ///
+ [JsonConstructor]
public JsonLiteral()
{
}
+ ///
public JsonLiteral(string? value)
{
Value = value;
}
+ ///
+ /// The literal JSON string value.
+ ///
public string? Value { get; }
+
+ ///
public override MemoryBlock Declare() => new();
+ ///
+ /// Serializes the value into a JSON string in the form of a
+ ///
+ ///
+ ///
+ ///
public static JsonLiteral From(T value) => new JsonLiteral(value);
}
+///
+/// Represents a JSON string for the specified type T
+///
public class JsonLiteral : JsonLiteral
{
+ ///
public JsonLiteral()
{
}
+ ///
public JsonLiteral(T value) : base(JsonSerializer.Serialize(value!))
{
}
diff --git a/src/modules/Elsa.JavaScript/Implementations/TypeDescriber.cs b/src/modules/Elsa.JavaScript/Implementations/TypeDescriber.cs
index 88d5f98aa..de6e0d845 100644
--- a/src/modules/Elsa.JavaScript/Implementations/TypeDescriber.cs
+++ b/src/modules/Elsa.JavaScript/Implementations/TypeDescriber.cs
@@ -26,8 +26,8 @@ public class TypeDescriber : ITypeDescriber
{
DeclarationKeyword = GetDeclarationKeyword(type),
Name = type.Name,
- Properties = GetPropertyDefinitions(type).ToList(),
- Methods = GetMethodDefinitions(type).ToList()
+ Properties = GetPropertyDefinitions(type).DistinctBy(x => x.Name).ToList(),
+ Methods = GetMethodDefinitions(type).DistinctBy(x => x.Name).ToList()
};
return typeDefinition;
diff --git a/src/modules/Elsa.JavaScript/Providers/VariableTypeDefinitionProvider.cs b/src/modules/Elsa.JavaScript/Providers/VariableTypeDefinitionProvider.cs
index 88af27577..d6b34973c 100644
--- a/src/modules/Elsa.JavaScript/Providers/VariableTypeDefinitionProvider.cs
+++ b/src/modules/Elsa.JavaScript/Providers/VariableTypeDefinitionProvider.cs
@@ -20,16 +20,21 @@ internal class VariableTypeDefinitionProvider : TypeDefinitionProvider
protected override IEnumerable GetTypeDefinitions(TypeDefinitionContext context)
{
- var excludedTypes = new[] { typeof(ExpandoObject), typeof(IDictionary) };
+ var excludedTypes = new Func[]
+ {
+ type => type == typeof(ExpandoObject),
+ type => typeof(IDictionary).IsAssignableFrom(type),
+ type => type == typeof(object)
+ };
var variableTypeQuery =
from variable in context.Variables
let variableType = variable.GetVariableType()
- where (variableType.IsClass || variableType.IsInterface) && !variableType.IsPrimitive && !excludedTypes.Any(x => x.IsAssignableFrom(variableType))
+ where (variableType.IsClass || variableType.IsInterface) && !variableType.IsPrimitive && !excludedTypes.Any(x => x(variableType))
select variableType;
var variableTypes = variableTypeQuery.Distinct();
-
+
foreach (var variableType in variableTypes)
{
yield return _typeDescriber.DescribeType(variableType);
diff --git a/src/modules/Elsa.Workflows.Core/Models/Input.cs b/src/modules/Elsa.Workflows.Core/Models/Input.cs
index 03c0ea727..720d1566d 100644
--- a/src/modules/Elsa.Workflows.Core/Models/Input.cs
+++ b/src/modules/Elsa.Workflows.Core/Models/Input.cs
@@ -6,8 +6,12 @@ using Elsa.Workflows.Core.Expressions;
namespace Elsa.Workflows.Core.Models;
+///
+/// A base type for the type.
+///
public abstract class Input : Argument
{
+ ///
protected Input(IExpression expression, MemoryBlockReference memoryBlockReference, Type type) : base(memoryBlockReference)
{
Expression = expression;
@@ -19,60 +23,77 @@ public abstract class Input : Argument
[JsonPropertyName("typeName")] public Type Type { get; set; }
}
+///
+/// Represents activity input that is evaluated at runtime.
+///
public class Input : Input
{
+ ///
public Input(T literal, string? id = default) : this(new Literal(literal) { Id = id! })
{
}
+ ///
public Input(Func @delegate, string? id = default) : this(new DelegateBlockReference(() => @delegate()){ Id = id!})
{
}
+ ///
public Input(Func> @delegate) : this(new DelegateBlockReference(@delegate))
{
}
+ ///
public Input(Func> @delegate) : this(new DelegateBlockReference(@delegate))
{
}
+ ///
public Input(Func @delegate) : this(new DelegateBlockReference(@delegate))
{
}
+ ///
public Input(Variable variable) : base(new VariableExpression(variable), variable, typeof(T))
{
}
+ ///
public Input(Output output) : base(new OutputExpression(output), output.MemoryBlockReference(), typeof(T))
{
}
+ ///
public Input(Literal literal) : base(new LiteralExpression(literal.Value), literal, typeof(T))
{
}
+ ///
public Input(Literal literal) : base(new LiteralExpression(literal.Value), literal, typeof(T))
{
}
+ ///
public Input(JsonLiteral literal) : base(new JsonExpression(literal.Value), literal, typeof(T))
{
}
+ ///
public Input(JsonLiteral literal) : base(new JsonExpression(literal.Value), literal, typeof(T))
{
}
+ ///
public Input(DelegateBlockReference delegateBlockReference) : base(new DelegateExpression(delegateBlockReference), delegateBlockReference, typeof(T))
{
}
+ ///
public Input(ElsaExpression expression) : this(new ElsaExpressionBlockReference(expression))
{
}
+ ///
public Input(IExpression expression, MemoryBlockReference memoryBlockReference) : base(expression, memoryBlockReference, typeof(T))
{
}
diff --git a/src/modules/Elsa.Workflows.Core/Models/JsonObject.cs b/src/modules/Elsa.Workflows.Core/Models/JsonObject.cs
deleted file mode 100644
index 3309d895a..000000000
--- a/src/modules/Elsa.Workflows.Core/Models/JsonObject.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using Elsa.Expressions.Models;
-
-namespace Elsa.Workflows.Core.Models;
-
-public class JsonObject : MemoryBlockReference
-{
- public JsonObject()
- {
- }
-
- public JsonObject(string? defaultValue)
- {
- DefaultValue = defaultValue;
- }
-
- public string? Name { get; set; }
- public string? DefaultValue { get; }
- public override MemoryBlock Declare() => new(DefaultValue);
-}
\ No newline at end of file
diff --git a/src/modules/Elsa.Workflows.Designer/package-lock.json b/src/modules/Elsa.Workflows.Designer/package-lock.json
index 13b5d29f1..d86745707 100644
--- a/src/modules/Elsa.Workflows.Designer/package-lock.json
+++ b/src/modules/Elsa.Workflows.Designer/package-lock.json
@@ -5,7 +5,7 @@
"packages": {
"": {
"devDependencies": {
- "@elsa-workflows/elsa-workflows-designer": "^3.0.2-preview.43",
+ "@elsa-workflows/elsa-workflows-designer": "^3.0.2-preview.44",
"copy-webpack-plugin": "^11.0.0",
"cross-env": "^7.0.3",
"monaco-editor": "^0.34.1",
@@ -115,9 +115,9 @@
}
},
"node_modules/@elsa-workflows/elsa-workflows-designer": {
- "version": "3.0.2-preview.43",
- "resolved": "https://registry.npmjs.org/@elsa-workflows/elsa-workflows-designer/-/elsa-workflows-designer-3.0.2-preview.43.tgz",
- "integrity": "sha512-9W7trl8k3yf9HSXHyyO514YENp2K8YvqChZw8U6sq4nD3iEd0DPEQ90HnDiLi7Dum4oAJZ42LM/m6ekKi0Ob7Q==",
+ "version": "3.0.2-preview.44",
+ "resolved": "https://registry.npmjs.org/@elsa-workflows/elsa-workflows-designer/-/elsa-workflows-designer-3.0.2-preview.44.tgz",
+ "integrity": "sha512-+mygygHGoJzCX4jWPgXYGjQh8yhb4tOAGbKuxTOKQNNtn+diBRgwY+MG33zQXRIVlyBun8OQv0T16i3Nun5s5g==",
"dev": true,
"dependencies": {
"@antv/layout": "^0.3.11",
@@ -2425,9 +2425,9 @@
"dev": true
},
"@elsa-workflows/elsa-workflows-designer": {
- "version": "3.0.2-preview.43",
- "resolved": "https://registry.npmjs.org/@elsa-workflows/elsa-workflows-designer/-/elsa-workflows-designer-3.0.2-preview.43.tgz",
- "integrity": "sha512-9W7trl8k3yf9HSXHyyO514YENp2K8YvqChZw8U6sq4nD3iEd0DPEQ90HnDiLi7Dum4oAJZ42LM/m6ekKi0Ob7Q==",
+ "version": "3.0.2-preview.44",
+ "resolved": "https://registry.npmjs.org/@elsa-workflows/elsa-workflows-designer/-/elsa-workflows-designer-3.0.2-preview.44.tgz",
+ "integrity": "sha512-+mygygHGoJzCX4jWPgXYGjQh8yhb4tOAGbKuxTOKQNNtn+diBRgwY+MG33zQXRIVlyBun8OQv0T16i3Nun5s5g==",
"dev": true,
"requires": {
"@antv/layout": "^0.3.11",
diff --git a/src/modules/Elsa.Workflows.Designer/package.json b/src/modules/Elsa.Workflows.Designer/package.json
index f53e75c40..221e7cd98 100644
--- a/src/modules/Elsa.Workflows.Designer/package.json
+++ b/src/modules/Elsa.Workflows.Designer/package.json
@@ -6,7 +6,7 @@
"build:debug": "cross-env webpack --mode=development --env configuration=Debug"
},
"devDependencies": {
- "@elsa-workflows/elsa-workflows-designer": "^3.0.2-preview.43",
+ "@elsa-workflows/elsa-workflows-designer": "^3.0.2-preview.44",
"copy-webpack-plugin": "^11.0.0",
"cross-env": "^7.0.3",
"monaco-editor": "^0.34.1",
diff --git a/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionSyntaxProvider.cs b/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionSyntaxProvider.cs
index 911f36392..f2f819105 100644
--- a/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionSyntaxProvider.cs
+++ b/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionSyntaxProvider.cs
@@ -34,7 +34,7 @@ public class DefaultExpressionSyntaxProvider : IExpressionSyntaxProvider
private ExpressionSyntaxDescriptor CreateJsonDescriptor() => CreateDescriptor(
"Json",
CreateJsonExpression,
- context => new JsonObject(context.GetExpression().Value),
+ context => new JsonLiteral(context.GetExpression().Value),
expression => expression.Value);
private ExpressionSyntaxDescriptor CreateDelegateDescriptor() => CreateDescriptor(