diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor index 9c1f4633..1e0c427c 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor @@ -32,7 +32,7 @@
- +
diff --git a/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor b/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor index fe8c0128..bd386c01 100644 --- a/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor +++ b/Oqtane.Client/Themes/Controls/Theme/ControlPanelInteractive.razor @@ -294,7 +294,7 @@ _containerType = PageState.Site.DefaultContainerType; _allModuleDefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); _moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(_category)).ToList(); - _categories = _allModuleDefinitions.SelectMany(m => m.Categories.Split(',')).Distinct().ToList(); + _categories = _allModuleDefinitions.SelectMany(m => m.Categories.Split(',', StringSplitOptions.RemoveEmptyEntries)).Distinct().Where(item => item != "Library").ToList(); } } diff --git a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs index 563a5a1d..124897e3 100644 --- a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs +++ b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs @@ -287,7 +287,9 @@ namespace Oqtane.Repository { ModuleDefinition moduledefinition; + Type[] moduletypes = assembly.GetTypes().Where(item => item.GetInterfaces().Contains(typeof(IModule))).ToArray(); Type[] modulecontroltypes = assembly.GetTypes().Where(item => item.GetInterfaces().Contains(typeof(IModuleControl))).ToArray(); + foreach (Type modulecontroltype in modulecontroltypes) { // Check if type should be ignored @@ -299,12 +301,9 @@ namespace Oqtane.Repository int index = moduledefinitions.FindIndex(item => item.ModuleDefinitionName == qualifiedModuleType); if (index == -1) { - // determine if this module implements IModule - Type moduletype = assembly - .GetTypes() - .Where(item => item.Namespace != null) - .Where(item => item.Namespace == modulecontroltype.Namespace || item.Namespace.StartsWith(modulecontroltype.Namespace + ".")) - .FirstOrDefault(item => item.GetInterfaces().Contains(typeof(IModule))); + // determine if this component is part of a module which implements IModule + Type moduletype = moduletypes.FirstOrDefault(item => item.Namespace == modulecontroltype.Namespace); + if (moduletype != null) { // get property values from IModule @@ -399,6 +398,22 @@ namespace Oqtane.Repository moduledefinitions[index] = moduledefinition; } + // process modules without UI components + foreach (var moduletype in moduletypes.Where(m1 => !modulecontroltypes.Any(m2 => m1.Namespace == m2.Namespace))) + { + // get property values from IModule + var moduleobject = Activator.CreateInstance(moduletype) as IModule; + moduledefinition = moduleobject.ModuleDefinition; + moduledefinition.ModuleDefinitionName = moduletype.Namespace + ", " + moduletype.Assembly.GetName().Name; + moduledefinition.AssemblyName = assembly.GetName().Name; + moduledefinition.Categories = "Library"; + moduledefinition.PermissionList = new List + { + new Permission(PermissionNames.Utilize, RoleNames.Host, true) + }; + moduledefinitions.Add(moduledefinition); + } + return moduledefinitions; } diff --git a/Oqtane.Server/Repository/ThemeRepository.cs b/Oqtane.Server/Repository/ThemeRepository.cs index ae44815d..bd557bdd 100644 --- a/Oqtane.Server/Repository/ThemeRepository.cs +++ b/Oqtane.Server/Repository/ThemeRepository.cs @@ -13,6 +13,7 @@ using Oqtane.Shared; using Oqtane.Themes; using System.Reflection.Metadata; using Oqtane.Migrations.Master; +using Oqtane.Modules; namespace Oqtane.Repository { @@ -224,9 +225,11 @@ namespace Oqtane.Repository private List LoadThemesFromAssembly(List themes, Assembly assembly) { Theme theme; - List themeTypes = new List(); + Type[] themeTypes = assembly.GetTypes().Where(item => item.GetInterfaces().Contains(typeof(ITheme))).ToArray(); Type[] themeControlTypes = assembly.GetTypes().Where(item => item.GetInterfaces().Contains(typeof(IThemeControl))).ToArray(); + Type[] containerControlTypes = assembly.GetTypes().Where(item => item.GetInterfaces().Contains(typeof(IContainerControl))).ToArray(); + foreach (Type themeControlType in themeControlTypes) { // Check if type should be ignored @@ -240,16 +243,9 @@ namespace Oqtane.Repository int index = themes.FindIndex(item => item.ThemeName == qualifiedThemeType); if (index == -1) { - // Find all types in the assembly with the same namespace root - themeTypes = assembly.GetTypes() - .Where(item => !item.IsOqtaneIgnore()) - .Where(item => item.Namespace != null) - .Where(item => item.Namespace == themeControlType.Namespace || item.Namespace.StartsWith(themeControlType.Namespace + ".")) - .ToList(); + // determine if this component is part of a theme which implements ITheme + Type themetype = themeTypes.FirstOrDefault(item => item.Namespace == themeControlType.Namespace); - // determine if this theme implements ITheme - Type themetype = themeTypes - .FirstOrDefault(item => item.GetInterfaces().Contains(typeof(ITheme))); if (themetype != null) { var themeobject = Activator.CreateInstance(themetype) as ITheme; @@ -285,6 +281,7 @@ namespace Oqtane.Repository } theme = themes[index]; + // add theme control var themecontrolobject = Activator.CreateInstance(themeControlType) as IThemeControl; theme.Themes.Add( new ThemeControl @@ -296,14 +293,12 @@ namespace Oqtane.Repository } ); - // containers - Type[] containertypes = themeTypes - .Where(item => item.GetInterfaces().Contains(typeof(IContainerControl))).ToArray(); - foreach (Type containertype in containertypes) + if (!theme.Containers.Any()) { - var containerobject = Activator.CreateInstance(containertype) as IThemeControl; - if (theme.Containers.FirstOrDefault(item => item.TypeName == containertype.FullName + ", " + themeControlType.Assembly.GetName().Name) == null) + // add container controls + foreach (Type containertype in containerControlTypes.Where(item => item.Namespace == themeControlType.Namespace)) { + var containerobject = Activator.CreateInstance(containertype) as IThemeControl; theme.Containers.Add( new ThemeControl {