diff --git a/Oqtane.Client/App.razor b/Oqtane.Client/App.razor index 5ad3a790..cef437d1 100644 --- a/Oqtane.Client/App.razor +++ b/Oqtane.Client/App.razor @@ -62,21 +62,10 @@ _initialized = true; } - protected override async Task OnAfterRenderAsync(bool firstRender) + protected override void OnAfterRender(bool firstRender) { if (firstRender) { - if (string.IsNullOrEmpty(AntiForgeryToken)) - { - // parameter values are not set when running on WebAssembly (seems to be a .NET 5 bug) - need to retrieve using JSInterop - var interop = new Interop(JSRuntime); - - SiteState.AntiForgeryToken = await interop.GetElementByName(Constants.RequestVerificationToken); - InstallationService.SetAntiForgeryTokenHeader(SiteState.AntiForgeryToken); - - Runtime = await interop.GetElementByName("app_runtime"); - RenderMode = await interop.GetElementByName("app_rendermode"); - } _display = ""; StateHasChanged(); } diff --git a/Oqtane.Client/Installer/Controls/LocalDBConfig.razor b/Oqtane.Client/Installer/Controls/LocalDBConfig.razor index 5d27d986..4ba204c1 100644 --- a/Oqtane.Client/Installer/Controls/LocalDBConfig.razor +++ b/Oqtane.Client/Installer/Controls/LocalDBConfig.razor @@ -24,7 +24,7 @@ if (!String.IsNullOrEmpty(_server) && !String.IsNullOrEmpty(_database)) { - connectionString = $"Data Source={_server};AttachDbFilename=|DataDirectory|\\{_database}.mdf;Initial Catalog={_database};Integrated Security=SSPI;"; + connectionString = $"Data Source={_server};AttachDbFilename=|DataDirectory|\\{_database}.mdf;Initial Catalog={_database};Integrated Security=SSPI;Encrypt=false;"; } return connectionString; diff --git a/Oqtane.Client/Installer/Controls/SqlServerConfig.razor b/Oqtane.Client/Installer/Controls/SqlServerConfig.razor index 905f8006..021ba776 100644 --- a/Oqtane.Client/Installer/Controls/SqlServerConfig.razor +++ b/Oqtane.Client/Installer/Controls/SqlServerConfig.razor @@ -1,6 +1,7 @@ @namespace Oqtane.Installer.Controls @implements Oqtane.Interfaces.IDatabaseConfigControl @inject IStringLocalizer Localizer +@inject IStringLocalizer SharedLocalizer
@@ -38,6 +39,27 @@
} +
+ +
+ +
+
+@if (_encryption == "true") +{ +
+ +
+ +
+
+} @code { private string _server = String.Empty; @@ -45,6 +67,8 @@ private string _security = "integrated"; private string _uid = String.Empty; private string _pwd = String.Empty; + private string _encryption = "false"; + private string _trustservercertificate = "false"; public string GetConnectionString() { @@ -61,15 +85,10 @@ } else { - if (!String.IsNullOrEmpty(_uid) && !String.IsNullOrEmpty(_pwd)) - { - connectionString += $"User ID={_uid};Password={_pwd};"; - } - else - { - connectionString = String.Empty; - } + connectionString += $"User ID={_uid};Password={_pwd};"; } + connectionString += $"Encrypt={_encryption};"; + connectionString += $"TrustServerCertificate={_trustservercertificate};"; return connectionString; } diff --git a/Oqtane.Client/Installer/Installer.razor b/Oqtane.Client/Installer/Installer.razor index 7c656e13..1ced68d1 100644 --- a/Oqtane.Client/Installer/Installer.razor +++ b/Oqtane.Client/Installer/Installer.razor @@ -24,10 +24,10 @@
- + @foreach (var database in _databases) { if (database.IsDefault) { @@ -38,8 +38,8 @@ } } - } - + + }
@{ @@ -96,23 +96,31 @@ @code { - private List _databases; - private string _databaseName = "LocalDB"; - private Type _databaseConfigType; - private object _databaseConfig; - private RenderFragment DatabaseConfigComponent { get; set; } + private List _databases; + private string _databaseName; + private Type _databaseConfigType; + private object _databaseConfig; + private RenderFragment DatabaseConfigComponent { get; set; } - private string _hostUsername = string.Empty; - private string _hostPassword = string.Empty; - private string _confirmPassword = string.Empty; - private string _hostEmail = string.Empty; - private bool _register = true; - private string _message = string.Empty; - private string _loadingDisplay = "display: none;"; + private string _hostUsername = string.Empty; + private string _hostPassword = string.Empty; + private string _confirmPassword = string.Empty; + private string _hostEmail = string.Empty; + private bool _register = true; + private string _message = string.Empty; + private string _loadingDisplay = "display: none;"; - protected override async Task OnInitializedAsync() - { - _databases = await DatabaseService.GetDatabasesAsync(); + protected override async Task OnInitializedAsync() + { + _databases = await DatabaseService.GetDatabasesAsync(); + if (_databases.Exists(item => item.IsDefault)) + { + _databaseName = _databases.Find(item => item.IsDefault).Name; + } + else + { + _databaseName = "LocalDB"; + } LoadDatabaseConfigComponent(); } @@ -150,8 +158,8 @@ if (firstRender) { var interop = new Interop(JSRuntime); - await interop.IncludeLink("", "stylesheet", "https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css", "text/css", "sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC", "anonymous", ""); - await interop.IncludeScript("", "https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js", "sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM", "anonymous", "", "head", ""); + await interop.IncludeLink("", "stylesheet", "https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.0.2/css/bootstrap.min.css", "text/css", "sha512-usVBAd66/NpVNfBge19gws2j6JZinnca12rAe2l+d+QkLU9fiG02O1X8Q6hepIpr/EYKZvKx/I9WsnujJuOmBA==", "anonymous", ""); + await interop.IncludeScript("", "https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.0.2/js/bootstrap.min.js", "sha512-a6ctI6w1kg3J4dSjknHj3aWLEbjitAXAjLDRUxo2wyYmDFRcz2RJuQr5M3Kt8O/TtUSp8n2rAyaXYy1sjoKmrQ==", "anonymous", "", "head", ""); } } diff --git a/Oqtane.Client/Modules/Admin/Files/Add.razor b/Oqtane.Client/Modules/Admin/Files/Add.razor index a36e6cc2..d8655e1a 100644 --- a/Oqtane.Client/Modules/Admin/Files/Add.razor +++ b/Oqtane.Client/Modules/Admin/Files/Add.razor @@ -13,7 +13,7 @@
- +
diff --git a/Oqtane.Client/Modules/Admin/Languages/Add.razor b/Oqtane.Client/Modules/Admin/Languages/Add.razor index 69b6f97e..b3c9c533 100644 --- a/Oqtane.Client/Modules/Admin/Languages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Languages/Add.razor @@ -115,7 +115,7 @@ else
- +
@@ -317,7 +317,7 @@ else { try { - await PackageService.DownloadPackageAsync(_packageid, _version, "Packages"); + await PackageService.DownloadPackageAsync(_packageid, _version, Constants.PackagesFolder); await logger.LogInformation("Language Package {Name} {Version} Downloaded Successfully", _packageid, _version); AddModuleMessage(Localizer["Success.Language.Download"], MessageType.Success); StateHasChanged(); diff --git a/Oqtane.Client/Modules/Admin/Languages/Index.razor b/Oqtane.Client/Modules/Admin/Languages/Index.razor index 08fc569b..947cddc7 100644 --- a/Oqtane.Client/Modules/Admin/Languages/Index.razor +++ b/Oqtane.Client/Modules/Admin/Languages/Index.razor @@ -97,7 +97,7 @@ else { if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) { - await PackageService.DownloadPackageAsync(Constants.PackageId + ".Client." + code, Constants.Version, "Packages"); + await PackageService.DownloadPackageAsync(Constants.PackageId + ".Client." + code, Constants.Version, Constants.PackagesFolder); await logger.LogInformation("Translation Downloaded {Code} {Version}", code, Constants.Version); await PackageService.InstallPackagesAsync(); AddModuleMessage(string.Format(Localizer["Success.Language.Install"], NavigateUrl("admin/system")), MessageType.Success); diff --git a/Oqtane.Client/Modules/Admin/Login/Index.razor b/Oqtane.Client/Modules/Admin/Login/Index.razor index 8399ae95..07fafe07 100644 --- a/Oqtane.Client/Modules/Admin/Login/Index.razor +++ b/Oqtane.Client/Modules/Admin/Login/Index.razor @@ -16,7 +16,7 @@ ... - +
@Localizer["Info.SignedIn"]
diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor index 25df6b21..27f32ea7 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor @@ -10,70 +10,69 @@ @if (string.IsNullOrEmpty(_moduledefinitionname) && _templates != null) { - -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- @if (!string.IsNullOrEmpty(_location)) - { -
- -
- -
-
- } -
- - - } - else - { - -
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ @if (!string.IsNullOrEmpty(_location)) + { +
+ +
+ +
+
+ } +
+
+ +} +else +{ + } @code { @@ -92,22 +91,25 @@ public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; + protected override void OnInitialized() + { + _moduledefinitionname = SettingService.GetSetting(ModuleState.Settings, "ModuleDefinitionName", ""); + if (string.IsNullOrEmpty(_moduledefinitionname)) + { + AddModuleMessage(Localizer["Info.Module.Creator"], MessageType.Info); + } + else + { + AddModuleMessage(Localizer["Info.Module.Activate"], MessageType.Info); + } + } + protected override async Task OnParametersSetAsync() { try { - _moduledefinitionname = SettingService.GetSetting(ModuleState.Settings, "ModuleDefinitionName", ""); _templates = await ModuleDefinitionService.GetModuleDefinitionTemplatesAsync(); _versions = Constants.ReleaseVersions.Split(',').Where(item => Version.Parse(item).CompareTo(Version.Parse("2.0.0")) >= 0).ToArray(); - - if (string.IsNullOrEmpty(_moduledefinitionname)) - { - AddModuleMessage(Localizer["Info.Module.Creator"], MessageType.Info); - } - else - { - AddModuleMessage(Localizer["Info.Module.Activate"], MessageType.Info); - } } catch (Exception ex) { @@ -131,7 +133,6 @@ await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); GetLocation(); - AddModuleMessage(string.Format(Localizer["Success.Module.Create"], NavigateUrl("admin/system")), MessageType.Success); } catch (Exception ex) diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor index ec123cc7..7825d0e2 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -70,7 +70,7 @@
- +
@@ -229,7 +229,7 @@ { try { - await PackageService.DownloadPackageAsync(_packageid, _version, "Packages"); + await PackageService.DownloadPackageAsync(_packageid, _version, Constants.PackagesFolder); await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _version); AddModuleMessage(Localizer["Success.Module.Download"], MessageType.Success); _productname = ""; diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Create.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Create.razor index 6adc392a..dda4087c 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Create.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Create.razor @@ -87,13 +87,17 @@ public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; + protected override void OnInitialized() + { + AddModuleMessage(Localizer["Info.Module.Development"], MessageType.Info); + } + protected override async Task OnParametersSetAsync() { try { _templates = await ModuleDefinitionService.GetModuleDefinitionTemplatesAsync(); _versions = Constants.ReleaseVersions.Split(',').Where(item => Version.Parse(item).CompareTo(Version.Parse("2.0.0")) >= 0).ToArray(); - AddModuleMessage(Localizer["Info.Module.Development"], MessageType.Info); } catch (Exception ex) { diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor index abce34a4..1f194dba 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor @@ -111,7 +111,7 @@ else { try { - await PackageService.DownloadPackageAsync(packagename, version, "Packages"); + await PackageService.DownloadPackageAsync(packagename, version, Constants.PackagesFolder); await logger.LogInformation("Module Downloaded {ModuleDefinitionName} {Version}", packagename, version); await ModuleDefinitionService.InstallModuleDefinitionsAsync(); AddModuleMessage(string.Format(Localizer["Success.Module.Install"], NavigateUrl("admin/system")), MessageType.Success); diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index 583b62f2..36d45b47 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -74,7 +74,7 @@
- +
@@ -293,11 +293,11 @@ page.SiteId = PageState.Page.SiteId; page.Name = _name; page.Title = _title; + if (string.IsNullOrEmpty(_path)) { _path = _name; } - if (_path.Contains("/")) { _path = _path.Substring(_path.LastIndexOf("/") + 1); diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 00e02fab..d3cbfbac 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -81,7 +81,7 @@
- +
@@ -225,9 +225,16 @@ _title = page.Title; _path = page.Path; - if (_path.Contains("/")) + if (string.IsNullOrEmpty(_path)) { - _path = _path.Substring(_path.LastIndexOf("/") + 1); + _path = "/"; + } + else + { + if (_path.Contains("/")) + { + _path = _path.Substring(_path.LastIndexOf("/") + 1); + } } if (page.ParentId == null) @@ -370,7 +377,8 @@ page.Name = _name; page.Title = _title; - if (string.IsNullOrEmpty(_path) && _name.ToLower() != "home") + + if (string.IsNullOrEmpty(_path)) { _path = _name; } @@ -378,6 +386,7 @@ { _path = _path.Substring(_path.LastIndexOf("/") + 1); } + if (_parentid == "-1") { page.ParentId = null; diff --git a/Oqtane.Client/Modules/Admin/Pages/Index.razor b/Oqtane.Client/Modules/Admin/Pages/Index.razor index 0b772dae..15c37493 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Index.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Index.razor @@ -11,13 +11,14 @@
-   -   - @SharedLocalizer["Name"] +   +   + @SharedLocalizer["Name"]
+ @(new string('-', context.Level * 2))@(context.Name)
@@ -42,4 +43,8 @@ AddModuleMessage(Localizer["Error.Page.Delete"], MessageType.Error); } } + protected string Browse(Page page) + { + return string.IsNullOrEmpty(page.Url) ? NavigateUrl(page.Path) : page.Url; + } } diff --git a/Oqtane.Client/Modules/Admin/Roles/Users.razor b/Oqtane.Client/Modules/Admin/Roles/Users.razor index 92015116..67671e69 100644 --- a/Oqtane.Client/Modules/Admin/Roles/Users.razor +++ b/Oqtane.Client/Modules/Admin/Roles/Users.razor @@ -35,13 +35,13 @@ else
- +
- +


diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 8602c80c..f6263f33 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -104,7 +104,6 @@
-
@@ -157,10 +156,7 @@

- - -
@@ -189,6 +185,28 @@
@if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) { +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
@@ -231,6 +249,8 @@ private string _name = string.Empty; private List _aliasList; private string _urls = string.Empty; + private string _runtime = ""; + private string _prerender = ""; private int _logofileid = -1; private FileManager _logofilemanager; private int _faviconfileid = -1; @@ -272,6 +292,8 @@ if (site != null) { _name = site.Name; + _runtime = site.Runtime; + _prerender = site.RenderMode.Replace(_runtime, ""); _allowregistration = site.AllowRegistration.ToString(); _isdeleted = site.IsDeleted.ToString(); @@ -413,9 +435,20 @@ var site = await SiteService.GetSiteAsync(PageState.Site.SiteId); if (site != null) { + bool reload = false; bool refresh = (site.DefaultThemeType != _themetype || site.DefaultContainerType != _containertype); site.Name = _name; + if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { + if (site.Runtime != _runtime || site.RenderMode != _runtime + _prerender) + { + site.Runtime = _runtime; + site.RenderMode = _runtime + _prerender; + refresh = true; + reload = true; + } + } site.AllowRegistration = (_allowregistration == null ? true : Boolean.Parse(_allowregistration)); site.IsDeleted = (_isdeleted == null ? true : Boolean.Parse(_isdeleted)); @@ -485,7 +518,7 @@ if (refresh) { - NavigationManager.NavigateTo(NavigateUrl()); // refresh to show new theme or container + NavigationManager.NavigateTo(NavigateUrl(), reload); // refresh to show new theme or container } else { diff --git a/Oqtane.Client/Modules/Admin/Sites/Add.razor b/Oqtane.Client/Modules/Admin/Sites/Add.razor index 448c6682..cdcef8da 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Add.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Add.razor @@ -82,6 +82,24 @@ else
+
+ +
+ +
+
+
+ +
+ +
+
@@ -129,13 +147,13 @@ else @DatabaseConfigComponent; }
- +
- +
- +
@@ -168,7 +186,7 @@ else private string _tenantName = string.Empty; - private string _hostUserName = UserNames.Host; + private string _hostusername = string.Empty; private string _hostpassword = string.Empty; private string _name = string.Empty; @@ -177,6 +195,8 @@ else private string _containertype = "-"; private string _admincontainertype = ""; private string _sitetemplatetype = "-"; + private string _runtime = "Server"; + private string _prerender = "Prerendered"; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; @@ -283,7 +303,7 @@ else // validate host credentials var user = new User(); user.SiteId = PageState.Site.SiteId; - user.Username = UserNames.Host; + user.Username = _hostusername; user.Password = _hostpassword; user = await UserService.LoginUserAsync(user, false, false); if (user.IsAuthenticated) @@ -300,8 +320,9 @@ else config.TenantName = _tenantName; config.DatabaseType = database.DBType; config.ConnectionString = connectionString; - config.HostEmail = user.Email; + config.HostUsername = _hostusername; config.HostPassword = _hostpassword; + config.HostEmail = user.Email; config.HostName = user.DisplayName; config.IsNewTenant = true; } @@ -340,6 +361,8 @@ else config.DefaultContainer = _containertype; config.DefaultAdminContainer = _admincontainertype; config.SiteTemplate = _sitetemplatetype; + config.Runtime = _runtime; + config.RenderMode = _runtime + _prerender; ShowProgressIndicator(); diff --git a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor index 9cd52ff2..f28731dc 100644 --- a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor +++ b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor @@ -50,24 +50,6 @@
-
- -
- -
-
-
- -
- -
-
@@ -126,8 +108,6 @@ private string _servertime = string.Empty; private string _installationid = string.Empty; - private string _runtime = string.Empty; - private string _rendermode = string.Empty; private string _detailederrors = string.Empty; private string _logginglevel = string.Empty; private string _swagger = string.Empty; @@ -146,8 +126,6 @@ _servertime = systeminfo["servertime"]; _installationid = systeminfo["installationid"]; - _runtime = systeminfo["runtime"]; - _rendermode = systeminfo["rendermode"]; _detailederrors = systeminfo["detailederrors"]; _logginglevel = systeminfo["logginglevel"]; _swagger = systeminfo["swagger"]; @@ -160,8 +138,6 @@ try { var settings = new Dictionary(); - settings.Add("runtime", _runtime); - settings.Add("rendermode", _rendermode); settings.Add("detailederrors", _detailederrors); settings.Add("logginglevel", _logginglevel); settings.Add("swagger", _swagger); diff --git a/Oqtane.Client/Modules/Admin/Themes/Add.razor b/Oqtane.Client/Modules/Admin/Themes/Add.razor index 1f810e9d..4d80e645 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Add.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Add.razor @@ -70,8 +70,7 @@
- - +
@@ -230,7 +229,7 @@ { try { - await PackageService.DownloadPackageAsync(_packageid, _version, "Packages"); + await PackageService.DownloadPackageAsync(_packageid, _version, Constants.PackagesFolder); await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _version); AddModuleMessage(Localizer["Success.Theme.Download"], MessageType.Success); _productname = ""; diff --git a/Oqtane.Client/Modules/Admin/Themes/Create.razor b/Oqtane.Client/Modules/Admin/Themes/Create.razor index f563c1ff..d472047c 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Create.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Create.razor @@ -11,55 +11,56 @@ @if (_templates != null) { -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- @if (!string.IsNullOrEmpty(_location)) { -
- -
- -
-
- } -
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ @if (!string.IsNullOrEmpty(_location)) + { +
+ +
+ +
+
+ } +

@SharedLocalizer["Cancel"] @@ -77,13 +78,17 @@ public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; - protected override async Task OnParametersSetAsync() + protected override void OnInitialized() + { + AddModuleMessage(Localizer["Info.Theme.CreatorIntent"], MessageType.Info); + } + + protected override async Task OnParametersSetAsync() { try { _templates = await ThemeService.GetThemeTemplatesAsync(); _versions = Constants.ReleaseVersions.Split(',').Where(item => Version.Parse(item).CompareTo(Version.Parse("2.0.0")) >= 0).ToArray(); - AddModuleMessage(Localizer["Info.Theme.CreatorIntent"], MessageType.Info); } catch (Exception ex) { diff --git a/Oqtane.Client/Modules/Admin/Themes/Index.razor b/Oqtane.Client/Modules/Admin/Themes/Index.razor index e656d4c6..5c089dfa 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Index.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Index.razor @@ -112,7 +112,7 @@ else { try { - await PackageService.DownloadPackageAsync(packagename, version, "Packages"); + await PackageService.DownloadPackageAsync(packagename, version, Constants.PackagesFolder); await logger.LogInformation("Theme Downloaded {ThemeName} {Version}", packagename, version); await ThemeService.InstallThemesAsync(); AddModuleMessage(string.Format(Localizer["Success.Theme.Install"], NavigateUrl("admin/system")), MessageType.Success); diff --git a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor index 52e6f01f..dbc733e0 100644 --- a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor +++ b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor @@ -26,7 +26,7 @@
- +
@@ -85,8 +85,8 @@ { try { - await PackageService.DownloadPackageAsync(packageid, version, "Packages"); - await PackageService.DownloadPackageAsync(Constants.UpdaterPackageId, version, "Packages"); + await PackageService.DownloadPackageAsync(packageid, version, Constants.PackagesFolder); + await PackageService.DownloadPackageAsync(Constants.UpdaterPackageId, version, Constants.PackagesFolder); AddModuleMessage(Localizer["Success.Framework.Download"], MessageType.Success); } catch (Exception ex) diff --git a/Oqtane.Client/Modules/Controls/AuditInfo.razor b/Oqtane.Client/Modules/Controls/AuditInfo.razor index 1584fd6e..d36e7f9a 100644 --- a/Oqtane.Client/Modules/Controls/AuditInfo.razor +++ b/Oqtane.Client/Modules/Controls/AuditInfo.razor @@ -35,6 +35,9 @@ [Parameter] public string Style { get; set; } + [Parameter] + public string DateTimeFormat { get; set; } = "MMM dd yyyy HH:mm:ss"; + protected override void OnParametersSet() { _text = string.Empty; @@ -49,7 +52,7 @@ if (CreatedOn != null) { - _text += $" {Localizer["On"]} {CreatedOn.Value.ToString("MMM dd yyyy HH:mm:ss")}"; + _text += $" {Localizer["On"]} {CreatedOn.Value.ToString(DateTimeFormat)}"; } _text += "

"; @@ -66,7 +69,7 @@ if (ModifiedOn != null) { - _text += $" {Localizer["on"]} {ModifiedOn.Value.ToString("MMM dd yyyy HH:mm:ss")}"; + _text += $" {Localizer["on"]} {ModifiedOn.Value.ToString(DateTimeFormat)}"; } _text += "

"; @@ -83,7 +86,7 @@ if (DeletedOn != null) { - _text += $" {Localizer["On"]} {DeletedOn.Value.ToString("MMM dd yyyy HH:mm:ss")}"; + _text += $" {Localizer["On"]} {DeletedOn.Value.ToString(DateTimeFormat)}"; } _text += "

"; diff --git a/Oqtane.Client/Modules/Controls/FileManager.razor b/Oqtane.Client/Modules/Controls/FileManager.razor index 9822859d..7cb80a1a 100644 --- a/Oqtane.Client/Modules/Controls/FileManager.razor +++ b/Oqtane.Client/Modules/Controls/FileManager.razor @@ -10,54 +10,62 @@
- @if (ShowFolders || FolderId <= 0) - { -
- -
- } - @if (ShowFiles) - { -
- -
- } - @if (ShowUpload && _haseditpermission) - { -
- @if (UploadMultiple) - { - - } - else - { - - } - - - - @if (ShowFiles && GetFileId() != -1) - { - - } - -
- } +
+ @if (ShowFolders) + { +
+
+ +
+
+ } + @if (ShowFiles) + { +
+
+ +
+
+ } + @if (ShowUpload && _haseditpermission) + { +
+
+ @if (UploadMultiple) + { + + } + else + { + + } +
+
+ + @if (ShowFiles && GetFileId() != -1) + { + + } +
+
+
+
+
+
+ } +
@if (_image != string.Empty) { @@ -68,8 +76,8 @@
@if (!string.IsNullOrEmpty(_message)) { -
-
+
+
@@ -96,10 +104,16 @@ public string Id { get; set; } // optional - for setting the id of the FileManager component for accessibility [Parameter] - public string Folder { get; set; } // optional - for setting a specific folder by default ( only relevant for host functions ) + public int FolderId { get; set; } = -1; // optional - for setting a specific default folder by folderid [Parameter] - public int FolderId { get; set; } = -1; // optional - for setting a specific folderid by default + public string Folder { get; set; } = ""; // optional - for setting a specific default folder by folder path + + [Parameter] + public int FileId { get; set; } = -1; // optional - for selecting a specific file by default + + [Parameter] + public string Filter { get; set; } // optional - comma delimited list of file types that can be selected or uploaded ie. "jpg,gif" [Parameter] public bool ShowFiles { get; set; } = true; // optional - for indicating whether a list of files should be displayed - default is true @@ -114,10 +128,7 @@ public bool ShowImage { get; set; } = true; // optional - for indicating whether an image thumbnail should be displayed - default is true [Parameter] - public int FileId { get; set; } = -1; // optional - for selecting a specific file by default - - [Parameter] - public string Filter { get; set; } // optional - comma delimited list of file types that can be selected or uploaded ie. "jpg,gif" + public bool ShowSuccess { get; set; } = false; // optional - for indicating whether a success message should be displayed upon successful upload - default is false [Parameter] public bool UploadMultiple { get; set; } = false; // optional - enable multiple file uploads - default false @@ -138,19 +149,35 @@ _id = Id; } + // packages folder is a framework folder for uploading installable nuget packages + if (Folder == Constants.PackagesFolder) + { + ShowFiles = false; + ShowFolders = false; + Filter = "nupkg"; + ShowSuccess = true; + } + if (!ShowFiles) { ShowImage = false; } - - if (!string.IsNullOrEmpty(Folder)) + + _folders = await FolderService.GetFoldersAsync(ModuleState.SiteId); + + if (!string.IsNullOrEmpty(Folder) && Folder != Constants.PackagesFolder) { - _folders = new List { new Folder { FolderId = -1, Name = Folder } }; - FolderId = -1; - } - else - { - _folders = await FolderService.GetFoldersAsync(ModuleState.SiteId); + Folder folder = await FolderService.GetFolderAsync(ModuleState.SiteId, Folder); + if (folder != null) + { + FolderId = folder.FolderId; + } + else + { + FolderId = -1; + _message = "Folder Path " + Folder + "Does Not Exist"; + _messagetype = MessageType.Error; + } } if (FileId != -1) @@ -164,6 +191,8 @@ else { FileId = -1; // file does not exist + _message = "FileId " + FileId.ToString() + "Does Not Exist"; + _messagetype = MessageType.Error; } } @@ -186,10 +215,10 @@ private async Task GetFiles() { _haseditpermission = false; - if (!string.IsNullOrEmpty(Folder)) + if (Folder == Constants.PackagesFolder) { _haseditpermission = UserSecurity.IsAuthorized(PageState.User, RoleNames.Host); - _files = await FileService.GetFilesAsync(Folder); + _files = new List(); } else { @@ -234,7 +263,6 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Files {Error}", ex.Message); - _message = Localizer["Error.File.Load"]; _messagetype = MessageType.Error; } @@ -286,7 +314,7 @@ try { string result; - if (!string.IsNullOrEmpty(Folder)) + if (Folder == Constants.PackagesFolder) { result = await FileService.UploadFilesAsync(Folder, upload, _guid); } @@ -298,9 +326,11 @@ if (result == string.Empty) { await logger.LogInformation("File Upload Succeeded {Files}", upload); - - _message = Localizer["Success.File.Upload"]; - _messagetype = MessageType.Success; + if (ShowSuccess) + { + _message = Localizer["Success.File.Upload"]; + _messagetype = MessageType.Success; + } // set FileId to first file in upload collection await GetFiles(); @@ -364,5 +394,7 @@ public int GetFileId() => FileId; + public int GetFolderId() => FolderId; + public File GetFile() => _file; } diff --git a/Oqtane.Client/Modules/Controls/Pager.razor b/Oqtane.Client/Modules/Controls/Pager.razor index 464431dd..fec95246 100644 --- a/Oqtane.Client/Modules/Controls/Pager.razor +++ b/Oqtane.Client/Modules/Controls/Pager.razor @@ -10,7 +10,7 @@
  • UpdateList(1))>
  • - @if (_pages > _displayPages) + @if (_pages > _displayPages && _displayPages > 1) {
  • SkipPages("back"))> @@ -38,7 +38,7 @@
  • NavigateToPage("next"))>
  • - @if (_pages > _displayPages) + @if (_pages > _displayPages && _displayPages > 1) {
  • SkipPages("forward"))> @@ -48,7 +48,7 @@ UpdateList(_pages))>
  • - Page @_page of @_pages + Page @_page of @_pages
  • } @@ -215,7 +215,7 @@ } else { - Class = "container"; + Class = "container-fluid px-0"; } } diff --git a/Oqtane.Client/Modules/Controls/TabPanel.razor b/Oqtane.Client/Modules/Controls/TabPanel.razor index d6be85f6..4fd1cf6a 100644 --- a/Oqtane.Client/Modules/Controls/TabPanel.razor +++ b/Oqtane.Client/Modules/Controls/TabPanel.razor @@ -38,11 +38,7 @@ else if (string.IsNullOrEmpty(Heading)) { - Name = Localize(nameof(Name), Name); - } - else - { - Heading = Localize(nameof(Heading), Heading); + Heading = Localize(nameof(Name), Name); } } diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index c4c5bef9..5691a4f2 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -30,8 +30,8 @@ namespace Oqtane.Modules [CascadingParameter] protected Module ModuleState { get; set; } - [CascadingParameter] - protected ModuleInstance ModuleInstance { get; set; } + [Parameter] + public ModuleInstance ModuleInstance { get; set; } // optional interface properties public virtual SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.View; } set { } } // default security diff --git a/Oqtane.Client/Oqtane.Client.csproj b/Oqtane.Client/Oqtane.Client.csproj index c741a1fa..21f56ced 100644 --- a/Oqtane.Client/Oqtane.Client.csproj +++ b/Oqtane.Client/Oqtane.Client.csproj @@ -1,11 +1,11 @@ - net5.0 + net6.0 Exe 3.0 Debug;Release - 2.3.1 + 3.0.0 Oqtane Shaun Walker .NET Foundation @@ -13,7 +13,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v2.3.1 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.0.0 https://github.com/oqtane/oqtane.framework Git Oqtane @@ -22,12 +22,12 @@ - - - + + + - - + + diff --git a/Oqtane.Client/Program.cs b/Oqtane.Client/Program.cs index f27f0c2e..68bcc7a2 100644 --- a/Oqtane.Client/Program.cs +++ b/Oqtane.Client/Program.cs @@ -24,7 +24,6 @@ namespace Oqtane.Client public static async Task Main(string[] args) { var builder = WebAssemblyHostBuilder.CreateDefault(args); - builder.RootComponents.Add("app"); var httpClient = new HttpClient {BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)}; diff --git a/Oqtane.Client/Resources/Installer/Controls/SqlServerConfig.resx b/Oqtane.Client/Resources/Installer/Controls/SqlServerConfig.resx index b37a6487..b211c6aa 100644 --- a/Oqtane.Client/Resources/Installer/Controls/SqlServerConfig.resx +++ b/Oqtane.Client/Resources/Installer/Controls/SqlServerConfig.resx @@ -153,4 +153,22 @@ Integrated + + Encryption: + + + Specify if you are using an encrypted database connection. It is highly recommended to use encryption in a production environment. + + + Self Signed + + + Specify the type of certificate you are using for encryption + + + Trust Server Certificate: + + + Verifiable + \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx index 5f2f31e5..b29a4f1e 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx @@ -181,7 +181,7 @@ Select whether the page is part of the site navigation or hidden - Optionally enter a url path for this page (ie. home ). If you do not provide a url path, the page name will be used. + Optionally enter a url path for this page (ie. home ). If you do not provide a url path, the page name will be used. If the page is intended to be the root path specify '/'. Optionally enter a url which this page should redirect to when a user navigates to it diff --git a/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx index ab2903cd..55987b3c 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx @@ -169,7 +169,7 @@ Select whether the page is part of the site navigation or hidden - Optionally enter a url path for this page (ie. home ). If you do not provide a url path, the page name will be used. + Optionally enter a url path for this page (ie. home ). If you do not provide a url path, the page name will be used. If the page is intended to be the root path specify '/'. Optionally enter a url which this page should redirect to when a user navigates to it diff --git a/Oqtane.Client/Resources/Modules/Admin/Pages/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Pages/Index.resx index 9d1d643a..a05c2e9b 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Pages/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Pages/Index.resx @@ -129,4 +129,7 @@ Delete Page + + Browse + \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx index 74882e86..3404baa2 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx @@ -169,7 +169,7 @@ Enter the tenant for the site - Enter the alias for the server + The aliases for the site. An alias can be a domain name (www.site.com) or a virtual folder (ie. www.site.com/folder). If a site has multiple aliases they should be separated by commas. Do you want the users to be able to register for an account on the site @@ -282,4 +282,22 @@ Select Theme + + Hosting Model + + + Specifies if the site should be prerendered (for search crawlers, etc...) + + + Prerender? + + + The Blazor runtime hosting model + + + Runtime: + + + Browse + \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/Sites/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Sites/Add.resx index e0300472..b939b88a 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Sites/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Sites/Add.resx @@ -1,4 +1,4 @@ - +