diff --git a/Oqtane.Client/Modules/Admin/Languages/Add.razor b/Oqtane.Client/Modules/Admin/Languages/Add.razor index c2f93208..0c936c33 100644 --- a/Oqtane.Client/Modules/Admin/Languages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Languages/Add.razor @@ -7,6 +7,7 @@ @inject ILanguageService LanguageService @inject IPackageService PackageService @inject IStringLocalizer Localizer +@inject IStringLocalizer SharedLocalizer @if (_supportedCultures == null) { @@ -22,33 +23,33 @@ else } else { - - - - - - - - - -
- - - -
- - - -
- + + + + + + + + + +
+ + + +
+ + + +
+ } @Localizer["Cancel"] @@ -56,12 +57,25 @@ else @if (_packages != null && _packages.Count > 0) { + + + + + + +
+ + +   + +
+

@context.Name

  by:  @context.Owner
- @context.Downloads.ToString("###,###,##0") downloads  |   released: @context.ReleaseDate.ToString("MMM dd, yyyy")  |  version: @context.Version
- @(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description) + @(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 @@ -100,6 +114,7 @@ else private IEnumerable _supportedCultures; private IEnumerable _availableCultures; private List _packages; + private string _search = ""; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; @@ -111,7 +126,7 @@ else _supportedCultures = await LocalizationService.GetCulturesAsync(); _availableCultures = _supportedCultures .Where(c => !c.Name.Equals(Constants.DefaultCulture) && !languagesCodes.Contains(c.Name)); - _packages = await PackageService.GetPackagesAsync("translation"); + await LoadTranslations(); if (_supportedCultures.Count() == 1) { @@ -123,6 +138,36 @@ else } } + private async Task LoadTranslations() + { + _packages = await PackageService.GetPackagesAsync("translation", _search); + } + + private async Task Search() + { + try + { + await LoadTranslations(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On Search"); + } + } + + private async Task Reset() + { + try + { + _search = ""; + await LoadTranslations(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On Reset"); + } + } + private async Task SaveLanguage() { var language = new Language diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor index 87aae880..115294e7 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -5,6 +5,7 @@ @inject IModuleDefinitionService ModuleDefinitionService @inject IPackageService PackageService @inject IStringLocalizer Localizer +@inject IStringLocalizer SharedLocalizer @if (_packages != null) { @@ -13,12 +14,25 @@ { + + + + + + +
+ + +   + +
+

@context.Name

  by:  @context.Owner
- @context.Downloads.ToString("###,###,##0") downloads  |   released: @context.ReleaseDate.ToString("MMM dd, yyyy")  |  version: @context.Version
- @(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description) + @(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 @@ -47,6 +61,7 @@ @code { private List _packages; + private string _search = ""; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; @@ -54,16 +69,7 @@ { try { - var moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); - _packages = await PackageService.GetPackagesAsync("module"); - - foreach (Package package in _packages.ToArray()) - { - if (moduledefinitions.Exists(item => item.PackageName == package.PackageId)) - { - _packages.Remove(package); - } - } + await LoadModuleDefinitions(); } catch (Exception ex) { @@ -72,6 +78,45 @@ } } + private async Task LoadModuleDefinitions() + { + var moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); + _packages = await PackageService.GetPackagesAsync("module", _search); + + foreach (Package package in _packages.ToArray()) + { + if (moduledefinitions.Exists(item => item.PackageName == package.PackageId)) + { + _packages.Remove(package); + } + } + } + + private async Task Search() + { + try + { + await LoadModuleDefinitions(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On Search"); + } + } + + private async Task Reset() + { + try + { + _search = ""; + await LoadModuleDefinitions(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On Reset"); + } + } + private async Task InstallModules() { try diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor index 9a1fadef..ffd1f623 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor @@ -13,7 +13,7 @@ else { @((MarkupString)" ") - +
diff --git a/Oqtane.Client/Modules/Admin/Themes/Add.razor b/Oqtane.Client/Modules/Admin/Themes/Add.razor index 03225436..0866821d 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Add.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Add.razor @@ -5,6 +5,7 @@ @inject IThemeService ThemeService @inject IPackageService PackageService @inject IStringLocalizer Localizer +@inject IStringLocalizer SharedLocalizer @if (_packages != null) { @@ -13,12 +14,25 @@ { + + + + + + +
+ + +   + +
+ -

@context.Name

  by:  @context.Owner
- @context.Downloads.ToString("###,###,##0") downloads  |   released: @context.ReleaseDate.ToString("MMM dd, yyyy")  |  version: @context.Version
- @(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description) +

@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 @@ -47,6 +61,7 @@ @code { private List _packages; + private string _search = ""; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; @@ -54,16 +69,7 @@ { try { - var themes = await ThemeService.GetThemesAsync(); - _packages = await PackageService.GetPackagesAsync("theme"); - - foreach (Package package in _packages.ToArray()) - { - if (themes.Exists(item => item.PackageName == package.PackageId)) - { - _packages.Remove(package); - } - } + await LoadThemes(); } catch (Exception ex) { @@ -72,6 +78,45 @@ } } + private async Task LoadThemes() + { + var themes = await ThemeService.GetThemesAsync(); + _packages = await PackageService.GetPackagesAsync("theme", _search); + + foreach (Package package in _packages.ToArray()) + { + if (themes.Exists(item => item.PackageName == package.PackageId)) + { + _packages.Remove(package); + } + } + } + + private async Task Search() + { + try + { + await LoadThemes(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On Search"); + } + } + + private async Task Reset() + { + try + { + _search = ""; + await LoadThemes(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On Reset"); + } + } + private async Task InstallThemes() { try diff --git a/Oqtane.Client/Modules/Admin/Themes/Index.razor b/Oqtane.Client/Modules/Admin/Themes/Index.razor index db413a1b..16aaedb4 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Index.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Index.razor @@ -14,7 +14,7 @@ else { @((MarkupString)" ") - +
diff --git a/Oqtane.Client/Resources/SharedResources.resx b/Oqtane.Client/Resources/SharedResources.resx index 477504d0..6f0687b7 100644 --- a/Oqtane.Client/Resources/SharedResources.resx +++ b/Oqtane.Client/Resources/SharedResources.resx @@ -210,4 +210,25 @@ Upload + + Reset + + + Search + + + Enter Search Term + + + by + + + downloads + + + release date + + + version + \ No newline at end of file diff --git a/Oqtane.Client/Services/PackageService.cs b/Oqtane.Client/Services/PackageService.cs index 256b4ab5..8bcd843f 100644 --- a/Oqtane.Client/Services/PackageService.cs +++ b/Oqtane.Client/Services/PackageService.cs @@ -27,8 +27,7 @@ namespace Oqtane.Services public async Task> GetPackagesAsync(string type, string search) { - List packages = await GetJsonAsync>($"{Apiurl}?type={type}&search={WebUtility.UrlEncode(search)}"); - return packages.OrderByDescending(item => item.Downloads).ToList(); // order by popularity + return await GetJsonAsync>($"{Apiurl}?type={type}&search={WebUtility.UrlEncode(search)}"); } public async Task DownloadPackageAsync(string packageId, string version, string folder) diff --git a/Oqtane.Server/Controllers/PackageController.cs b/Oqtane.Server/Controllers/PackageController.cs index 52f65f1e..df10c3e3 100644 --- a/Oqtane.Server/Controllers/PackageController.cs +++ b/Oqtane.Server/Controllers/PackageController.cs @@ -6,12 +6,12 @@ using System; using System.Net.Http; using System.Threading.Tasks; using System.IO; -using System.Linq; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Authorization; using Oqtane.Shared; using Oqtane.Infrastructure; using Oqtane.Enums; +using System.Net.Http.Headers; // ReSharper disable PartialTypeWithSinglePart namespace Oqtane.Controllers @@ -41,8 +41,9 @@ namespace Oqtane.Controllers List packages; using (var client = new HttpClient()) { - client.DefaultRequestHeaders.Add("Referer", HttpContext.Request.Host.Value); - packages = await GetJson>(client, Constants.PackageRegistryUrl + $"/api/registry/packages/?installationid={GetInstallationId()}&type={type.ToLower()}&version={Constants.Version}&search={search}"); + 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={GetInstallationId()}&type={type.ToLower()}&version={Constants.Version}&search={search}"); } return packages; } @@ -55,8 +56,9 @@ namespace Oqtane.Controllers Package package = null; using (var client = new HttpClient()) { - client.DefaultRequestHeaders.Add("Referer", HttpContext.Request.Host.Value); - package = await GetJson(client, Constants.PackageRegistryUrl + $"/api/registry/package/?installationid={GetInstallationId()}&packageid={packageid}&version={version}"); + client.DefaultRequestHeaders.Add("Referer", HttpContext.Request.Scheme + "://" + HttpContext.Request.Host.Value); + client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(Constants.PackageId, Constants.Version)); + package = await GetJson(client, Constants.PackageRegistryUrl + $"/api/registry/package/?id={GetInstallationId()}&package={packageid}&version={version}"); } if (package != null) diff --git a/Oqtane.Shared/Models/Package.cs b/Oqtane.Shared/Models/Package.cs index d6187dd4..66ecb8b4 100644 --- a/Oqtane.Shared/Models/Package.cs +++ b/Oqtane.Shared/Models/Package.cs @@ -58,8 +58,8 @@ namespace Oqtane.Models public string PackageUrl { get; set; } /// - /// Indicates if any known security vulnerabilities exist ( only applicable to framework packages ) + /// Indicates if any known security vulnerabilities exist /// - public int Vulnerability { get; set; } + public int Vulnerabilities { get; set; } } } diff --git a/screenshots/Architecture.png b/screenshots/Architecture.png index a24815c7..0537c3b4 100644 Binary files a/screenshots/Architecture.png and b/screenshots/Architecture.png differ