@namespace Oqtane.Modules.Admin.ThemeCreator @inherits ModuleBase @inject NavigationManager NavigationManager @inject IThemeService ThemeService @inject IModuleService ModuleService @inject IPageModuleService PageModuleService @inject ISystemService SystemService @inject ISettingService SettingService @inject IStringLocalizer Localizer @using System.Text.RegularExpressions @using System.IO; @if (string.IsNullOrEmpty(_themename) && _systeminfo != null && _templates != null) { @if (!string.IsNullOrEmpty(_location)) { }
} else { } @code { private string _themename = string.Empty; private string _owner = string.Empty; private string _theme = string.Empty; private string _template = "-"; private string _reference = Constants.Version; private string _location = string.Empty; private Dictionary _systeminfo; private List _templates; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; protected override async Task OnInitializedAsync() { try { _themename = SettingService.GetSetting(ModuleState.Settings, "ThemeName", ""); _systeminfo = await SystemService.GetSystemInfoAsync(); _templates = await ThemeService.GetThemeTemplatesAsync(); if (string.IsNullOrEmpty(_themename)) { AddModuleMessage(Localizer["Please Note That The Theme Creator Is Only Intended To Be Used In A Development Environment"], MessageType.Info); } else { AddModuleMessage(Localizer["Once You Have Compiled The Theme And Restarted The Application You Can Activate The Theme Below"], MessageType.Info); } } catch (Exception ex) { await logger.LogError(ex, "Error Loading Theme Creator"); } } private async Task CreateTheme() { try { if (IsValid(_owner) && IsValid(_theme) && _owner != _theme && _template != "-") { var theme = new Theme { Owner = _owner, Name = _theme, Template = _template, Version = _reference }; theme = await ThemeService.CreateThemeAsync(theme); var settings = ModuleState.Settings; SettingService.SetSetting(settings, "ThemeName", theme.ThemeName); await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); GetLocation(); AddModuleMessage(Localizer["The Source Code For Your Theme Has Been Created At The Location Specified Below And Must Be Compiled In Order To Make It Functional. Once It Has Been Compiled You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); } else { AddModuleMessage(Localizer["You Must Provide A Valid Owner Name And Theme Name ( ie. No Punctuation Or Spaces And The Values Cannot Be The Same ) And Choose A Template"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Creating Theme"); } } private async Task ActivateTheme() { try { if (!string.IsNullOrEmpty(_themename)) { await PageModuleService.DeletePageModuleAsync(ModuleState.PageModuleId); await ModuleService.DeleteModuleAsync(ModuleState.ModuleId); NavigationManager.NavigateTo(NavigateUrl()); } } catch (Exception ex) { await logger.LogError(ex, "Error Activating Theme"); } } private bool IsValid(string name) { // must contain letters, underscores and digits and first character must be letter or underscore return !string.IsNullOrEmpty(name) && Regex.IsMatch(name, "^[A-Za-z_][A-Za-z0-9_]*$"); } private void TemplateChanged(ChangeEventArgs e) { _template = (string)e.Value; GetLocation(); } private void GetLocation() { _location = string.Empty; if (_template != "-" && _systeminfo != null && _systeminfo.ContainsKey("serverpath")) { string[] path = _systeminfo["serverpath"].Split(Path.DirectorySeparatorChar); _location = string.Join(Path.DirectorySeparatorChar, path, 0, path.Length - 2) + Path.DirectorySeparatorChar + _owner + "." + _theme; } StateHasChanged(); } }