- Version:
+ Version:
diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Add.razor b/Oqtane.Client/Modules/Admin/UserProfile/Add.razor
index dcc96ff4..48959e80 100644
--- a/Oqtane.Client/Modules/Admin/UserProfile/Add.razor
+++ b/Oqtane.Client/Modules/Admin/UserProfile/Add.razor
@@ -55,7 +55,7 @@
{
var notification = new Notification(PageState.Site.SiteId, PageState.User, user, subject, body, null);
notification = await NotificationService.AddNotificationAsync(notification);
- await logger.LogInformation("Notification Created {Notification}", notification);
+ await logger.LogInformation("Notification Created {NotificationId}", notification.NotificationId);
NavigationManager.NavigateTo(NavigateUrl());
}
else
diff --git a/Oqtane.Client/Modules/Admin/UserProfile/View.razor b/Oqtane.Client/Modules/Admin/UserProfile/View.razor
index ff9f3937..263a0345 100644
--- a/Oqtane.Client/Modules/Admin/UserProfile/View.razor
+++ b/Oqtane.Client/Modules/Admin/UserProfile/View.razor
@@ -183,7 +183,7 @@
{
var notification = new Notification(PageState.Site.SiteId, PageState.User, user, subject, body, notificationid);
notification = await NotificationService.AddNotificationAsync(notification);
- await logger.LogInformation("Notification Created {Notification}", notification);
+ await logger.LogInformation("Notification Created {NotificationId}", notification.NotificationId);
NavigationManager.NavigateTo(NavigateUrl());
}
else
diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor
index 6b42f15b..70bda7df 100644
--- a/Oqtane.Client/UI/SiteRouter.razor
+++ b/Oqtane.Client/UI/SiteRouter.razor
@@ -80,7 +80,7 @@
var urlparameters = string.Empty;
var editmode = false;
var reload = Reload.None;
- var lastsyncdate = DateTime.UtcNow;
+ var lastsyncdate = DateTime.UtcNow.AddHours(-1);
var runtime = GetRuntime();
Uri uri = new Uri(_absoluteUri);
@@ -107,9 +107,14 @@
SiteState.Alias = alias; // set state for services
lastsyncdate = alias.SyncDate;
- // process any sync events for site
+ // process any sync events
if (reload != Reload.Site && alias.SyncEvents.Any())
{
+ // if running on WebAssembly reload the client application if the server application was restarted
+ if (runtime == Shared.Runtime.WebAssembly && PageState != null && alias.SyncEvents.Exists(item => item.TenantId == -1))
+ {
+ NavigationManager.NavigateTo(_absoluteUri + (!_absoluteUri.Contains("?") ? "?" : "&") + "reload", true);
+ }
if (alias.SyncEvents.Exists(item => item.EntityName == EntityNames.Site && item.EntityId == alias.SiteId))
{
reload = Reload.Site;
diff --git a/Oqtane.Server/Controllers/InstallationController.cs b/Oqtane.Server/Controllers/InstallationController.cs
index 01de103b..2d8491d6 100644
--- a/Oqtane.Server/Controllers/InstallationController.cs
+++ b/Oqtane.Server/Controllers/InstallationController.cs
@@ -55,8 +55,7 @@ namespace Oqtane.Controllers
[HttpGet("installed")]
public Installation IsInstalled()
{
- bool isInstalled = _databaseManager.IsInstalled();
- return new Installation {Success = isInstalled, Message = string.Empty};
+ return _databaseManager.IsInstalled();
}
[HttpGet("upgrade")]
diff --git a/Oqtane.Server/Controllers/NotificationController.cs b/Oqtane.Server/Controllers/NotificationController.cs
index 5c73eb78..8fbb4872 100644
--- a/Oqtane.Server/Controllers/NotificationController.cs
+++ b/Oqtane.Server/Controllers/NotificationController.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Oqtane.Enums;
@@ -65,7 +65,7 @@ namespace Oqtane.Controllers
if (IsAuthorized(notification.FromUserId))
{
notification = _notifications.AddNotification(notification);
- _logger.Log(LogLevel.Information, this, LogFunction.Create, "Notification Added {Notification}", notification);
+ _logger.Log(LogLevel.Information, this, LogFunction.Create, "Notification Added {NotificationId}", notification.NotificationId);
}
return notification;
}
@@ -78,7 +78,7 @@ namespace Oqtane.Controllers
if (IsAuthorized(notification.FromUserId))
{
notification = _notifications.UpdateNotification(notification);
- _logger.Log(LogLevel.Information, this, LogFunction.Update, "Notification Updated {Folder}", notification);
+ _logger.Log(LogLevel.Information, this, LogFunction.Update, "Notification Updated {NotificationId}", notification.NotificationId);
}
return notification;
}
diff --git a/Oqtane.Server/Infrastructure/DatabaseManager.cs b/Oqtane.Server/Infrastructure/DatabaseManager.cs
index 308b5cf0..9ee98e25 100644
--- a/Oqtane.Server/Infrastructure/DatabaseManager.cs
+++ b/Oqtane.Server/Infrastructure/DatabaseManager.cs
@@ -33,27 +33,30 @@ namespace Oqtane.Infrastructure
_cache = cache;
}
- public bool IsInstalled()
+ public Installation IsInstalled()
{
- var defaultConnectionString = NormalizeConnectionString(_config.GetConnectionString(SettingKeys.ConnectionStringKey));
- var result = !string.IsNullOrEmpty(defaultConnectionString);
- if (result)
+ var result = new Installation { Success = false, Message = string.Empty };
+ if (!string.IsNullOrEmpty(_config.GetConnectionString(SettingKeys.ConnectionStringKey)))
{
+ result.Success = true;
using (var scope = _serviceScopeFactory.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService();
- result = db.Database.CanConnect();
- if (result)
+ if (db.Database.CanConnect())
{
try
{
- result = db.Tenant.Any();
+ var provisioned = db.Tenant.Any();
}
catch
{
- result = false;
+ result.Message = "Master Database Not Installed Correctly";
}
}
+ else
+ {
+ result.Message = "Cannot Connect To Master Database";
+ }
}
}
return result;
@@ -74,7 +77,8 @@ namespace Oqtane.Infrastructure
// startup or silent installation
install = new InstallConfig { ConnectionString = _config.GetConnectionString(SettingKeys.ConnectionStringKey), TenantName = TenantNames.Master, IsNewTenant = false };
- if (!IsInstalled())
+ var installation = IsInstalled();
+ if (!installation.Success)
{
install.Aliases = GetInstallationConfig(SettingKeys.DefaultAliasKey, string.Empty);
install.HostPassword = GetInstallationConfig(SettingKeys.HostPasswordKey, string.Empty);
@@ -97,6 +101,14 @@ namespace Oqtane.Infrastructure
install.ConnectionString = "";
}
}
+ else
+ {
+ if (!string.IsNullOrEmpty(installation.Message))
+ {
+ // problem with prior installation
+ install.ConnectionString = "";
+ }
+ }
}
else
{
diff --git a/Oqtane.Server/Infrastructure/Interfaces/IDatabaseManager.cs b/Oqtane.Server/Infrastructure/Interfaces/IDatabaseManager.cs
index ffb0ff9c..6257db16 100644
--- a/Oqtane.Server/Infrastructure/Interfaces/IDatabaseManager.cs
+++ b/Oqtane.Server/Infrastructure/Interfaces/IDatabaseManager.cs
@@ -1,11 +1,11 @@
-using Oqtane.Models;
+using Oqtane.Models;
using Oqtane.Shared;
namespace Oqtane.Infrastructure
{
public interface IDatabaseManager
{
- bool IsInstalled();
+ Installation IsInstalled();
Installation Install();
Installation Install(InstallConfig install);
}
diff --git a/Oqtane.Server/Infrastructure/SyncManager.cs b/Oqtane.Server/Infrastructure/SyncManager.cs
index f41c01b0..d70cc456 100644
--- a/Oqtane.Server/Infrastructure/SyncManager.cs
+++ b/Oqtane.Server/Infrastructure/SyncManager.cs
@@ -1,4 +1,4 @@
-using Oqtane.Models;
+using Oqtane.Models;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -17,7 +17,7 @@ namespace Oqtane.Infrastructure
public List GetSyncEvents(int tenantId, DateTime lastSyncDate)
{
- return SyncEvents.Where(item => item.TenantId == tenantId && item.ModifiedOn >= lastSyncDate).ToList();
+ return SyncEvents.Where(item => (item.TenantId == tenantId || item.TenantId == -1) && item.ModifiedOn >= lastSyncDate).ToList();
}
public void AddSyncEvent(int tenantId, string entityName, int entityId)
diff --git a/Oqtane.Server/Infrastructure/UpgradeManager.cs b/Oqtane.Server/Infrastructure/UpgradeManager.cs
index cbfcc63b..b2385b2b 100644
--- a/Oqtane.Server/Infrastructure/UpgradeManager.cs
+++ b/Oqtane.Server/Infrastructure/UpgradeManager.cs
@@ -25,14 +25,12 @@ namespace Oqtane.Infrastructure
public void Upgrade(Tenant tenant, string version)
{
- // core framework upgrade logic - note that you can check if current tenant is Master if you only want to execute logic once
- var pageTemplates = new List();
-
+ // core framework upgrade logic - note that you can check if current tenant is Master if you only want to execute the logic once
switch (version)
{
case "0.9.0":
- // add a page to all existing sites on upgrade
-
+ // this code is commented out on purpose - it provides an example of how to programmatically add a page to all existing sites on upgrade
+ var pageTemplates = new List();
//pageTemplates.Add(new PageTemplate
//{
// Name = "Test",
@@ -68,7 +66,12 @@ namespace Oqtane.Infrastructure
case "2.0.2":
if (tenant.Name == TenantNames.Master)
{
- Directory.Delete(Utilities.PathCombine(_environment.WebRootPath, "Modules", "Templates", "Internal", Path.DirectorySeparatorChar.ToString()), true);
+ // remove Internal module template files as they are no longer supported
+ var internalTemplatePath = Utilities.PathCombine(_environment.WebRootPath, "Modules", "Templates", "Internal", Path.DirectorySeparatorChar.ToString());
+ if (Directory.Exists(internalTemplatePath))
+ {
+ Directory.Delete(internalTemplatePath, true);
+ }
}
break;
}
diff --git a/Oqtane.Server/Pages/_Host.cshtml b/Oqtane.Server/Pages/_Host.cshtml
index e1cc6c21..1678969c 100644
--- a/Oqtane.Server/Pages/_Host.cshtml
+++ b/Oqtane.Server/Pages/_Host.cshtml
@@ -37,7 +37,9 @@
@if (Model.Message != "")
{
- @Model.Message
+
+ @Model.Message
+
}
diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs
index ba2a7d89..1e744c01 100644
--- a/Oqtane.Server/Startup.cs
+++ b/Oqtane.Server/Startup.cs
@@ -226,7 +226,7 @@ namespace Oqtane
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
- public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ISyncManager sync)
{
ServiceActivator.Configure(app.ApplicationServices);
@@ -264,6 +264,9 @@ namespace Oqtane
endpoints.MapControllers();
endpoints.MapFallbackToPage("/_Host");
});
+
+ // create a sync event to identify server application startup
+ sync.AddSyncEvent(-1, "Application", -1);
}
}
}
diff --git a/Oqtane.Server/wwwroot/css/app.css b/Oqtane.Server/wwwroot/css/app.css
index ce87887d..eebf63a6 100644
--- a/Oqtane.Server/wwwroot/css/app.css
+++ b/Oqtane.Server/wwwroot/css/app.css
@@ -1,4 +1,4 @@
-@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
+@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
html, body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
@@ -125,6 +125,13 @@ app {
vertical-align: inherit;
}
+.app-alert {
+ padding: 20px;
+ background-color: #f44336; /* red */
+ color: white;
+ margin-bottom: 15px;
+}
+
/* Tooltips */
.app-tooltip {
cursor: help;