From 422bf7b68977e34a83a6b0c6773b0c0f03b1663b Mon Sep 17 00:00:00 2001 From: Ricardo Pacheco Date: Thu, 7 Dec 2023 18:12:49 -0600 Subject: [PATCH] Edit languages to set default. --- .../Modules/Admin/Languages/Add.razor | 2 - .../Modules/Admin/Languages/Edit.razor | 110 +++++++++++++ .../Modules/Admin/Languages/Index.razor | 7 + .../Modules/Admin/Languages/Edit.resx | 153 ++++++++++++++++++ .../Services/Interfaces/ILanguageService.cs | 9 +- Oqtane.Client/Services/LanguageService.cs | 8 +- .../Controllers/LanguageController.cs | 24 ++- .../Interfaces/ILanguageRepository.cs | 2 + .../Repository/LanguageRepository.cs | 22 ++- 9 files changed, 328 insertions(+), 9 deletions(-) create mode 100644 Oqtane.Client/Modules/Admin/Languages/Edit.razor create mode 100644 Oqtane.Client/Resources/Modules/Admin/Languages/Edit.resx diff --git a/Oqtane.Client/Modules/Admin/Languages/Add.razor b/Oqtane.Client/Modules/Admin/Languages/Add.razor index d8a52f33..23af68e5 100644 --- a/Oqtane.Client/Modules/Admin/Languages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Languages/Add.razor @@ -131,8 +131,6 @@ else var interop = new Interop(JSRuntime); var localizationCookieValue = CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)); await interop.SetCookie(CookieRequestCultureProvider.DefaultCookieName, localizationCookieValue, 360); - - NavigationManager.NavigateTo(NavigationManager.Uri, true); } } diff --git a/Oqtane.Client/Modules/Admin/Languages/Edit.razor b/Oqtane.Client/Modules/Admin/Languages/Edit.razor new file mode 100644 index 00000000..5929edd9 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Languages/Edit.razor @@ -0,0 +1,110 @@ +@namespace Oqtane.Modules.Admin.Languages +@inherits ModuleBase +@using System.Globalization +@using Microsoft.AspNetCore.Localization +@inject NavigationManager NavigationManager +@inject ILocalizationService LocalizationService +@inject ILanguageService LanguageService +@inject IPackageService PackageService +@inject IStringLocalizer Localizer +@inject IStringLocalizer SharedLocalizer + +@if (_code == null) +{ +

@SharedLocalizer["Loading"]

+} +else +{ + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + @SharedLocalizer["Cancel"] +
+
+
+} + +@code { + private ElementReference form; + private bool validated = false; + private int _languageId = -1; + private string _code = string.Empty; + private string _cultureName = string.Empty; + private string _default = "False"; + private List _languages; + + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + + protected override async Task OnInitializedAsync() + { + _languageId = Int32.Parse(PageState.QueryString["id"]); + _languages = await LanguageService.GetLanguagesAsync(PageState.Site.SiteId, Constants.ClientId); + Language language = _languages.Where(x => x.LanguageId == _languageId).FirstOrDefault(); + if (language != null) + { + _code = language.Code; + _cultureName = language.Name; + _default = language.IsDefault.ToString(); + if (language.SiteId == null) + { + language.SiteId = PageState.Site.SiteId; + } + }; + } + + private async Task SaveLanguage() + { + Language language = _languages.Where(x => x.LanguageId == _languageId).FirstOrDefault(); + if (language != null) + { + language.IsDefault = Boolean.Parse(_default); + try + { + await LanguageService.EditLanguageAsync(language); + + if (language.IsDefault) + { + await SetCultureAsync(language.Code); + } + + await logger.LogInformation("Language Edited {Language}", language); + + NavigationManager.NavigateTo(NavigateUrl()); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Editing Language {Language} {Error}", language, ex.Message); + AddModuleMessage(Localizer["Error.Language.Edit"], MessageType.Error); + } + }; + } + + private async Task SetCultureAsync(string culture) + { + if (culture != CultureInfo.CurrentUICulture.Name) + { + var interop = new Interop(JSRuntime); + var localizationCookieValue = CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)); + await interop.SetCookie(CookieRequestCultureProvider.DefaultCookieName, localizationCookieValue, 360); + } + } + +} diff --git a/Oqtane.Client/Modules/Admin/Languages/Index.razor b/Oqtane.Client/Modules/Admin/Languages/Index.razor index 18c98317..4b79388b 100644 --- a/Oqtane.Client/Modules/Admin/Languages/Index.razor +++ b/Oqtane.Client/Modules/Admin/Languages/Index.razor @@ -16,6 +16,7 @@ else
+     @SharedLocalizer["Name"] @Localizer["Code"] @@ -27,6 +28,12 @@ else }
+ + @if (!context.IsDefault) + { + + } + @context.Name @context.Code diff --git a/Oqtane.Client/Resources/Modules/Admin/Languages/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/Languages/Edit.resx new file mode 100644 index 00000000..68458745 --- /dev/null +++ b/Oqtane.Client/Resources/Modules/Admin/Languages/Edit.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Error Updating Language + + + Name Of The Langauage + + + Indicates Whether Or Not This Language Is The Default For The Site + + + Name: + + + Default? + + + Translation Package Saved Successfully. You Must <a href={0}>Restart</a> To Complete The Installation. + + + Upload one or more translation packages. + + + Translation + + + Manage + + + Upload + + + Error Loading Language + + \ No newline at end of file diff --git a/Oqtane.Client/Services/Interfaces/ILanguageService.cs b/Oqtane.Client/Services/Interfaces/ILanguageService.cs index a2da3a2f..bf7aa9a7 100644 --- a/Oqtane.Client/Services/Interfaces/ILanguageService.cs +++ b/Oqtane.Client/Services/Interfaces/ILanguageService.cs @@ -1,6 +1,6 @@ -using Oqtane.Models; using System.Collections.Generic; using System.Threading.Tasks; +using Oqtane.Models; namespace Oqtane.Services { @@ -39,6 +39,13 @@ namespace Oqtane.Services /// Task AddLanguageAsync(Language language); + /// + /// Edits the given language + /// + /// + /// + Task EditLanguageAsync(Language language); + /// /// Deletes the given language /// diff --git a/Oqtane.Client/Services/LanguageService.cs b/Oqtane.Client/Services/LanguageService.cs index f8b432c8..7e95e952 100644 --- a/Oqtane.Client/Services/LanguageService.cs +++ b/Oqtane.Client/Services/LanguageService.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using System.Net.Http; using System.Threading.Tasks; using Oqtane.Documentation; @@ -10,7 +9,7 @@ namespace Oqtane.Services { [PrivateApi("Don't show in the documentation, as everything should use the Interface")] public class LanguageService : ServiceBase, ILanguageService - { + { public LanguageService(HttpClient http, SiteState siteState) : base(http, siteState) { } private string Apiurl => CreateApiUrl("Language"); @@ -35,6 +34,11 @@ namespace Oqtane.Services return await PostJsonAsync(Apiurl, language); } + public async Task EditLanguageAsync(Language language) + { + await PutJsonAsync(Apiurl, language); + } + public async Task DeleteLanguageAsync(int languageId) { await DeleteAsync($"{Apiurl}/{languageId}"); diff --git a/Oqtane.Server/Controllers/LanguageController.cs b/Oqtane.Server/Controllers/LanguageController.cs index e1ac9406..8ed5e4d4 100644 --- a/Oqtane.Server/Controllers/LanguageController.cs +++ b/Oqtane.Server/Controllers/LanguageController.cs @@ -1,5 +1,8 @@ using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; using System.IO; +using System.Linq; using System.Net; using System.Reflection; using Microsoft.AspNetCore.Authorization; @@ -9,9 +12,6 @@ using Oqtane.Infrastructure; using Oqtane.Models; using Oqtane.Repository; using Oqtane.Shared; -using System.Linq; -using System.Diagnostics; -using System.Globalization; namespace Oqtane.Controllers { @@ -102,6 +102,24 @@ namespace Oqtane.Controllers } } + [HttpPut] + [Authorize(Roles = RoleNames.Admin)] + public void Put([FromBody] Language language) + { + if (ModelState.IsValid && language.SiteId == _alias.SiteId) + { + _languages.UpdateLanguage(language); + _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Language, language.LanguageId, SyncEventActions.Update); + _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, _alias.SiteId, SyncEventActions.Refresh); + _logger.Log(LogLevel.Information, this, LogFunction.Create, "Language Updated {Language}", language); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Language Put Attempt {Language}", language); + HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden; + } + } + [HttpPost] [Authorize(Roles = RoleNames.Admin)] public Language Post([FromBody] Language language) diff --git a/Oqtane.Server/Repository/Interfaces/ILanguageRepository.cs b/Oqtane.Server/Repository/Interfaces/ILanguageRepository.cs index 0ec10442..14619121 100644 --- a/Oqtane.Server/Repository/Interfaces/ILanguageRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/ILanguageRepository.cs @@ -9,6 +9,8 @@ namespace Oqtane.Repository Language AddLanguage(Language language); + void UpdateLanguage(Language language); + Language GetLanguage(int languageId); void DeleteLanguage(int languageId); diff --git a/Oqtane.Server/Repository/LanguageRepository.cs b/Oqtane.Server/Repository/LanguageRepository.cs index fb252fd6..80dc01ad 100644 --- a/Oqtane.Server/Repository/LanguageRepository.cs +++ b/Oqtane.Server/Repository/LanguageRepository.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Microsoft.EntityFrameworkCore; using Oqtane.Models; namespace Oqtane.Repository @@ -12,7 +13,7 @@ namespace Oqtane.Repository { _db = context; } - + public IEnumerable GetLanguages(int siteId) { return _db.Language.Where(l => l.SiteId == siteId); @@ -35,6 +36,25 @@ namespace Oqtane.Repository return language; } + public void UpdateLanguage(Language language) + { + if (language.LanguageId != 0) + { + _db.Entry(language).State = EntityState.Modified; + } + if (language.IsDefault) + { + // Ensure all other languages are not set to default + _db.Language + .Where(l => l.SiteId == language.SiteId && + l.LanguageId != language.LanguageId) + .ToList() + .ForEach(l => l.IsDefault = false); + } + + _db.SaveChanges(); + } + public Language GetLanguage(int languageId) { return _db.Language.Find(languageId);