From 573a914699f8423be8de9c9e1657fc1ddedc1fff Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 25 Feb 2026 11:44:15 -0500 Subject: [PATCH] provide an indicator in Module Settings when a module is shared across multiple pages --- .../Modules/Admin/Modules/Settings.razor | 30 +++++++++++-------- Oqtane.Client/Modules/Admin/Site/Index.razor | 2 +- .../Modules/Admin/Modules/Settings.resx | 2 +- .../Infrastructure/Jobs/SynchronizationJob.cs | 7 +++-- .../Repository/PageModuleRepository.cs | 2 ++ Oqtane.Shared/Models/Module.cs | 5 ++++ 6 files changed, 30 insertions(+), 18 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Modules/Settings.razor b/Oqtane.Client/Modules/Admin/Modules/Settings.razor index 82ca6a69..bde62f80 100644 --- a/Oqtane.Client/Modules/Admin/Modules/Settings.razor +++ b/Oqtane.Client/Modules/Admin/Modules/Settings.razor @@ -73,27 +73,29 @@
- +
- - } - else + + } + else + { + + + }
@@ -161,6 +163,7 @@ private string _pane; private string _containerType; private string _allPages = "false"; + private bool _isShared = false; private string _header = ""; private string _footer = ""; private string _permissionNames = ""; @@ -207,6 +210,7 @@ _expirydate = Utilities.UtcAsLocalDate(pagemodule.ExpiryDate); _allPages = pagemodule.Module.AllPages.ToString(); + _isShared = pagemodule.Module.IsShared; createdby = pagemodule.Module.CreatedBy; createdon = pagemodule.Module.CreatedOn; modifiedby = pagemodule.Module.ModifiedBy; diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 49a3273e..9b94e0c0 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -526,7 +526,7 @@ - @if (_primary == "False" && (_groupType == SiteGroupTypes.Synchronization || _groupType == SiteGroupTypes.ChangeDetection)) + @if (_primary == "False" && !string.IsNullOrEmpty(_synchronized) && (_groupType == SiteGroupTypes.Synchronization || _groupType == SiteGroupTypes.ChangeDetection)) {
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.