diff --git a/Oqtane.Client/Modules/Admin/Files/Details.razor b/Oqtane.Client/Modules/Admin/Files/Details.razor index 56eca8c7..af70abc6 100644 --- a/Oqtane.Client/Modules/Admin/Files/Details.razor +++ b/Oqtane.Client/Modules/Admin/Files/Details.razor @@ -66,6 +66,12 @@ public override string Title => "File Management"; + protected override void OnParametersSet() + { + base.OnParametersSet(); + base.SetModuleTitle(Localizer["ModuleTitle.Text"]); + } + protected override async Task OnInitializedAsync() { try diff --git a/Oqtane.Client/Modules/Admin/Files/Edit.razor b/Oqtane.Client/Modules/Admin/Files/Edit.razor index 4a252b11..c5030a31 100644 --- a/Oqtane.Client/Modules/Admin/Files/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Files/Edit.razor @@ -110,8 +110,13 @@ public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; - public override string Title => "Folder Management"; + public override string Title => "Folder Management"; + protected override void OnParametersSet() + { + base.OnParametersSet(); + base.SetModuleTitle(Localizer["ModuleTitle.Text"]); + } protected override async Task OnInitializedAsync() { try diff --git a/Oqtane.Client/Modules/Admin/Jobs/Index.razor b/Oqtane.Client/Modules/Admin/Jobs/Index.razor index 2ae6e15c..9b217d07 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Index.razor @@ -11,7 +11,7 @@ else { - +

diff --git a/Oqtane.Client/Modules/Admin/Languages/Add.razor b/Oqtane.Client/Modules/Admin/Languages/Add.razor index 00c1e0cc..d8a52f33 100644 --- a/Oqtane.Client/Modules/Admin/Languages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Languages/Add.razor @@ -16,7 +16,7 @@ else { - +
@@ -45,7 +45,7 @@ else @SharedLocalizer["Cancel"] - +
diff --git a/Oqtane.Client/Modules/Admin/Login/Index.razor b/Oqtane.Client/Modules/Admin/Login/Index.razor index a7a92ffd..850072f1 100644 --- a/Oqtane.Client/Modules/Admin/Login/Index.razor +++ b/Oqtane.Client/Modules/Admin/Login/Index.razor @@ -11,9 +11,6 @@ ... - -
@Localizer["Info.SignedIn"]
-
@if (!twofactor) { @@ -69,259 +66,265 @@ @code { - private bool _allowsitelogin = true; - private bool _allowexternallogin = false; - private ElementReference login; - private bool validated = false; - private bool twofactor = false; - private string _username = string.Empty; - private ElementReference username; - private string _password = string.Empty; - private string _passwordtype = "password"; - private string _togglepassword = string.Empty; - private bool _remember = false; - private string _code = string.Empty; + private bool _allowsitelogin = true; + private bool _allowexternallogin = false; + private ElementReference login; + private bool validated = false; + private bool twofactor = false; + private string _username = string.Empty; + private ElementReference username; + private string _password = string.Empty; + private string _passwordtype = "password"; + private string _togglepassword = string.Empty; + private bool _remember = false; + private string _code = string.Empty; - private string _returnUrl = string.Empty; + private string _returnUrl = string.Empty; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; - public override List Resources => new List() + public override List Resources => new List() { new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" } }; - protected override async Task OnInitializedAsync() - { - try - { - _togglepassword = SharedLocalizer["ShowPassword"]; + protected override async Task OnInitializedAsync() + { + try + { + _togglepassword = SharedLocalizer["ShowPassword"]; - if (PageState.Site.Settings.ContainsKey("LoginOptions:AllowSiteLogin") && !string.IsNullOrEmpty(PageState.Site.Settings["LoginOptions:AllowSiteLogin"])) - { - _allowsitelogin = bool.Parse(PageState.Site.Settings["LoginOptions:AllowSiteLogin"]); - } + if (PageState.Site.Settings.ContainsKey("LoginOptions:AllowSiteLogin") && !string.IsNullOrEmpty(PageState.Site.Settings["LoginOptions:AllowSiteLogin"])) + { + _allowsitelogin = bool.Parse(PageState.Site.Settings["LoginOptions:AllowSiteLogin"]); + } - if (PageState.Site.Settings.ContainsKey("ExternalLogin:ProviderType") && !string.IsNullOrEmpty(PageState.Site.Settings["ExternalLogin:ProviderType"])) - { - _allowexternallogin = true; - } + if (PageState.Site.Settings.ContainsKey("ExternalLogin:ProviderType") && !string.IsNullOrEmpty(PageState.Site.Settings["ExternalLogin:ProviderType"])) + { + _allowexternallogin = true; + } - if (PageState.QueryString.ContainsKey("returnurl")) - { - _returnUrl = PageState.QueryString["returnurl"]; - } + if (PageState.QueryString.ContainsKey("returnurl")) + { + _returnUrl = PageState.QueryString["returnurl"]; + } - if (PageState.QueryString.ContainsKey("name")) - { - _username = PageState.QueryString["name"]; - } + if (PageState.QueryString.ContainsKey("name")) + { + _username = PageState.QueryString["name"]; + } - if (PageState.QueryString.ContainsKey("token") && !string.IsNullOrEmpty(_username)) - { - var user = new User(); - user.SiteId = PageState.Site.SiteId; - user.Username = _username; + if (PageState.QueryString.ContainsKey("token") && !string.IsNullOrEmpty(_username)) + { + var user = new User(); + user.SiteId = PageState.Site.SiteId; + user.Username = _username; - if (PageState.QueryString.ContainsKey("key")) - { - user = await UserService.LinkUserAsync(user, PageState.QueryString["token"], PageState.Site.Settings["ExternalLogin:ProviderType"], PageState.QueryString["key"], PageState.Site.Settings["ExternalLogin:ProviderName"]); - if (user != null) - { - await logger.LogInformation(LogFunction.Security, "External Login Linkage Successful For Username {Username}", _username); - AddModuleMessage(Localizer["Success.Account.Linked"], MessageType.Info); - } - else - { - await logger.LogError(LogFunction.Security, "External Login Linkage Failed For Username {Username}", _username); - AddModuleMessage(Localizer["Message.Account.NotLinked"], MessageType.Warning); - } - _username = ""; - } - else - { - user = await UserService.VerifyEmailAsync(user, PageState.QueryString["token"]); - if (user != null) - { - await logger.LogInformation(LogFunction.Security, "Email Verified For For Username {Username}", _username); - AddModuleMessage(Localizer["Success.Account.Verified"], MessageType.Info); - } - else - { - await logger.LogError(LogFunction.Security, "Email Verification Failed For Username {Username}", _username); - AddModuleMessage(Localizer["Message.Account.NotVerified"], MessageType.Warning); - } - } - } - else - { - if (PageState.QueryString.ContainsKey("status")) - { - AddModuleMessage(Localizer["ExternalLoginStatus." + PageState.QueryString["status"]], MessageType.Info); - } - } - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading Login {Error}", ex.Message); - AddModuleMessage(Localizer["Error.LoadLogin"], MessageType.Error); - } - } + if (PageState.QueryString.ContainsKey("key")) + { + user = await UserService.LinkUserAsync(user, PageState.QueryString["token"], PageState.Site.Settings["ExternalLogin:ProviderType"], PageState.QueryString["key"], PageState.Site.Settings["ExternalLogin:ProviderName"]); + if (user != null) + { + await logger.LogInformation(LogFunction.Security, "External Login Linkage Successful For Username {Username}", _username); + AddModuleMessage(Localizer["Success.Account.Linked"], MessageType.Info); + } + else + { + await logger.LogError(LogFunction.Security, "External Login Linkage Failed For Username {Username}", _username); + AddModuleMessage(Localizer["Message.Account.NotLinked"], MessageType.Warning); + } + _username = ""; + } + else + { + user = await UserService.VerifyEmailAsync(user, PageState.QueryString["token"]); + if (user != null) + { + await logger.LogInformation(LogFunction.Security, "Email Verified For For Username {Username}", _username); + AddModuleMessage(Localizer["Success.Account.Verified"], MessageType.Info); + } + else + { + await logger.LogError(LogFunction.Security, "Email Verification Failed For Username {Username}", _username); + AddModuleMessage(Localizer["Message.Account.NotVerified"], MessageType.Warning); + } + } + } + else + { + if (PageState.QueryString.ContainsKey("status")) + { + AddModuleMessage(Localizer["ExternalLoginStatus." + PageState.QueryString["status"]], MessageType.Info); + } + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Login {Error}", ex.Message); + AddModuleMessage(Localizer["Error.LoadLogin"], MessageType.Error); + } + } - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if (firstRender && PageState.User == null) - { - await username.FocusAsync(); - } - } + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender && PageState.User == null) + { + await username.FocusAsync(); + } - private async Task Login() - { - try - { - validated = true; - var interop = new Interop(JSRuntime); - if (await interop.FormValid(login)) - { - var hybrid = (PageState.Runtime == Shared.Runtime.Hybrid); - var user = new User { SiteId = PageState.Site.SiteId, Username = _username, Password = _password, LastIPAddress = SiteState.RemoteIPAddress}; - - if (!twofactor) - { - user = await UserService.LoginUserAsync(user, hybrid, _remember); - } - else - { - user = await UserService.VerifyTwoFactorAsync(user, _code); - } + // redirect logged in user to specified page + if (PageState.User != null) + { + NavigationManager.NavigateTo(PageState.ReturnUrl); + } + } - if (user.IsAuthenticated) - { - await logger.LogInformation(LogFunction.Security, "Login Successful For Username {Username}", _username); + private async Task Login() + { + try + { + validated = true; + var interop = new Interop(JSRuntime); + if (await interop.FormValid(login)) + { + var hybrid = (PageState.Runtime == Shared.Runtime.Hybrid); + var user = new User { SiteId = PageState.Site.SiteId, Username = _username, Password = _password, LastIPAddress = SiteState.RemoteIPAddress}; - if (hybrid) - { - // hybrid apps utilize an interactive login - var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider - .GetService(typeof(IdentityAuthenticationStateProvider)); - authstateprovider.NotifyAuthenticationChanged(); - NavigationManager.NavigateTo(NavigateUrl(WebUtility.UrlDecode(_returnUrl), true)); - } - else - { - // post back to the Login page so that the cookies are set correctly - var fields = new { __RequestVerificationToken = SiteState.AntiForgeryToken, username = _username, password = _password, remember = _remember, returnurl = _returnUrl }; - string url = Utilities.TenantUrl(PageState.Alias, "/pages/login/"); - await interop.SubmitForm(url, fields); - } - } - else - { - if ((PageState.Site.Settings.ContainsKey("LoginOptions:TwoFactor") && PageState.Site.Settings["LoginOptions:TwoFactor"] == "required") || user.TwoFactorRequired) - { - twofactor = true; - validated = false; - AddModuleMessage(Localizer["Message.TwoFactor"], MessageType.Info); - } - else - { - if (!twofactor) - { - await logger.LogInformation(LogFunction.Security, "Login Failed For Username {Username}", _username); - AddModuleMessage(Localizer["Error.Login.Fail"], MessageType.Error); - } - else - { - await logger.LogInformation(LogFunction.Security, "Two Factor Verification Failed For Username {Username}", _username); - AddModuleMessage(Localizer["Error.TwoFactor.Fail"], MessageType.Error); - } - } - } - } - else - { - AddModuleMessage(Localizer["Message.Required.UserInfo"], MessageType.Warning); - } - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Performing Login {Error}", ex.Message); - AddModuleMessage(Localizer["Error.Login"], MessageType.Error); - } - } + if (!twofactor) + { + user = await UserService.LoginUserAsync(user, hybrid, _remember); + } + else + { + user = await UserService.VerifyTwoFactorAsync(user, _code); + } - private void Cancel() - { - NavigationManager.NavigateTo(_returnUrl); - } + if (user.IsAuthenticated) + { + await logger.LogInformation(LogFunction.Security, "Login Successful For Username {Username}", _username); - private async Task Forgot() - { - try - { - if (_username != string.Empty) - { - var user = await UserService.GetUserAsync(_username, PageState.Site.SiteId); - if (user != null) - { - await UserService.ForgotPasswordAsync(user); - await logger.LogInformation(LogFunction.Security, "Password Reset Notification Sent For Username {Username}", _username); - AddModuleMessage(Localizer["Message.ForgotUser"], MessageType.Info); - } - else - { - AddModuleMessage(Localizer["Message.UserDoesNotExist"], MessageType.Warning); - } - } - else - { - AddModuleMessage(Localizer["Message.ForgotPassword"], MessageType.Info); - } + if (hybrid) + { + // hybrid apps utilize an interactive login + var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider + .GetService(typeof(IdentityAuthenticationStateProvider)); + authstateprovider.NotifyAuthenticationChanged(); + NavigationManager.NavigateTo(NavigateUrl(WebUtility.UrlDecode(_returnUrl), true)); + } + else + { + // post back to the Login page so that the cookies are set correctly + var fields = new { __RequestVerificationToken = SiteState.AntiForgeryToken, username = _username, password = _password, remember = _remember, returnurl = _returnUrl }; + string url = Utilities.TenantUrl(PageState.Alias, "/pages/login/"); + await interop.SubmitForm(url, fields); + } + } + else + { + if ((PageState.Site.Settings.ContainsKey("LoginOptions:TwoFactor") && PageState.Site.Settings["LoginOptions:TwoFactor"] == "required") || user.TwoFactorRequired) + { + twofactor = true; + validated = false; + AddModuleMessage(Localizer["Message.TwoFactor"], MessageType.Info); + } + else + { + if (!twofactor) + { + await logger.LogInformation(LogFunction.Security, "Login Failed For Username {Username}", _username); + AddModuleMessage(Localizer["Error.Login.Fail"], MessageType.Error); + } + else + { + await logger.LogInformation(LogFunction.Security, "Two Factor Verification Failed For Username {Username}", _username); + AddModuleMessage(Localizer["Error.TwoFactor.Fail"], MessageType.Error); + } + } + } + } + else + { + AddModuleMessage(Localizer["Message.Required.UserInfo"], MessageType.Warning); + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Performing Login {Error}", ex.Message); + AddModuleMessage(Localizer["Error.Login"], MessageType.Error); + } + } - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Resetting Password {Error}", ex.Message); - AddModuleMessage(Localizer["Error.ResetPassword"], MessageType.Error); - } - } + private void Cancel() + { + NavigationManager.NavigateTo(_returnUrl); + } - private void Reset() - { - twofactor = false; - _username = ""; - _password = ""; - ClearModuleMessage(); - StateHasChanged(); - } + private async Task Forgot() + { + try + { + if (_username != string.Empty) + { + var user = await UserService.GetUserAsync(_username, PageState.Site.SiteId); + if (user != null) + { + await UserService.ForgotPasswordAsync(user); + await logger.LogInformation(LogFunction.Security, "Password Reset Notification Sent For Username {Username}", _username); + AddModuleMessage(Localizer["Message.ForgotUser"], MessageType.Info); + } + else + { + AddModuleMessage(Localizer["Message.UserDoesNotExist"], MessageType.Warning); + } + } + else + { + AddModuleMessage(Localizer["Message.ForgotPassword"], MessageType.Info); + } - private async Task KeyPressed(KeyboardEventArgs e) - { - if (e.Code == "Enter" || e.Code == "NumpadEnter") - { - await Login(); - } - } + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Resetting Password {Error}", ex.Message); + AddModuleMessage(Localizer["Error.ResetPassword"], MessageType.Error); + } + } - private void TogglePassword() - { - if (_passwordtype == "password") - { - _passwordtype = "text"; - _togglepassword = SharedLocalizer["HidePassword"]; - } - else - { - _passwordtype = "password"; - _togglepassword = SharedLocalizer["ShowPassword"]; - } - } + private void Reset() + { + twofactor = false; + _username = ""; + _password = ""; + ClearModuleMessage(); + StateHasChanged(); + } - private void ExternalLogin() - { + private async Task KeyPressed(KeyboardEventArgs e) + { + if (e.Code == "Enter" || e.Code == "NumpadEnter") + { + await Login(); + } + } + + private void TogglePassword() + { + if (_passwordtype == "password") + { + _passwordtype = "text"; + _togglepassword = SharedLocalizer["HidePassword"]; + } + else + { + _passwordtype = "password"; + _togglepassword = SharedLocalizer["ShowPassword"]; + } + } + + private void ExternalLogin() + { NavigationManager.NavigateTo(Utilities.TenantUrl(PageState.Alias, "/pages/external?returnurl=" + _returnUrl), true); - } + } } diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor index 700978fc..6e2992ec 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -10,65 +10,110 @@
-
+
+
+ + +
+
+ + +
+
+
+
+
- + @Localizer["Product"]
- - @if (_packages != null) - { - if (_packages.Count > 0) - { - - - -

@context.Name

  by:  @context.Owner
- @(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description)
- @(String.Format("{0:n0}", context.Downloads)) @SharedLocalizer["Search.Downloads"]  |   - @SharedLocalizer["Search.Released"]: @context.ReleaseDate.ToString("MMM dd, yyyy")  |   - @SharedLocalizer["Search.Version"]: @context.Version - @((MarkupString)(!string.IsNullOrEmpty(context.PackageUrl) ? "  |  " + SharedLocalizer["Search.Source"] + ": " + new Uri(context.PackageUrl).Host + "" : "")) - @((MarkupString)(context.TrialPeriod > 0 ? "  |  " + context.TrialPeriod + " " + @SharedLocalizer["Trial"] + "" : "")) - - - @if (context.Price != null && !string.IsNullOrEmpty(context.PackageUrl)) - { - - } - - - @if (context.Price != null && !string.IsNullOrEmpty(context.PaymentUrl)) - { - @context.Price.Value.ToString("$#,##0.00") - } - else - { - - } - -
-
- } - else - { -
-
- @Localizer["Search.NoResults"] -
- } - } +
+
+ @if (_initialized) + { +
+
+
+

@((_packages != null) ? _packages.Count : 0) @SharedLocalizer["Search.Results"]

+
+
+   +
+
+ +
+
+ + +
+
+
+
+ @if (context.LogoFileId != null) + { + @context.Name + } + else + { + @context.Name + } +
+
+ @SharedLocalizer["Search.Version"]: @context.Version +
@SharedLocalizer["Search.Downloads"]: @(String.Format("{0:n0}", context.Downloads)) +
@SharedLocalizer["Search.Released"]: @context.ReleaseDate.ToString("MM/dd/yyyy") + @if (!string.IsNullOrEmpty(context.PackageUrl)) + { +
@SharedLocalizer["Search.Source"]: @(new Uri(context.PackageUrl).Host) + } +
+
+
+
+

@context.Name


+ @SharedLocalizer["Search.By"]: @context.Owner
+ @(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description)
+ @if (context.Price != null && !string.IsNullOrEmpty(context.PaymentUrl)) + { + @SharedLocalizer["Search.Price"]: @context.Price.Value.ToString("$#,##0.00") + @((MarkupString)(context.TrialPeriod > 0 ? " (" + context.TrialPeriod + " Day Trial)" : "")) + } +
+ @if (!string.IsNullOrEmpty(context.PackageUrl)) + { + + } + @if (context.Price != null && !string.IsNullOrEmpty(context.PaymentUrl)) + { + @SharedLocalizer["Buy"] + } +
+
+
+
+
+
+
+ } +
+

- +
@@ -116,8 +161,10 @@ @SharedLocalizer["Cancel"] @code { + private bool _initialized = false; private List _packages; private string _price = "free"; + private string _sort = "popularity"; private string _search = ""; private string _productname = ""; private string _packageid = ""; @@ -131,6 +178,7 @@ try { await LoadModuleDefinitions(); + _initialized = true; } catch (Exception ex) { @@ -141,8 +189,10 @@ private async Task LoadModuleDefinitions() { + ShowProgressIndicator(); + var moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); - _packages = await PackageService.GetPackagesAsync("module", _search, _price, ""); + _packages = await PackageService.GetPackagesAsync("module", _search, _price, "", _sort); if (_packages != null) { @@ -154,21 +204,22 @@ } } } + + HideProgressIndicator(); } - private async void PriceChanged(ChangeEventArgs e) + private string GetLogo(int fileid) { - try - { - _price = (string)e.Value; - _search = ""; - await LoadModuleDefinitions(); - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error On PriceChanged"); - } + var url = ImageUrl(fileid, 100, 100); + url = (!string.IsNullOrEmpty(PageState.Alias.Path)) ? url.Substring(PageState.Alias.Path.Length + 1) : url; + return Constants.PackageRegistryUrl + url; + } + + private async void PriceChanged(string price) + { + _price = price; + await LoadModuleDefinitions(); + StateHasChanged(); } private async Task Search() @@ -196,6 +247,12 @@ } } + private async void SortChanged(ChangeEventArgs e) + { + _sort = (string)e.Value; + await LoadModuleDefinitions(); + } + private void HideModal() { _productname = ""; diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor index 57380333..751a9312 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor @@ -80,7 +80,7 @@ else } - @((MarkupString)SupportLink(context.PackageName)) + @((MarkupString)SupportLink(context.PackageName, context.Version)) @((MarkupString)PurchaseLink(context.PackageName)) @@ -145,7 +145,7 @@ else return link; } - private string SupportLink(string packagename) + private string SupportLink(string packagename, string version) { string link = ""; if (!string.IsNullOrEmpty(packagename) && _packages != null) @@ -153,7 +153,7 @@ else var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault(); if (package != null && !string.IsNullOrEmpty(package.SupportUrl)) { - link += "" + SharedLocalizer["Help"] + ""; + link += "" + SharedLocalizer["Help"] + ""; } } return link; diff --git a/Oqtane.Client/Modules/Admin/Modules/Export.razor b/Oqtane.Client/Modules/Admin/Modules/Export.razor index 6afb875b..fc1ca548 100644 --- a/Oqtane.Client/Modules/Admin/Modules/Export.razor +++ b/Oqtane.Client/Modules/Admin/Modules/Export.razor @@ -22,6 +22,11 @@ public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; public override string Title => "Export Content"; + protected override void OnParametersSet() + { + base.OnParametersSet(); + base.SetModuleTitle(Localizer["ModuleTitle.Text"]); + } private async Task ExportModule() { diff --git a/Oqtane.Client/Modules/Admin/Modules/Import.razor b/Oqtane.Client/Modules/Admin/Modules/Import.razor index 961157eb..83468d1e 100644 --- a/Oqtane.Client/Modules/Admin/Modules/Import.razor +++ b/Oqtane.Client/Modules/Admin/Modules/Import.razor @@ -28,6 +28,11 @@ public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; public override string Title => "Import Content"; + protected override void OnParametersSet() + { + base.OnParametersSet(); + base.SetModuleTitle(Localizer["ModuleTitle.Text"]); + } private async Task ImportModule() { validated = true; diff --git a/Oqtane.Client/Modules/Admin/Modules/Settings.razor b/Oqtane.Client/Modules/Admin/Modules/Settings.razor index 9798c2f9..fe01bca9 100644 --- a/Oqtane.Client/Modules/Admin/Modules/Settings.razor +++ b/Oqtane.Client/Modules/Admin/Modules/Settings.razor @@ -130,6 +130,11 @@ private string modifiedby; private DateTime modifiedon; + protected override void OnParametersSet() + { + base.OnParametersSet(); + base.SetModuleTitle(Localizer["ModuleTitle.Text"]); + } protected override void OnInitialized() { _module = ModuleState.ModuleDefinition.Name; diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index c91be528..647077d1 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -10,7 +10,7 @@ {
- +
@@ -126,7 +126,7 @@
-
+
@@ -158,7 +158,7 @@
-
+
@@ -175,7 +175,7 @@
- +
@@ -184,7 +184,7 @@ @if (_themeSettingsType != null) { - + @ThemeSettingsComponent } diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index bd55624a..67ec9e59 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -14,7 +14,7 @@ @if (_page.UserId == null) { - +
@@ -137,7 +137,7 @@
-
+
@@ -189,7 +189,7 @@
- +
@@ -224,7 +224,7 @@ else { - +
diff --git a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor index acf61a87..1d88dcf8 100644 --- a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor +++ b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor @@ -14,7 +14,7 @@ else { - + @if (!_pages.Where(item => item.IsDeleted).Any()) {
@@ -31,7 +31,7 @@ else @Localizer["DeletedOn"] - + @context.Name @context.DeletedBy @@ -42,7 +42,7 @@ else }
- + @if (!_modules.Where(item => item.IsDeleted).Any()) {
diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 6589f770..e237bd74 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -26,7 +26,7 @@
+ +
+
+ + +
+
+
+
+
- + Product
+
+
+ @if (_initialized) + { +
+
+
+

@((_packages != null) ? _packages.Count : 0) @SharedLocalizer["Search.Results"]

+
+
+   +
+
+ +
+
+ + +
+
+
+
+ @if (context.LogoFileId != null) + { + @context.Name + } + else + { + @context.Name + } +
+
+ @SharedLocalizer["Search.Version"]: @context.Version +
@SharedLocalizer["Search.Downloads"]: @(String.Format("{0:n0}", context.Downloads)) +
@SharedLocalizer["Search.Released"]: @context.ReleaseDate.ToString("MM/dd/yyyy") + @if (!string.IsNullOrEmpty(context.PackageUrl)) + { +
- @if (_packages != null) - { - if (_packages.Count > 0) - { - - - -

@context.Name

  @SharedLocalizer["Search.By"]:  @context.Owner
- @(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description)
- @(String.Format("{0:n0}", context.Downloads)) @SharedLocalizer["Search.Downloads"]  |   - @SharedLocalizer["Search.Released"]: @context.ReleaseDate.ToString("MMM dd, yyyy")  |   - @SharedLocalizer["Search.Version"]: @context.Version - @((MarkupString)(!string.IsNullOrEmpty(context.PackageUrl) ? "  |  " + SharedLocalizer["Search.Source"] + ": " + new Uri(context.PackageUrl).Host + "" : "")) - @((MarkupString)(context.TrialPeriod > 0 ? "  |  " + context.TrialPeriod + " " + @SharedLocalizer["Trial"] + "" : "")) - - - @if (context.Price != null && !string.IsNullOrEmpty(context.PackageUrl)) - { - - } - - - @if (context.Price != null && !string.IsNullOrEmpty(context.PaymentUrl)) - { - @context.Price.Value.ToString("$#,##0.00") - } - else - { - - } - -
-
- } - else - { -
-
- @Localizer["Search.NoResults"] -
- } - } + @SharedLocalizer["Search.Source"]: @(new Uri(context.PackageUrl).Host) + } +
+
+
+
+

@context.Name


+ @SharedLocalizer["Search.By"]: @context.Owner
+ @(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description)
+ @if (context.Price != null && !string.IsNullOrEmpty(context.PaymentUrl)) + { + @SharedLocalizer["Search.Price"]: @context.Price.Value.ToString("$#,##0.00") + @((MarkupString)(context.TrialPeriod > 0 ? " (" + context.TrialPeriod + " Day Trial)" : "")) + } +
+ @if (!string.IsNullOrEmpty(context.PackageUrl)) + { + + } + @if (context.Price != null && !string.IsNullOrEmpty(context.PaymentUrl)) + { + @SharedLocalizer["Buy"] + } +
+
+
+
+
+
+
+ } +
+

@@ -116,8 +163,10 @@ @SharedLocalizer["Cancel"] @code { + private bool _initialized = false; private List _packages; private string _price = "free"; + private string _sort = "popularity"; private string _search = ""; private string _productname = ""; private string _license = ""; @@ -131,6 +180,7 @@ try { await LoadThemes(); + _initialized = true; } catch (Exception ex) { @@ -141,8 +191,10 @@ private async Task LoadThemes() { + ShowProgressIndicator(); + var themes = await ThemeService.GetThemesAsync(); - _packages = await PackageService.GetPackagesAsync("theme", _search, _price, ""); + _packages = await PackageService.GetPackagesAsync("theme", _search, _price, "", _sort); if (_packages != null) { @@ -154,21 +206,22 @@ } } } + + HideProgressIndicator(); } - private async void PriceChanged(ChangeEventArgs e) + private string GetLogo(int fileid) { - try - { - _price = (string)e.Value; - _search = ""; - await LoadThemes(); - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error On PriceChanged"); - } + var url = ImageUrl(fileid, 100, 100); + url = (!string.IsNullOrEmpty(PageState.Alias.Path)) ? url.Substring(PageState.Alias.Path.Length + 1) : url; + return Constants.PackageRegistryUrl + url; + } + + private async void PriceChanged(string price) + { + _price = price; + await LoadThemes(); + StateHasChanged(); } private async Task Search() @@ -196,6 +249,12 @@ } } + private async void SortChanged(ChangeEventArgs e) + { + _sort = (string)e.Value; + await LoadThemes(); + } + private void HideModal() { _productname = ""; diff --git a/Oqtane.Client/Modules/Admin/Themes/Edit.razor b/Oqtane.Client/Modules/Admin/Themes/Edit.razor index 00e22f29..c8c81a1d 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Edit.razor @@ -27,7 +27,7 @@
-
+
diff --git a/Oqtane.Client/Modules/Admin/Themes/Index.razor b/Oqtane.Client/Modules/Admin/Themes/Index.razor index 4113ded9..198889fe 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Index.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Index.razor @@ -13,7 +13,7 @@ } else { - + @((MarkupString)" ") @@ -49,7 +49,7 @@ else } - @((MarkupString)SupportLink(context.PackageName)) + @((MarkupString)SupportLink(context.PackageName, context.Version)) @((MarkupString)PurchaseLink(context.PackageName)) @@ -112,7 +112,7 @@ else return link; } - private string SupportLink(string packagename) + private string SupportLink(string packagename, string version) { string link = ""; if (!string.IsNullOrEmpty(packagename) && _packages != null) @@ -120,7 +120,7 @@ else var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault(); if (package != null && !string.IsNullOrEmpty(package.SupportUrl)) { - link += "" + SharedLocalizer["Help"] + ""; + link += "" + SharedLocalizer["Help"] + ""; } } return link; diff --git a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor index dbc733e0..5bf8d48e 100644 --- a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor +++ b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor @@ -17,11 +17,11 @@ } else { - + } - +
diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Add.razor b/Oqtane.Client/Modules/Admin/UserProfile/Add.razor index ceeb2713..fb3c8209 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Add.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Add.razor @@ -42,6 +42,12 @@ public override string Title => "Send Notification"; + protected override void OnParametersSet() + { + base.OnParametersSet(); + base.SetModuleTitle(Localizer["ModuleTitle.Text"]); + } + private async Task Send() { try diff --git a/Oqtane.Client/Modules/Admin/UserProfile/View.razor b/Oqtane.Client/Modules/Admin/UserProfile/View.razor index 58a3d211..719b8813 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/View.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/View.razor @@ -110,6 +110,11 @@ public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View; public override string Title => "View Notification"; + protected override void OnParametersSet() + { + base.OnParametersSet(); + base.SetModuleTitle(Localizer["ModuleTitle.Text"]); + } protected override async Task OnInitializedAsync() { try diff --git a/Oqtane.Client/Modules/Admin/Users/Add.razor b/Oqtane.Client/Modules/Admin/Users/Add.razor index 54c396ee..f36e78b0 100644 --- a/Oqtane.Client/Modules/Admin/Users/Add.razor +++ b/Oqtane.Client/Modules/Admin/Users/Add.razor @@ -140,34 +140,26 @@ { if (_password == confirm) { - var user = await UserService.GetUserAsync(username, PageState.Site.SiteId); - if (user == null) + var user = new User(); + user.SiteId = PageState.Site.SiteId; + user.Username = username; + user.Password = _password; + user.Email = email; + user.DisplayName = string.IsNullOrWhiteSpace(displayname) ? username : displayname; + user.PhotoFileId = null; + + user = await UserService.AddUserAsync(user); + + if (user != null) { - user = new User(); - user.SiteId = PageState.Site.SiteId; - user.Username = username; - user.Password = _password; - user.Email = email; - user.DisplayName = string.IsNullOrWhiteSpace(displayname) ? username : displayname; - user.PhotoFileId = null; - - user = await UserService.AddUserAsync(user); - - if (user != null) - { - await SettingService.UpdateUserSettingsAsync(settings, user.UserId); - await logger.LogInformation("User Created {User}", user); - NavigationManager.NavigateTo(NavigateUrl()); - } - else - { - await logger.LogError("Error Adding User {Username} {Email}", username, email); - AddModuleMessage(Localizer["Error.User.AddCheckPass"], MessageType.Error); - } + await SettingService.UpdateUserSettingsAsync(settings, user.UserId); + await logger.LogInformation("User Created {User}", user); + NavigationManager.NavigateTo(NavigateUrl()); } else { - AddModuleMessage(Localizer["Message.Username.Exists"], MessageType.Warning); + await logger.LogError("Error Adding User {Username} {Email}", username, email); + AddModuleMessage(Localizer["Error.User.AddCheckPass"], MessageType.Error); } } else diff --git a/Oqtane.Client/Modules/Controls/AutoComplete.razor b/Oqtane.Client/Modules/Controls/AutoComplete.razor index b464fd20..89e74124 100644 --- a/Oqtane.Client/Modules/Controls/AutoComplete.razor +++ b/Oqtane.Client/Modules/Controls/AutoComplete.razor @@ -2,7 +2,7 @@ @inherits LocalizableComponent
- + @if (_results != null) {