From 92a4a1b210af082d048cba65c22db8653d2b1bd2 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 4 Aug 2023 15:17:17 -0400 Subject: [PATCH] update Module and Theme Install UI to match Marketplace - including logos and support for sorting --- .../Modules/Admin/ModuleDefinitions/Add.razor | 179 ++++++++++++------ Oqtane.Client/Modules/Admin/Themes/Add.razor | 179 ++++++++++++------ .../Modules/Admin/ModuleDefinitions/Add.resx | 2 +- .../Resources/Modules/Admin/Themes/Add.resx | 6 + Oqtane.Client/Resources/SharedResources.resx | 26 ++- Oqtane.Server/wwwroot/package.png | Bin 0 -> 5794 bytes 6 files changed, 263 insertions(+), 129 deletions(-) create mode 100644 Oqtane.Server/wwwroot/package.png diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor index 700978fc..1c5ea20e 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -10,61 +10,106 @@
-
+
+
+ + +
+
+ + +
+
+
+
+
- + 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, "", "", "ffffff", 0, false); + 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/Themes/Add.razor b/Oqtane.Client/Modules/Admin/Themes/Add.razor index 7c4bd170..35178935 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Add.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Add.razor @@ -10,61 +10,108 @@
-
+
+
+ + +
+
+ + +
+
+
+
+
- + 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, "", "", "ffffff", 0, false); + 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/Resources/Modules/Admin/ModuleDefinitions/Add.resx b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Add.resx index 9db1c83a..4d6bd593 100644 --- a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Add.resx @@ -136,7 +136,7 @@ No Modules Match The Criteria Provided Or Package Service Is Disabled - Download + Marketplace Upload diff --git a/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx index b7a18332..9ceeae29 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx @@ -135,4 +135,10 @@ No Themes Match The Criteria Provided Or Package Service Is Disabled + + Marketplace + + + Upload + \ No newline at end of file diff --git a/Oqtane.Client/Resources/SharedResources.resx b/Oqtane.Client/Resources/SharedResources.resx index 89823584..d02dfa0a 100644 --- a/Oqtane.Client/Resources/SharedResources.resx +++ b/Oqtane.Client/Resources/SharedResources.resx @@ -223,13 +223,13 @@ by - downloads + Downloads - released + Released - version + Version Edit @@ -277,19 +277,19 @@ Installed Version - source + Source Please Provide All Required Information - Free + Open Source - Paid + Commercial - price + Price Accept @@ -390,4 +390,16 @@ Support + + Alphabetical + + + Buy Now + + + Popularity + + + Results + \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/package.png b/Oqtane.Server/wwwroot/package.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc6f290503584603d80461accb4708600dd3200 GIT binary patch literal 5794 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