From ffe724b32d4aa26908d902baea030256a292b28b Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Fri, 13 Aug 2021 15:56:22 -0400 Subject: [PATCH] add support for free/paid in module, theme, translation installation --- .../Modules/Admin/Languages/Add.razor | 132 ++++++++++++++---- .../Modules/Admin/ModuleDefinitions/Add.razor | 28 +++- .../Modules/Admin/Modules/Import.razor | 2 +- Oqtane.Client/Modules/Admin/Themes/Add.razor | 22 ++- Oqtane.Client/Resources/SharedResources.resx | 9 ++ .../Services/Interfaces/IPackageService.cs | 2 +- Oqtane.Client/Services/PackageService.cs | 6 +- .../Controllers/PackageController.cs | 6 +- Oqtane.Shared/Models/Package.cs | 5 + 9 files changed, 177 insertions(+), 35 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Languages/Add.razor b/Oqtane.Client/Modules/Admin/Languages/Add.razor index f93a7511..d3385ff8 100644 --- a/Oqtane.Client/Modules/Admin/Languages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Languages/Add.razor @@ -53,13 +53,16 @@ else -
-
-
+ +
+
+
+ -
-
-   +
@@ -77,7 +80,7 @@ else @(String.Format("{0:n0}", context.Downloads)) @SharedLocalizer["Search.Downloads"]  |   @SharedLocalizer["Search.Released"]: @context.ReleaseDate.ToString("MMM dd, yyyy")  |  @SharedLocalizer["Search.Version"]: @context.Version  |  @SharedLocalizer["Search.Source"]: @context.PackageUrl - + @@ -108,6 +111,38 @@ else } +@if (_productname != "") +{ +
+ +
+} + @code { private ElementReference form; private bool validated = false; @@ -118,7 +153,12 @@ else private IEnumerable _supportedCultures; private IEnumerable _availableCultures; private List _packages; + private string _price = "free"; private string _search = ""; + private string _productname = ""; + private string _license = ""; + private string _packageid = ""; + private string _version = ""; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; @@ -144,9 +184,24 @@ else private async Task LoadTranslations() { - _packages = await PackageService.GetPackagesAsync("translation", _search); + _packages = await PackageService.GetPackagesAsync("translation", _search, _price); } + private async void PriceChanged(ChangeEventArgs e) + { + try + { + _price = (string)e.Value; + _search = ""; + await LoadTranslations(); + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On PriceChanged"); + } + } + private async Task Search() { try @@ -211,6 +266,51 @@ else } } + + private void HideModal() + { + _productname = ""; + _license = ""; + StateHasChanged(); + } + + private async Task GetLanguage(string packageid, string version) + { + try + { + var package = await PackageService.GetPackageAsync(packageid, version); + if (package != null) + { + _productname = package.Name; + _license = package.License.Replace("\n", "
"); + _packageid = package.PackageId; + _version = package.Version; + } + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Getting Package {PackageId} {Version}", packageid, version); + AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error); + } + } + + private async Task DownloadPackage() + { + try + { + await PackageService.DownloadPackageAsync(_packageid, _version, "Packages"); + await logger.LogInformation("Language Package {Name} {Version} Downloaded Successfully", _packageid, _version); + AddModuleMessage(Localizer["Success.Language.Download"], MessageType.Success); + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Downloading Translation {Name} {Version}", _packageid, _version); + AddModuleMessage(Localizer["Error.Language.Download"], MessageType.Error); + } + } + private async Task InstallLanguages() { try @@ -224,22 +324,6 @@ else } } - private async Task DownloadLanguage(string packageid, string version) - { - try - { - await PackageService.DownloadPackageAsync(packageid, version, "Packages"); - await logger.LogInformation("Language Paclage {Name} {Version} Downloaded Successfully", packageid, version); - AddModuleMessage(Localizer["Success.Language.Download"], MessageType.Success); - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Downloading Translation {Name} {Version}", packageid, version); - AddModuleMessage(Localizer["Error.Language.Download"], MessageType.Error); - } - } - private async Task SetCultureAsync(string culture) { if (culture != CultureInfo.CurrentUICulture.Name) diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor index 2f1e7d1b..035732f3 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -14,6 +14,10 @@
+ @@ -30,7 +34,11 @@

@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  |  @SharedLocalizer["Search.Source"]: @context.PackageUrl + @(String.Format("{0:n0}", context.Downloads)) @SharedLocalizer["Search.Downloads"]  |   + @SharedLocalizer["Search.Released"]: @context.ReleaseDate.ToString("MMM dd, yyyy")  |   + @SharedLocalizer["Search.Version"]: @context.Version  |   + @SharedLocalizer["Search.Source"]: @context.PackageUrl  |   + @SharedLocalizer["Search.Price"]: @((context.Price == 0) ? "FREE" : context.Price.ToString("$#,##0.00") ) @@ -96,6 +104,7 @@ @code { private List _packages; + private string _price = "free"; private string _search = ""; private string _productname = ""; private string _license = ""; @@ -120,7 +129,7 @@ private async Task LoadModuleDefinitions() { var moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); - _packages = await PackageService.GetPackagesAsync("module", _search); + _packages = await PackageService.GetPackagesAsync("module", _search, _price); if (_packages != null) { @@ -134,6 +143,21 @@ } } + private async void PriceChanged(ChangeEventArgs e) + { + try + { + _price = (string)e.Value; + _search = ""; + await LoadModuleDefinitions(); + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On PriceChanged"); + } + } + private async Task Search() { try diff --git a/Oqtane.Client/Modules/Admin/Modules/Import.razor b/Oqtane.Client/Modules/Admin/Modules/Import.razor index 2fe27a05..7241b294 100644 --- a/Oqtane.Client/Modules/Admin/Modules/Import.razor +++ b/Oqtane.Client/Modules/Admin/Modules/Import.razor @@ -8,7 +8,7 @@
- +
diff --git a/Oqtane.Client/Modules/Admin/Themes/Add.razor b/Oqtane.Client/Modules/Admin/Themes/Add.razor index 41f708d3..a7a81da2 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Add.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Add.razor @@ -14,6 +14,10 @@
+ @@ -97,6 +101,7 @@ @code { private List _packages; + private string _price = "free"; private string _search = ""; private string _productname = ""; private string _license = ""; @@ -121,7 +126,7 @@ private async Task LoadThemes() { var themes = await ThemeService.GetThemesAsync(); - _packages = await PackageService.GetPackagesAsync("theme", _search); + _packages = await PackageService.GetPackagesAsync("theme", _search, _price); if (_packages != null) { @@ -135,6 +140,21 @@ } } + private async void PriceChanged(ChangeEventArgs e) + { + try + { + _price = (string)e.Value; + _search = ""; + await LoadThemes(); + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On PriceChanged"); + } + } + private async Task Search() { try diff --git a/Oqtane.Client/Resources/SharedResources.resx b/Oqtane.Client/Resources/SharedResources.resx index 3e59e210..5eee0691 100644 --- a/Oqtane.Client/Resources/SharedResources.resx +++ b/Oqtane.Client/Resources/SharedResources.resx @@ -282,4 +282,13 @@ Please Provide All Required Information + + Free + + + Paid + + + price + \ No newline at end of file diff --git a/Oqtane.Client/Services/Interfaces/IPackageService.cs b/Oqtane.Client/Services/Interfaces/IPackageService.cs index 81f6fa96..e6cf5e62 100644 --- a/Oqtane.Client/Services/Interfaces/IPackageService.cs +++ b/Oqtane.Client/Services/Interfaces/IPackageService.cs @@ -7,7 +7,7 @@ namespace Oqtane.Services public interface IPackageService { Task> GetPackagesAsync(string type); - Task> GetPackagesAsync(string type, string search); + Task> GetPackagesAsync(string type, string search, string price); Task GetPackageAsync(string packageId, string version); Task DownloadPackageAsync(string packageId, string version, string folder); Task InstallPackagesAsync(); diff --git a/Oqtane.Client/Services/PackageService.cs b/Oqtane.Client/Services/PackageService.cs index 5373572a..122e6311 100644 --- a/Oqtane.Client/Services/PackageService.cs +++ b/Oqtane.Client/Services/PackageService.cs @@ -22,12 +22,12 @@ namespace Oqtane.Services public async Task> GetPackagesAsync(string type) { - return await GetPackagesAsync(type, ""); + return await GetPackagesAsync(type, "", ""); } - public async Task> GetPackagesAsync(string type, string search) + public async Task> GetPackagesAsync(string type, string search, string price) { - return await GetJsonAsync>($"{Apiurl}?type={type}&search={WebUtility.UrlEncode(search)}"); + return await GetJsonAsync>($"{Apiurl}?type={type}&search={WebUtility.UrlEncode(search)}&price={price}"); } public async Task GetPackageAsync(string packageId, string version) diff --git a/Oqtane.Server/Controllers/PackageController.cs b/Oqtane.Server/Controllers/PackageController.cs index 935a7db3..4a85428e 100644 --- a/Oqtane.Server/Controllers/PackageController.cs +++ b/Oqtane.Server/Controllers/PackageController.cs @@ -32,10 +32,10 @@ namespace Oqtane.Controllers _logger = logger; } - // GET: api/?type=x&search=y + // GET: api/?type=x&search=y&license=z [HttpGet] [Authorize(Roles = RoleNames.Host)] - public async Task> Get(string type, string search) + public async Task> Get(string type, string search, string price) { // get packages List packages = new List(); @@ -45,7 +45,7 @@ namespace Oqtane.Controllers { client.DefaultRequestHeaders.Add("Referer", HttpContext.Request.Scheme + "://" + HttpContext.Request.Host.Value); client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(Constants.PackageId, Constants.Version)); - packages = await GetJson>(client, Constants.PackageRegistryUrl + $"/api/registry/packages/?id={_configManager.GetInstallationId()}&type={type.ToLower()}&version={Constants.Version}&search={search}"); + packages = await GetJson>(client, Constants.PackageRegistryUrl + $"/api/registry/packages/?id={_configManager.GetInstallationId()}&type={type.ToLower()}&version={Constants.Version}&search={search}&price={price}"); } } return packages; diff --git a/Oqtane.Shared/Models/Package.cs b/Oqtane.Shared/Models/Package.cs index 7c19cb39..7e0faa22 100644 --- a/Oqtane.Shared/Models/Package.cs +++ b/Oqtane.Shared/Models/Package.cs @@ -66,5 +66,10 @@ namespace Oqtane.Models /// Indicates if any known security vulnerabilities exist /// public int Vulnerabilities { get; set; } + + /// + /// The price of the package + /// + public decimal Price { get; set; } } }