Browse Source

Closes #173

Closes #174
pull/177/head
Sebastian Stehle 8 years ago
parent
commit
d7380616e4
  1. 63
      src/Squidex.Domain.Apps.Core.Model/Apps/Json/JsonLanguagesConfig.cs
  2. 22
      src/Squidex.Domain.Apps.Core.Model/Apps/Json/LanguagesConfigConverter.cs
  3. 2
      src/Squidex/app/features/settings/pages/languages/language.component.ts
  4. 11
      src/Squidex/app/features/settings/pages/languages/languages-page.component.ts
  5. 46
      src/Squidex/app/shared/services/app-languages.service.spec.ts
  6. 25
      src/Squidex/app/shared/services/app-languages.service.ts
  7. 5
      tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigJsonTests.cs

63
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<string, JsonLanguageConfig> Languages { get; set; }
[JsonProperty]
public Language Master { get; set; }
public JsonLanguagesConfig()
{
}
public JsonLanguagesConfig(LanguagesConfig value)
{
Languages = new Dictionary<string, JsonLanguageConfig>(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;
}
}
}

22
src/Squidex.Domain.Apps.Core.Model/Apps/Json/LanguagesConfigConverter.cs

@ -6,7 +6,7 @@
// All rights reserved. // All rights reserved.
// ========================================================================== // ==========================================================================
using System.Collections.Generic; using System;
using Newtonsoft.Json; using Newtonsoft.Json;
using Squidex.Infrastructure.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) protected override void WriteValue(JsonWriter writer, LanguagesConfig value, JsonSerializer serializer)
{ {
var json = new Dictionary<string, JsonLanguageConfig>(value.Count); var json = new JsonLanguagesConfig(value);
foreach (LanguageConfig config in value)
{
json.Add(config.Language, new JsonLanguageConfig(config));
}
serializer.Serialize(writer, json); serializer.Serialize(writer, json);
} }
protected override LanguagesConfig ReadValue(JsonReader reader, JsonSerializer serializer) protected override LanguagesConfig ReadValue(JsonReader reader, JsonSerializer serializer)
{ {
var json = serializer.Deserialize<Dictionary<string, JsonLanguageConfig>>(reader); var json = serializer.Deserialize<JsonLanguagesConfig>(reader);
var languagesConfig = new LanguageConfig[json.Count];
var i = 0;
foreach (var config in json)
{
languagesConfig[i++] = config.Value.ToConfig(config.Key);
}
return LanguagesConfig.Build(languagesConfig); return json.ToConfig();
} }
} }
} }

2
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.allLanguages.filter(l =>
this.language.iso2Code !== l.iso2Code && this.language.iso2Code !== l.iso2Code &&
this.language.fallback.indexOf(l.iso2Code) < 0); this.language.fallback.indexOf(l.iso2Code) < 0);
this.otherLanguage = this.otherLanguages.values[0]; this.otherLanguage = this.otherLanguages[0];
} }
if (this.language) { if (this.language) {

11
src/Squidex/app/features/settings/pages/languages/languages-page.component.ts

@ -106,16 +106,7 @@ export class LanguagesPageComponent implements OnInit {
this.appLanguages = this.appLanguages =
new AppLanguagesDto( new AppLanguagesDto(
appLanguages.languages.map(l => { appLanguages.languages.sort((a, b) => {
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) => {
if (a.isMaster === b.isMaster) { if (a.isMaster === b.isMaster) {
return a.iso2Code.localeCompare(b.iso2Code); return a.iso2Code.localeCompare(b.iso2Code);
} else { } else {

46
src/Squidex/app/shared/services/app-languages.service.spec.ts

@ -20,34 +20,56 @@ import {
} from './../'; } from './../';
describe('AppLanguageDto', () => { 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 version = new Version('1');
const newVersion = new Version('2'); const newVersion = new Version('2');
it('should update languages when adding language', () => { it('should update languages when adding language', () => {
const languages_1 = new AppLanguagesDto([language1], version); const language1_1 = new AppLanguageDto('de', 'English', true, false, []);
const languages_2 = languages_1.addLanguage(language2, newVersion); 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); expect(languages_2.version).toEqual(newVersion);
}); });
it('should update languages when removing language', () => { it('should update languages when removing language', () => {
const languages_1 = new AppLanguagesDto([language1, language2], version); const language1_1 = new AppLanguageDto('de', 'English', true, false, ['it']);
const languages_2 = languages_1.removeLanguage(language1, newVersion); 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); expect(languages_2.version).toEqual(newVersion);
}); });
it('should update languages when updating language', () => { it('should update languages when updating language', () => {
const languages_1 = new AppLanguagesDto([language1, language2], version); const language1_1 = new AppLanguageDto('de', 'English', true, false, ['it']);
const languages_2 = languages_1.updateLanguage(language2_new, newVersion); 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.version).toEqual(newVersion);
expect(languages_2.languages[0].isMaster).toBeFalsy();
}); });
}); });

25
src/Squidex/app/shared/services/app-languages.service.ts

@ -30,12 +30,29 @@ export class AppLanguagesDto {
return new AppLanguagesDto([...this.languages, language], version); return new AppLanguagesDto([...this.languages, language], version);
} }
public updateLanguage(language: AppLanguageDto, version: Version) { public removeLanguage(language: AppLanguageDto, version: Version) {
return new AppLanguagesDto(this.languages.map(l => l.iso2Code === language.iso2Code ? language : l), 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) { public updateLanguage(language: AppLanguageDto, version: Version) {
return new AppLanguagesDto(this.languages.filter(l => l.iso2Code !== language.iso2Code), 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);
} }
} }

5
tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigJsonTests.cs

@ -6,6 +6,7 @@
// All rights reserved. // All rights reserved.
// ========================================================================== // ==========================================================================
using System.Linq;
using FluentAssertions; using FluentAssertions;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; 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.DE, true, Language.EN),
new LanguageConfig(Language.IT, false, Language.DE)); new LanguageConfig(Language.IT, false, Language.DE));
sut.MakeMaster(Language.IT);
var serialized = JToken.FromObject(sut, serializer).ToObject<LanguagesConfig>(serializer); var serialized = JToken.FromObject(sut, serializer).ToObject<LanguagesConfig>(serializer);
serialized.ShouldBeEquivalentTo(sut); serialized.ShouldBeEquivalentTo(sut);
Assert.Same(serialized.FirstOrDefault(x => x.Key == "it"), serialized.Master);
} }
} }
} }

Loading…
Cancel
Save