@namespace Oqtane.Modules.Admin.Modules @using Oqtane.Interfaces @inherits ModuleBase @inject NavigationManager NavigationManager @inject IThemeService ThemeService @inject IPageService PageService @inject IModuleService ModuleService @inject IPageModuleService PageModuleService @inject IStringLocalizer Localizer @inject IStringLocalizer SharedLocalizer @if (_initialized) {
@if (_containers != null) {

}
@if (_permissions != null) {
}
@if (_moduleSettingsType != null) { @ModuleSettingsComponent } @if (_containerSettingsType != null) { @ContainerSettingsComponent }

@SharedLocalizer["Cancel"]

} @code { public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; private bool _initialized = false; private ElementReference form; private bool validated = false; private List _containers = new List(); private string _module; private string _title; private string _pane; private string _containerType; private string _allPages = "false"; private string _header = ""; private string _footer = ""; private string _permissionNames = ""; private List _permissions = null; private string _pageId; private PermissionGrid _permissionGrid; private Type _moduleSettingsType; private object _moduleSettings; private string _moduleSettingsTitle; private RenderFragment ModuleSettingsComponent { get; set; } private Type _containerSettingsType; private object _containerSettings; private RenderFragment ContainerSettingsComponent { get; set; } private string createdby; private DateTime createdon; private string modifiedby; private DateTime modifiedon; private DateTime? _effectivedate = null; private DateTime? _expirydate = null; private List _pages; private string _activetab = ""; protected override async Task OnInitializedAsync() { SetModuleTitle(Localizer["ModuleSettings.Title"]); _moduleSettingsTitle = Localizer["ModuleSettings.Heading"]; _containers = ThemeService.GetContainerControls(PageState.Site.Themes, PageState.Page.ThemeType); _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); var pagemodule = await PageModuleService.GetPageModuleAsync(ModuleState.PageModuleId); _pageId = pagemodule.PageId.ToString(); _title = pagemodule.Title; _pane = pagemodule.Pane; _containerType = pagemodule.ContainerType; if (string.IsNullOrEmpty(_containerType)) { _containerType = (!string.IsNullOrEmpty(PageState.Page.DefaultContainerType)) ? PageState.Page.DefaultContainerType : PageState.Site.DefaultContainerType; } _header = pagemodule.Header; _footer = pagemodule.Footer; _effectivedate = Utilities.UtcAsLocalDate(pagemodule.EffectiveDate); _expirydate = Utilities.UtcAsLocalDate(pagemodule.ExpiryDate); _allPages = pagemodule.Module.AllPages.ToString(); createdby = pagemodule.Module.CreatedBy; createdon = pagemodule.Module.CreatedOn; modifiedby = pagemodule.Module.ModifiedBy; modifiedon = pagemodule.Module.ModifiedOn; _permissions = pagemodule.Module.PermissionList; if (pagemodule.Module.ModuleDefinition != null) { _module = pagemodule.Module.ModuleDefinition.Name; _permissionNames = pagemodule.Module.ModuleDefinition?.PermissionNames; if (!string.IsNullOrEmpty(pagemodule.Module.ModuleDefinition.SettingsType)) { // module settings type explicitly declared in IModule interface _moduleSettingsType = Type.GetType(pagemodule.Module.ModuleDefinition.SettingsType); } else { // legacy support - module settings type determined by convention ( ie. existence of a "Settings.razor" component in module ) _moduleSettingsType = Type.GetType(pagemodule.Module.ModuleDefinition.ControlTypeTemplate.Replace(Constants.ActionToken, PageState.Action), false, true); } if (_moduleSettingsType != null) { var moduleobject = Activator.CreateInstance(_moduleSettingsType) as IModuleControl; if (!string.IsNullOrEmpty(moduleobject.Title)) { _moduleSettingsTitle = moduleobject.Title; } ModuleSettingsComponent = builder => { builder.OpenComponent(0, _moduleSettingsType); builder.AddAttribute(1, "RenderModeBoundary", RenderModeBoundary); builder.AddComponentReferenceCapture(2, inst => { _moduleSettings = Convert.ChangeType(inst, _moduleSettingsType); }); builder.CloseComponent(); }; } } else { AddModuleMessage(string.Format(Localizer["Error.Module.Load"], pagemodule.Module.ModuleDefinitionName), MessageType.Error); } var theme = PageState.Site.Themes.FirstOrDefault(item => item.Containers.Any(themecontrol => themecontrol.TypeName.Equals(_containerType))); if (theme != null && !string.IsNullOrEmpty(theme.ContainerSettingsType)) { _containerSettingsType = Type.GetType(theme.ContainerSettingsType); if (_containerSettingsType != null) { ContainerSettingsComponent = builder => { builder.OpenComponent(0, _containerSettingsType); builder.AddAttribute(1, "RenderModeBoundary", RenderModeBoundary); builder.AddComponentReferenceCapture(2, inst => { _containerSettings = Convert.ChangeType(inst, _containerSettingsType); }); builder.CloseComponent(); }; } } _initialized = true; } private async Task SaveModule() { validated = true; var interop = new Interop(JSRuntime); if (await interop.FormValid(form)) { if (!string.IsNullOrEmpty(_title)) { if (!Utilities.ValidateEffectiveExpiryDates(_effectivedate, _expirydate)) { AddModuleMessage(SharedLocalizer["Message.EffectiveExpiryDateError"], MessageType.Warning); return; } var pagemodule = await PageModuleService.GetPageModuleAsync(ModuleState.PageModuleId); pagemodule.PageId = int.Parse(_pageId); pagemodule.Title = _title; pagemodule.Pane = _pane; pagemodule.EffectiveDate = Utilities.LocalDateAndTimeAsUtc(_effectivedate); pagemodule.ExpiryDate = Utilities.LocalDateAndTimeAsUtc(_expirydate); pagemodule.ContainerType = (_containerType != "-") ? _containerType : string.Empty; if (!string.IsNullOrEmpty(pagemodule.ContainerType) && pagemodule.ContainerType == PageState.Page.DefaultContainerType) { pagemodule.ContainerType = string.Empty; } if (!string.IsNullOrEmpty(pagemodule.ContainerType) && pagemodule.ContainerType == PageState.Site.DefaultContainerType) { pagemodule.ContainerType = string.Empty; } pagemodule.Header = _header; pagemodule.Footer = _footer; await PageModuleService.UpdatePageModuleAsync(pagemodule); await PageModuleService.UpdatePageModuleOrderAsync(pagemodule.PageId, pagemodule.Pane); var module = await ModuleService.GetModuleAsync(ModuleState.ModuleId); module.AllPages = bool.Parse(_allPages); module.PageModuleId = ModuleState.PageModuleId; module.PermissionList = _permissionGrid.GetPermissionList(); await ModuleService.UpdateModuleAsync(module); if (_moduleSettingsType != null) { if (_moduleSettings is ISettingsControl moduleSettingsControl) { // module settings updated using explicit interface await moduleSettingsControl.UpdateSettings(); } else { // legacy support - module settings updated by convention ( ie. by calling a public method named "UpdateSettings" in settings component ) _moduleSettings?.GetType().GetMethod("UpdateSettings")?.Invoke(_moduleSettings, null); } } if (_containerSettingsType != null && _containerSettings is ISettingsControl containerSettingsControl) { await containerSettingsControl.UpdateSettings(); } NavigationManager.NavigateTo(PageState.ReturnUrl); } else { _activetab = "Settings"; AddModuleMessage(Localizer["Message.Required.Title"], MessageType.Warning); } } else { _activetab = "Settings"; AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning); } } }