From d7380616e4ae87e9df6324f3ed9c46c46c1059ad Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 16 Nov 2017 18:34:36 +0100 Subject: [PATCH] Closes #173 Closes #174 --- .../Apps/Json/JsonLanguagesConfig.cs | 63 +++++++++++++++++++ .../Apps/Json/LanguagesConfigConverter.cs | 22 ++----- .../pages/languages/language.component.ts | 2 +- .../languages/languages-page.component.ts | 11 +--- .../services/app-languages.service.spec.ts | 46 ++++++++++---- .../shared/services/app-languages.service.ts | 25 ++++++-- .../Model/Apps/LanguagesConfigJsonTests.cs | 5 ++ 7 files changed, 129 insertions(+), 45 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Core.Model/Apps/Json/JsonLanguagesConfig.cs diff --git a/src/Squidex.Domain.Apps.Core.Model/Apps/Json/JsonLanguagesConfig.cs b/src/Squidex.Domain.Apps.Core.Model/Apps/Json/JsonLanguagesConfig.cs new file mode 100644 index 000000000..f23beded4 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Model/Apps/Json/JsonLanguagesConfig.cs @@ -0,0 +1,63 @@ +// ========================================================================== +// JsonLanguagesConfig.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System.Collections.Generic; +using Newtonsoft.Json; +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Core.Apps.Json +{ + public sealed class JsonLanguagesConfig + { + [JsonProperty] + public Dictionary Languages { get; set; } + + [JsonProperty] + public Language Master { get; set; } + + public JsonLanguagesConfig() + { + } + + public JsonLanguagesConfig(LanguagesConfig value) + { + Languages = new Dictionary(value.Count); + + foreach (LanguageConfig config in value) + { + Languages.Add(config.Language, new JsonLanguageConfig(config)); + } + + Master = value.Master?.Language; + } + + public LanguagesConfig ToConfig() + { + var languagesConfig = new LanguageConfig[Languages?.Count ?? 0]; + + if (Languages != null) + { + var i = 0; + + foreach (var config in Languages) + { + languagesConfig[i++] = config.Value.ToConfig(config.Key); + } + } + + var result = LanguagesConfig.Build(languagesConfig); + + if (Master != null) + { + result.MakeMaster(Master); + } + + return result; + } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Model/Apps/Json/LanguagesConfigConverter.cs b/src/Squidex.Domain.Apps.Core.Model/Apps/Json/LanguagesConfigConverter.cs index af52f34a9..98dd331cc 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Apps/Json/LanguagesConfigConverter.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Apps/Json/LanguagesConfigConverter.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using System.Collections.Generic; +using System; using Newtonsoft.Json; using Squidex.Infrastructure.Json; @@ -16,30 +16,16 @@ namespace Squidex.Domain.Apps.Core.Apps.Json { protected override void WriteValue(JsonWriter writer, LanguagesConfig value, JsonSerializer serializer) { - var json = new Dictionary(value.Count); - - foreach (LanguageConfig config in value) - { - json.Add(config.Language, new JsonLanguageConfig(config)); - } + var json = new JsonLanguagesConfig(value); serializer.Serialize(writer, json); } protected override LanguagesConfig ReadValue(JsonReader reader, JsonSerializer serializer) { - var json = serializer.Deserialize>(reader); - - var languagesConfig = new LanguageConfig[json.Count]; - - var i = 0; - - foreach (var config in json) - { - languagesConfig[i++] = config.Value.ToConfig(config.Key); - } + var json = serializer.Deserialize(reader); - return LanguagesConfig.Build(languagesConfig); + return json.ToConfig(); } } } diff --git a/src/Squidex/app/features/settings/pages/languages/language.component.ts b/src/Squidex/app/features/settings/pages/languages/language.component.ts index d87f60111..25ac3b704 100644 --- a/src/Squidex/app/features/settings/pages/languages/language.component.ts +++ b/src/Squidex/app/features/settings/pages/languages/language.component.ts @@ -130,7 +130,7 @@ export class LanguageComponent implements OnInit, OnChanges, OnDestroy { this.allLanguages.filter(l => this.language.iso2Code !== l.iso2Code && this.language.fallback.indexOf(l.iso2Code) < 0); - this.otherLanguage = this.otherLanguages.values[0]; + this.otherLanguage = this.otherLanguages[0]; } if (this.language) { diff --git a/src/Squidex/app/features/settings/pages/languages/languages-page.component.ts b/src/Squidex/app/features/settings/pages/languages/languages-page.component.ts index 40b82b236..cb23a9962 100644 --- a/src/Squidex/app/features/settings/pages/languages/languages-page.component.ts +++ b/src/Squidex/app/features/settings/pages/languages/languages-page.component.ts @@ -106,16 +106,7 @@ export class LanguagesPageComponent implements OnInit { this.appLanguages = new AppLanguagesDto( - appLanguages.languages.map(l => { - const isMaster = masterId ? l.iso2Code === masterId : l.isMaster; - - return new AppLanguageDto( - l.iso2Code, - l.englishName, isMaster, - l.isOptional, - l.fallback.filter(f => !!appLanguages.languages.find(l2 => l2.iso2Code === f)) - ); - }).sort((a, b) => { + appLanguages.languages.sort((a, b) => { if (a.isMaster === b.isMaster) { return a.iso2Code.localeCompare(b.iso2Code); } else { diff --git a/src/Squidex/app/shared/services/app-languages.service.spec.ts b/src/Squidex/app/shared/services/app-languages.service.spec.ts index 9b249ae45..b9f8b1c03 100644 --- a/src/Squidex/app/shared/services/app-languages.service.spec.ts +++ b/src/Squidex/app/shared/services/app-languages.service.spec.ts @@ -20,34 +20,56 @@ import { } from './../'; describe('AppLanguageDto', () => { - const language1 = new AppLanguageDto('de', 'English', false, false, []); - const language2 = new AppLanguageDto('en', 'English', false, false, []); - const language2_new = new AppLanguageDto('en', 'English (United States)', false, false, []); const version = new Version('1'); const newVersion = new Version('2'); it('should update languages when adding language', () => { - const languages_1 = new AppLanguagesDto([language1], version); - const languages_2 = languages_1.addLanguage(language2, newVersion); + const language1_1 = new AppLanguageDto('de', 'English', true, false, []); + const language2_1 = new AppLanguageDto('it', 'Italien', false, false, []); - expect(languages_2.languages).toEqual([language1, language2]); + const languages_1 = new AppLanguagesDto([language1_1], version); + const languages_2 = languages_1.addLanguage(language2_1, newVersion); + + expect(languages_2.languages).toEqual([language1_1, language2_1]); expect(languages_2.version).toEqual(newVersion); }); it('should update languages when removing language', () => { - const languages_1 = new AppLanguagesDto([language1, language2], version); - const languages_2 = languages_1.removeLanguage(language1, newVersion); + const language1_1 = new AppLanguageDto('de', 'English', true, false, ['it']); + const language1_2 = new AppLanguageDto('de', 'English', true, false, []); + const language2_1 = new AppLanguageDto('it', 'Italien', false, false, []); + + const languages_1 = new AppLanguagesDto([language1_1, language2_1], version); + const languages_2 = languages_1.removeLanguage(language2_1, newVersion); - expect(languages_2.languages).toEqual([language2]); + expect(languages_2.languages).toEqual([language1_2]); expect(languages_2.version).toEqual(newVersion); }); it('should update languages when updating language', () => { - const languages_1 = new AppLanguagesDto([language1, language2], version); - const languages_2 = languages_1.updateLanguage(language2_new, newVersion); + const language1_1 = new AppLanguageDto('de', 'English', true, false, ['it']); + const language2_1 = new AppLanguageDto('it', 'Italien', false, false, []); + const language2_2 = new AppLanguageDto('it', 'Italien', false, false, ['de']); + + const languages_1 = new AppLanguagesDto([language1_1, language2_1], version); + const languages_2 = languages_1.updateLanguage(language2_2, newVersion); + + expect(languages_2.languages).toEqual([language1_1, language2_2]); + expect(languages_2.version).toEqual(newVersion); + }); + + it('should update master language when updating language', () => { + const language1_1 = new AppLanguageDto('de', 'English', true, false, ['it']); + const language1_2 = new AppLanguageDto('de', 'English', false, false, ['it']); + const language2_1 = new AppLanguageDto('it', 'Italien', false, false, []); + const language2_2 = new AppLanguageDto('it', 'Italien', true, false, ['de']); + + const languages_1 = new AppLanguagesDto([language1_1, language2_1], version); + const languages_2 = languages_1.updateLanguage(language2_2, newVersion); - expect(languages_2.languages).toEqual([language1, language2_new]); + expect(languages_2.languages).toEqual([language1_2, language2_2]); expect(languages_2.version).toEqual(newVersion); + expect(languages_2.languages[0].isMaster).toBeFalsy(); }); }); diff --git a/src/Squidex/app/shared/services/app-languages.service.ts b/src/Squidex/app/shared/services/app-languages.service.ts index f5da2e4fb..78f6bc6e9 100644 --- a/src/Squidex/app/shared/services/app-languages.service.ts +++ b/src/Squidex/app/shared/services/app-languages.service.ts @@ -30,12 +30,29 @@ export class AppLanguagesDto { return new AppLanguagesDto([...this.languages, language], version); } - public updateLanguage(language: AppLanguageDto, version: Version) { - return new AppLanguagesDto(this.languages.map(l => l.iso2Code === language.iso2Code ? language : l), version); + public removeLanguage(language: AppLanguageDto, version: Version) { + return new AppLanguagesDto( + this.languages.filter(l => l.iso2Code !== language.iso2Code).map(l => { + return new AppLanguageDto( + l.iso2Code, + l.englishName, + l.isMaster, + l.isOptional, + l.fallback.filter(f => f !== language.iso2Code)); + }), version); } - public removeLanguage(language: AppLanguageDto, version: Version) { - return new AppLanguagesDto(this.languages.filter(l => l.iso2Code !== language.iso2Code), version); + public updateLanguage(language: AppLanguageDto, version: Version) { + return new AppLanguagesDto( + this.languages.map(l => { + if (l.iso2Code === language.iso2Code) { + return language; + } else if (l.isMaster && language.isMaster) { + return new AppLanguageDto(l.iso2Code, l.englishName, false, l.isOptional, l.fallback); + } else { + return l; + } + }), version); } } diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigJsonTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigJsonTests.cs index cd5ae5eb9..e54510c0c 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigJsonTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigJsonTests.cs @@ -6,6 +6,7 @@ // All rights reserved. // ========================================================================== +using System.Linq; using FluentAssertions; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -27,9 +28,13 @@ namespace Squidex.Domain.Apps.Core.Model.Apps new LanguageConfig(Language.DE, true, Language.EN), new LanguageConfig(Language.IT, false, Language.DE)); + sut.MakeMaster(Language.IT); + var serialized = JToken.FromObject(sut, serializer).ToObject(serializer); serialized.ShouldBeEquivalentTo(sut); + + Assert.Same(serialized.FirstOrDefault(x => x.Key == "it"), serialized.Master); } } }