diff --git a/Oqtane.Client/Resources/Modules/Admin/Modules/Settings.resx b/Oqtane.Client/Resources/Modules/Admin/Modules/Settings.resx
index 4f8f895c..0cf90297 100644
--- a/Oqtane.Client/Resources/Modules/Admin/Modules/Settings.resx
+++ b/Oqtane.Client/Resources/Modules/Admin/Modules/Settings.resx
@@ -130,7 +130,7 @@
Indicate if this module should be displayed on all pages
- The page that the module is located on
+ The page that the module is located on. Please note that shared modules cannot be moved to other pages.Title:
diff --git a/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs b/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs
index 2b574833..24e3ed19 100644
--- a/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs
+++ b/Oqtane.Server/Infrastructure/Jobs/SynchronizationJob.cs
@@ -617,6 +617,7 @@ namespace Oqtane.Infrastructure
private string SynchronizeModules(IServiceProvider provider, ISettingRepository settingRepository, IPageModuleRepository pageModuleRepository, IModuleRepository moduleRepository, SiteGroupMember siteGroupMember, List primaryPageModules, List secondaryPageModules, Page primaryPage, Page secondaryPage, int secondarySiteId)
{
var log = "";
+ var removePageModules = secondaryPageModules.Where(item => item.PageId == secondaryPage.PageId).ToList();
// iterate through primary modules on primary page
foreach (var primaryPageModule in primaryPageModules.Where(item => item.PageId == primaryPage.PageId))
@@ -651,7 +652,7 @@ namespace Oqtane.Infrastructure
if (pageModule == null)
{
- // check if module exists
+ // check if module exists in site (ie. a shared instance)
var module = secondaryPageModules.FirstOrDefault(item => item.Module.ModuleDefinitionName == primaryPageModule.Module.ModuleDefinitionName && item.Title.ToLower() == primaryPageModule.Title.ToLower())?.Module;
if (module == null)
{
@@ -685,7 +686,7 @@ namespace Oqtane.Infrastructure
if (pageModule != null)
{
- secondaryPageModules.Remove(pageModule);
+ removePageModules.Remove(pageModule);
}
// module settings
@@ -716,7 +717,7 @@ namespace Oqtane.Infrastructure
if (siteGroupMember.SiteGroup.Type == SiteGroupTypes.Synchronization)
{
// remove modules on the secondary page which do not exist on the primary page
- foreach (var secondaryPageModule in secondaryPageModules.Where(item => item.PageId == secondaryPage.PageId))
+ foreach (var secondaryPageModule in removePageModules)
{
pageModuleRepository.DeletePageModule(secondaryPageModule.PageModuleId);
log += Log(siteGroupMember, $"Module Instance Deleted: {secondaryPageModule.Title} - {CreateLink(siteGroupMember.AliasName + "/" + secondaryPageModule.Page.Path)}");
diff --git a/Oqtane.Server/Repository/PageModuleRepository.cs b/Oqtane.Server/Repository/PageModuleRepository.cs
index 239a9a67..8913f7fc 100644
--- a/Oqtane.Server/Repository/PageModuleRepository.cs
+++ b/Oqtane.Server/Repository/PageModuleRepository.cs
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Linq;
+using System.Security.Policy;
using Microsoft.EntityFrameworkCore;
using Oqtane.Models;
using Oqtane.Shared;
@@ -98,6 +99,7 @@ namespace Oqtane.Repository
var permissions = _permissions.GetPermissions(pagemodule.Module.SiteId, EntityNames.Module).ToList();
pagemodule = GetPageModule(pagemodule, moduledefinitions, permissions);
}
+ pagemodule.Module.IsShared = db.PageModule.Count(item => item.ModuleId == pagemodule.ModuleId) > 1;
return pagemodule;
}
diff --git a/Oqtane.Shared/Models/Module.cs b/Oqtane.Shared/Models/Module.cs
index 7775fcf5..1c2a23cb 100644
--- a/Oqtane.Shared/Models/Module.cs
+++ b/Oqtane.Shared/Models/Module.cs
@@ -33,6 +33,11 @@ namespace Oqtane.Models
///
public bool AllPages { get; set; }
+ ///
+ /// indicates if the module is shared across multiple pages (only set in specific scenarios to ensure performance)
+ ///
+ [NotMapped]
+ public bool IsShared { get; set; }
///
/// Reference to the used for this module.