@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 (_containers != null) {
}
@if (_permissions != null) {
}
@if (_moduleSettingsType != null) { @ModuleSettingsComponent } @if (_containerSettingsType != null) { @ContainerSettingsComponent }

@SharedLocalizer["Cancel"]

@code { public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; 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 _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; protected override async Task OnInitializedAsync() { SetModuleTitle(Localizer["ModuleSettings.Title"]); _module = ModuleState.ModuleDefinition.Name; _title = ModuleState.Title; _moduleSettingsTitle = Localizer["ModuleSettings.Heading"]; _pane = ModuleState.Pane; _containers = ThemeService.GetContainerControls(PageState.Site.Themes, PageState.Page.ThemeType); _containerType = ModuleState.ContainerType; _allPages = ModuleState.AllPages.ToString(); _permissions = ModuleState.PermissionList; _pageId = ModuleState.PageId.ToString(); createdby = ModuleState.CreatedBy; createdon = ModuleState.CreatedOn; modifiedby = ModuleState.ModifiedBy; modifiedon = ModuleState.ModifiedOn; _effectivedate = Utilities.UtcAsLocalDate(ModuleState.EffectiveDate); _expirydate = Utilities.UtcAsLocalDate(ModuleState.ExpiryDate); _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); if (ModuleState.ModuleDefinition != null) { _permissionNames = ModuleState.ModuleDefinition?.PermissionNames; if (!string.IsNullOrEmpty(ModuleState.ModuleDefinition.SettingsType)) { // module settings type explicitly declared in IModule interface _moduleSettingsType = Type.GetType(ModuleState.ModuleDefinition.SettingsType); } else { // legacy support - module settings type determined by convention ( ie. existence of a "Settings.razor" component in module ) _moduleSettingsType = Type.GetType(ModuleState.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"], ModuleState.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(); }; } } } 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; } await PageModuleService.UpdatePageModuleAsync(pagemodule); await PageModuleService.UpdatePageModuleOrderAsync(pagemodule.PageId, pagemodule.Pane); var module = ModuleState; 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 { AddModuleMessage(Localizer["Message.Required.Title"], MessageType.Warning); } } else { AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning); } } }