diff --git a/Framework b/Framework
index c91df94a..645921df 160000
--- a/Framework
+++ b/Framework
@@ -1 +1 @@
-Subproject commit c91df94a76741cb6389e0f1ce811ebe5d7fbfd89
+Subproject commit 645921df115ca83f1ff0d29e2f2890b1bd8f21d8
diff --git a/Modules.xml b/Modules.xml
index ac5ddb2c..3f33364d 100644
--- a/Modules.xml
+++ b/Modules.xml
@@ -387,7 +387,7 @@
-
+
@@ -397,11 +397,23 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Southwind.Logic/Starter.cs b/Southwind.Logic/Starter.cs
index 349ab43c..ac973cc6 100644
--- a/Southwind.Logic/Starter.cs
+++ b/Southwind.Logic/Starter.cs
@@ -52,6 +52,7 @@
using Signum.Engine.Omnibox;
using Signum.Engine.MachineLearning.TensorFlow;
using Azure.Storage.Blobs;
+using Signum.Engine.ConcurrentUser;
namespace Southwind.Logic;
@@ -194,6 +195,8 @@ public static void Start(string connectionString, bool isPostgres, string? azure
heavyProfiler: true,
overrideSessionTimeout: true);
+ ConcurrentUserLogic.Start(sb);
+
// Southwind modules
EmployeeLogic.Start(sb);
diff --git a/Southwind.React/App/MainAdmin.tsx b/Southwind.React/App/MainAdmin.tsx
index 0447ad80..53eb9dd3 100644
--- a/Southwind.React/App/MainAdmin.tsx
+++ b/Southwind.React/App/MainAdmin.tsx
@@ -27,6 +27,7 @@ import * as WorkflowClient from "@extensions/Workflow/WorkflowClient"
import * as PredictorClient from "@extensions/MachineLearning/PredictorClient"
import * as RestClient from "@extensions/Rest/RestClient"
import * as AlertsClient from "@extensions/Alerts/AlertsClient"
+import * as ConcurrentUserClient from "@extensions/ConcurrentUser/ConcurrentUserClient"
import * as ToolbarClient from "@extensions/Toolbar/ToolbarClient"
import QueryToolbarConfig from "@extensions/Toolbar/QueryToolbarConfig"
@@ -92,6 +93,7 @@ export function startFull(routes: JSX.Element[]) {
);
RestClient.start({ routes });
AlertsClient.start({ routes });
+ ConcurrentUserClient.start({ routes });
/* LightDynamic
DynamicClient.start({ routes, withCodeGen: false });
diff --git a/Southwind.React/Startup.cs b/Southwind.React/Startup.cs
index d6938f89..9e3e59c5 100644
--- a/Southwind.React/Startup.cs
+++ b/Southwind.React/Startup.cs
@@ -54,6 +54,7 @@
using Signum.Engine.Rest;
using Southwind.Entities.Public;
using Signum.React.Alerts;
+using Signum.React.ConcurrentUser;
namespace Southwind.React;
@@ -225,6 +226,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApp
app.UseEndpoints(endpoints =>
{
AlertsServer.MapAlertsHub(endpoints);
+ ConcurrentUserServer.MapConcurrentUserHub(endpoints);
endpoints.MapControllers();
endpoints.MapControllerRoute(
name: "spa-fallback",
@@ -304,6 +306,7 @@ public static void WebStart(IApplicationBuilder app, IWebHostEnvironment env, IH
RestLogServer.Start(app);
PredictorServer.Start(app);
WorkflowServer.Start(app);
+ ConcurrentUserServer.Start(app);
AlertsServer.Start(app);
DynamicServer.Start(app);
diff --git a/Southwind.React/Views/Home/Index.cshtml b/Southwind.React/Views/Home/Index.cshtml
index d1f235af..6b8bf585 100644
--- a/Southwind.React/Views/Home/Index.cshtml
+++ b/Southwind.React/Views/Home/Index.cshtml
@@ -230,6 +230,7 @@
var __serverName = @Json.Serialize(Configuration.GetValue("ServerName", "none"));
var __azureApplicationId = @Json.Serialize(Starter.Configuration.Value.ActiveDirectory.Azure_ApplicationID);
var __azureTenantId = @Json.Serialize(Starter.Configuration.Value.ActiveDirectory.Azure_DirectoryID);
+ var __disableSignalR = @Json.Serialize(Signum.React.ConcurrentUser.ConcurrentUserServer.DisableSignalR);