diff --git a/Oqtane.Client/Modules/Admin/Languages/Add.razor b/Oqtane.Client/Modules/Admin/Languages/Add.razor index 59115679..e081b83a 100644 --- a/Oqtane.Client/Modules/Admin/Languages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Languages/Add.razor @@ -5,6 +5,7 @@ @inject NavigationManager NavigationManager @inject ILocalizationService LocalizationService @inject ILanguageService LanguageService +@inject IPackageService PackageService @inject IStringLocalizer Localizer @if (_supportedCultures == null) @@ -13,42 +14,91 @@ } else { - @if (_supportedCultures?.Count() > 1) - { - - - - - - - - - -
- - - -
- - - -
- - } - @Localizer["Cancel"] + + + @if (_supportedCultures?.Count() > 1) + { + + + + + + + + + +
+ + + +
+ + + +
+ + } + else + { + + } + @Localizer["Cancel"] +
+ + @if (_packages != null && _packages.Count > 0) + { + + +
+ @Localizer["Name"] + @Localizer["Version"] + +
+ + @context.Name + @context.Version + + + + +
+ + @Localizer["Cancel"] + } + else + { + + } +
+ + + + + + +
+ + + +
+ + @Localizer["Cancel"] +
+
} @code { private string _code = string.Empty; private string _isDefault = "False"; + private List _packages; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; @@ -57,14 +107,8 @@ else protected override async Task OnParametersSetAsync() { _supportedCultures = await LocalizationService.GetCulturesAsync(); - if (_supportedCultures.Count() <= 1) - { - AddModuleMessage(Localizer["The Only Supported Culture That Has Been Defined Is English"], MessageType.Warning); - } - else - { - _supportedCultures = _supportedCultures.Where(c => !c.Name.Equals(Constants.DefaultCulture)); - } + _supportedCultures = _supportedCultures.Where(c => !c.Name.Equals(Constants.DefaultCulture)); + _packages = await PackageService.GetPackagesAsync("language"); } private async Task SaveLanguage() @@ -97,6 +141,35 @@ else } } + private async Task InstallLanguages() + { + try + { + await PackageService.InstallPackagesAsync(); + AddModuleMessage(Localizer["Language Packages Installed Successfully. You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Installing Language Package"); + } + } + + 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["Language Package Downloaded Successfully. Click Install To Complete Installation."], MessageType.Success); + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Downloading Language Package {Name} {Version}", packageid, version); + AddModuleMessage(Localizer["Error Downloading Language Package"], MessageType.Error); + } + } + private async Task SetCultureAsync(string culture) { if (culture != CultureInfo.CurrentUICulture.Name) diff --git a/Oqtane.Client/Modules/Admin/Languages/Index.razor b/Oqtane.Client/Modules/Admin/Languages/Index.razor index 748c875b..1249e78c 100644 --- a/Oqtane.Client/Modules/Admin/Languages/Index.razor +++ b/Oqtane.Client/Modules/Admin/Languages/Index.razor @@ -1,6 +1,7 @@ @namespace Oqtane.Modules.Admin.Languages @inherits ModuleBase @inject ILanguageService LanguageService +@inject ILocalizationService LocalizationService @inject IStringLocalizer Localizer @if (_languages == null) @@ -19,7 +20,7 @@ else @Localizer["Default?"] - + @context.Name @context.Code @@ -35,6 +36,12 @@ else protected override async Task OnParametersSetAsync() { _languages = await LanguageService.GetLanguagesAsync(PageState.Site.SiteId); + if (_languages.Count == 0) + { + var cultures = await LocalizationService.GetCulturesAsync(); + var culture = cultures.First(c => c.Name.Equals(Constants.DefaultCulture)); + _languages.Add(new Language { Name = culture.DisplayName, Code = culture.Name, IsDefault = culture.IsDefault }); + } } private async Task DeleteLanguage(Language language) diff --git a/Oqtane.Client/Services/Interfaces/IPackageService.cs b/Oqtane.Client/Services/Interfaces/IPackageService.cs index eeb243c1..4c5f24b1 100644 --- a/Oqtane.Client/Services/Interfaces/IPackageService.cs +++ b/Oqtane.Client/Services/Interfaces/IPackageService.cs @@ -1,4 +1,4 @@ -using Oqtane.Models; +using Oqtane.Models; using System.Collections.Generic; using System.Threading.Tasks; @@ -8,5 +8,6 @@ namespace Oqtane.Services { Task> GetPackagesAsync(string tag); 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 0fa6123b..28c85f6e 100644 --- a/Oqtane.Client/Services/PackageService.cs +++ b/Oqtane.Client/Services/PackageService.cs @@ -1,4 +1,4 @@ -using Oqtane.Models; +using Oqtane.Models; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; @@ -22,5 +22,10 @@ namespace Oqtane.Services { await PostAsync($"{Apiurl}?packageid={packageId}&version={version}&folder={folder}"); } + + public async Task InstallPackagesAsync() + { + await GetJsonAsync>($"{Apiurl}/install"); + } } } diff --git a/Oqtane.Server/Controllers/PackageController.cs b/Oqtane.Server/Controllers/PackageController.cs index 96af1346..d783759f 100644 --- a/Oqtane.Server/Controllers/PackageController.cs +++ b/Oqtane.Server/Controllers/PackageController.cs @@ -1,16 +1,17 @@ -using System.Collections.Generic; +using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; using Oqtane.Models; using Newtonsoft.Json; using System; using System.Net.Http; using System.Threading.Tasks; -using System.Threading; using System.IO; using System.Linq; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Authorization; using Oqtane.Shared; +using Oqtane.Infrastructure; +using Oqtane.Enums; // ReSharper disable PartialTypeWithSinglePart namespace Oqtane.Controllers @@ -18,11 +19,15 @@ namespace Oqtane.Controllers [Route(ControllerRoutes.Default)] public class PackageController : Controller { + private readonly IInstallationManager _installationManager; private readonly IWebHostEnvironment _environment; + private readonly ILogManager _logger; - public PackageController(IWebHostEnvironment environment) + public PackageController(IInstallationManager installationManager, IWebHostEnvironment environment, ILogManager logger) { + _installationManager = installationManager; _environment = environment; + _logger = logger; } // GET: api/?tag=x @@ -86,6 +91,14 @@ namespace Oqtane.Controllers } } } + + [HttpGet("install")] + [Authorize(Roles = RoleNames.Host)] + public void InstallPackages() + { + _logger.Log(LogLevel.Information, this, LogFunction.Create, "Packages Installed"); + _installationManager.InstallPackages("Packages"); + } } public partial class SearchResult diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index 881d3e91..ed985b74 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -175,7 +175,7 @@ namespace Oqtane services.AddSingleton(); // install any modules or themes ( this needs to occur BEFORE the assemblies are loaded into the app domain ) - InstallationManager.InstallPackages("Modules,Themes", _env.WebRootPath, _env.ContentRootPath); + InstallationManager.InstallPackages("Modules,Themes,Packages", _env.WebRootPath, _env.ContentRootPath); // register transient scoped core services services.AddTransient(); diff --git a/Oqtane.Server/wwwroot/Modules/Oqtane.Blogs/Module.css b/Oqtane.Server/wwwroot/Modules/Oqtane.Blogs/Module.css deleted file mode 100644 index 0856a263..00000000 --- a/Oqtane.Server/wwwroot/Modules/Oqtane.Blogs/Module.css +++ /dev/null @@ -1 +0,0 @@ -/* Module Custom Styles */ \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/Modules/Oqtane.Blogs/Module.js b/Oqtane.Server/wwwroot/Modules/Oqtane.Blogs/Module.js deleted file mode 100644 index 1b415a08..00000000 --- a/Oqtane.Server/wwwroot/Modules/Oqtane.Blogs/Module.js +++ /dev/null @@ -1 +0,0 @@ -/* Module Script */ \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/Modules/Oqtane.Blogs/assets.json b/Oqtane.Server/wwwroot/Modules/Oqtane.Blogs/assets.json deleted file mode 100644 index 72f421fc..00000000 --- a/Oqtane.Server/wwwroot/Modules/Oqtane.Blogs/assets.json +++ /dev/null @@ -1 +0,0 @@ -["\\bin\\Debug\\net5.0\\Oqtane.Blogs.Client.Oqtane.dll","\\bin\\Debug\\net5.0\\Oqtane.Blogs.Client.Oqtane.pdb","\\bin\\Debug\\net5.0\\Oqtane.Blogs.Server.Oqtane.dll","\\bin\\Debug\\net5.0\\Oqtane.Blogs.Server.Oqtane.pdb","\\bin\\Debug\\net5.0\\Oqtane.Blogs.Shared.Oqtane.dll","\\bin\\Debug\\net5.0\\Oqtane.Blogs.Shared.Oqtane.pdb","\\wwwroot\\Modules\\Oqtane.Blogs\\Module.css","\\wwwroot\\Modules\\Oqtane.Blogs\\Module.js"] \ No newline at end of file