Browse Source

Closes #139

pull/141/head
Sebastian Stehle 9 years ago
parent
commit
8e89b338c4
  1. 1
      src/Squidex.Domain.Apps.Core/ContentEnricher.cs
  2. 2
      src/Squidex.Domain.Apps.Core/Contents/NamedContentData.cs
  3. 37
      src/Squidex.Domain.Apps.Core/InvariantPartitioning.cs
  4. 9
      src/Squidex.Domain.Apps.Core/LanguageConfig.cs
  5. 6
      src/Squidex.Domain.Apps.Core/LanguagesConfig.cs
  6. 2
      src/Squidex.Domain.Apps.Read.MongoDb/Apps/MongoAppEntity.cs
  7. 2
      src/Squidex/Controllers/Api/Apps/AppLanguagesController.cs
  8. 47
      src/Squidex/app/framework/angular/http-extensions-impl.ts

1
src/Squidex.Domain.Apps.Core/ContentEnricher.cs

@ -6,7 +6,6 @@
// All rights reserved. // All rights reserved.
// ========================================================================== // ==========================================================================
using Newtonsoft.Json.Linq;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Infrastructure; using Squidex.Infrastructure;

2
src/Squidex.Domain.Apps.Core/Contents/NamedContentData.cs

@ -156,7 +156,7 @@ namespace Squidex.Domain.Apps.Core.Contents
if (languagePreferences.Count == 1 && languagesConfig.TryGetConfig(languagePreferences.First(), out var languageConfig)) if (languagePreferences.Count == 1 && languagesConfig.TryGetConfig(languagePreferences.First(), out var languageConfig))
{ {
languagePreferences = languagePreferences.Union(languageConfig.Fallback).ToList(); languagePreferences = languagePreferences.Union(languageConfig.LanguageFallbacks).ToList();
} }
var result = new Dictionary<string, JToken>(); var result = new Dictionary<string, JToken>();

37
src/Squidex.Domain.Apps.Core/InvariantPartitioning.cs

@ -13,31 +13,38 @@ using System.Linq;
namespace Squidex.Domain.Apps.Core namespace Squidex.Domain.Apps.Core
{ {
public sealed class InvariantPartitioning : IFieldPartitioning public sealed class InvariantPartitioning : IFieldPartitioning, IFieldPartitionItem
{ {
public static readonly InvariantPartitioning Instance = new InvariantPartitioning(); public static readonly InvariantPartitioning Instance = new InvariantPartitioning();
private readonly InvariantItem invariantItem = new InvariantItem(); public int Count
private sealed class InvariantItem : IFieldPartitionItem
{ {
public string Key { get; } = "iv"; get { return 1; }
}
public string Name { get; } = "Invariant"; public IFieldPartitionItem Master
{
get { return this; }
}
public bool IsOptional { get; } = false; string IFieldPartitionItem.Key
{
get { return "iv"; }
}
public IEnumerable<string> Fallback { get; } = Enumerable.Empty<string>(); string IFieldPartitionItem.Name
{
get { return "ivInvariant"; }
} }
public int Count bool IFieldPartitionItem.IsOptional
{ {
get { return 1; } get { return false; }
} }
public IFieldPartitionItem Master IEnumerable<string> IFieldPartitionItem.Fallback
{ {
get { return invariantItem; } get { return Enumerable.Empty<string>(); }
} }
private InvariantPartitioning() private InvariantPartitioning()
@ -48,19 +55,19 @@ namespace Squidex.Domain.Apps.Core
{ {
var isFound = string.Equals(key, "iv", StringComparison.OrdinalIgnoreCase); var isFound = string.Equals(key, "iv", StringComparison.OrdinalIgnoreCase);
item = isFound ? invariantItem : null; item = isFound ? this : null;
return isFound; return isFound;
} }
IEnumerator<IFieldPartitionItem> IEnumerable<IFieldPartitionItem>.GetEnumerator() IEnumerator<IFieldPartitionItem> IEnumerable<IFieldPartitionItem>.GetEnumerator()
{ {
yield return invariantItem; yield return this;
} }
IEnumerator IEnumerable.GetEnumerator() IEnumerator IEnumerable.GetEnumerator()
{ {
yield return invariantItem; yield return this;
} }
} }
} }

9
src/Squidex.Domain.Apps.Core/LanguageConfig.cs

@ -19,7 +19,7 @@ namespace Squidex.Domain.Apps.Core
public Language Language { get; } public Language Language { get; }
public ImmutableList<Language> Fallback { get; } public ImmutableList<Language> LanguageFallbacks { get; }
public string Key public string Key
{ {
@ -33,7 +33,7 @@ namespace Squidex.Domain.Apps.Core
IEnumerable<string> IFieldPartitionItem.Fallback IEnumerable<string> IFieldPartitionItem.Fallback
{ {
get { return Fallback.Select(x => x.Iso2Code); } get { return LanguageFallbacks.Select(x => x.Iso2Code); }
} }
public LanguageConfig(Language language, bool isOptional, params Language[] fallback) public LanguageConfig(Language language, bool isOptional, params Language[] fallback)
@ -50,11 +50,10 @@ namespace Squidex.Domain.Apps.Core
{ {
Guard.NotNull(language, nameof(language)); Guard.NotNull(language, nameof(language));
Language = language;
IsOptional = isOptional; IsOptional = isOptional;
Fallback = fallback ?? ImmutableList<Language>.Empty; Language = language;
LanguageFallbacks = fallback ?? ImmutableList<Language>.Empty;
} }
} }
} }

6
src/Squidex.Domain.Apps.Core/LanguagesConfig.cs

@ -112,14 +112,14 @@ namespace Squidex.Domain.Apps.Core
foreach (var languageConfig in newLanguages.Values) foreach (var languageConfig in newLanguages.Values)
{ {
if (languageConfig.Fallback.Contains(language)) if (languageConfig.LanguageFallbacks.Contains(language))
{ {
newLanguages = newLanguages =
newLanguages.SetItem(languageConfig.Language, newLanguages.SetItem(languageConfig.Language,
new LanguageConfig( new LanguageConfig(
languageConfig.Language, languageConfig.Language,
languageConfig.IsOptional, languageConfig.IsOptional,
languageConfig.Fallback.Remove(language))); languageConfig.LanguageFallbacks.Remove(language)));
} }
} }
@ -156,7 +156,7 @@ namespace Squidex.Domain.Apps.Core
foreach (var languageConfig in languages.Values) foreach (var languageConfig in languages.Values)
{ {
foreach (var fallback in languageConfig.Fallback) foreach (var fallback in languageConfig.LanguageFallbacks)
{ {
if (!languages.ContainsKey(fallback)) if (!languages.ContainsKey(fallback))
{ {

2
src/Squidex.Domain.Apps.Read.MongoDb/Apps/MongoAppEntity.cs

@ -104,7 +104,7 @@ namespace Squidex.Domain.Apps.Read.MongoDb.Apps
private static MongoAppEntityLanguage FromLanguageConfig(LanguageConfig l) private static MongoAppEntityLanguage FromLanguageConfig(LanguageConfig l)
{ {
return new MongoAppEntityLanguage { Iso2Code = l.Language, IsOptional = l.IsOptional, Fallback = l.Fallback.Select(x => x.Iso2Code).ToList() }; return new MongoAppEntityLanguage { Iso2Code = l.Language, IsOptional = l.IsOptional, Fallback = l.LanguageFallbacks.Select(x => x.Iso2Code).ToList() };
} }
private static LanguageConfig ToLanguageConfig(MongoAppEntityLanguage l) private static LanguageConfig ToLanguageConfig(MongoAppEntityLanguage l)

2
src/Squidex/Controllers/Api/Apps/AppLanguagesController.cs

@ -56,7 +56,7 @@ namespace Squidex.Controllers.Api.Apps
{ {
IsMaster = x == App.LanguagesConfig.Master, IsMaster = x == App.LanguagesConfig.Master,
IsOptional = x.IsOptional, IsOptional = x.IsOptional,
Fallback = x.Fallback.ToList() Fallback = x.LanguageFallbacks.ToList()
})).OrderByDescending(x => x.IsMaster).ThenBy(x => x.Iso2Code).ToList(); })).OrderByDescending(x => x.IsMaster).ThenBy(x => x.Iso2Code).ToList();
Response.Headers["ETag"] = new StringValues(App.Version.ToString()); Response.Headers["ETag"] = new StringValues(App.Version.ToString());

47
src/Squidex/app/framework/angular/http-extensions-impl.ts

@ -18,38 +18,41 @@ export class Versioned<T> {
} }
} }
export class ErrorDto { function formatMessage(message: string, details?: string[]) {
public get displayMessage(): string { const parts: string[] = [];
let result = this.message;
let lastChar: string;
if (this.details && this.details.length > 0) {
const detailMessage = this.details[0];
lastChar = result[result.length - 1]; const addPart = (p: string) => {
p = p.trim();
if (lastChar !== '.' && lastChar !== ',') { const c = p[p.length - 1];
result += '.';
}
result += ' '; if (c !== '.') {
result += detailMessage; p += '.';
} }
lastChar = result[result.length - 1]; parts.push(p);
};
if (lastChar !== '.') { addPart(message);
result += '.';
}
return result; if (details) {
for (let d of details) {
addPart(d);
}
} }
return parts.join(' ');
}
export class ErrorDto {
public readonly displayMessage: string;
constructor( constructor(
public readonly statusCode: number, public readonly statusCode: number,
public readonly message: string, public readonly message: string,
public readonly details: string[] = [] public readonly details: string[] = []
) { ) {
this.displayMessage = formatMessage(message, details);
} }
} }
@ -97,12 +100,12 @@ export module HTTP {
export function pretifyError(message: string): Observable<any> { export function pretifyError(message: string): Observable<any> {
return this.catch((response: HttpErrorResponse) => { return this.catch((response: HttpErrorResponse) => {
let result = new ErrorDto(500, message); let result: ErrorDto = null;
if (!(response.error instanceof Error)) { if (!(response.error instanceof Error)) {
const errorDto = response.error;
try { try {
const errorDto = JSON.parse(response.error);
if (response.status === 412) { if (response.status === 412) {
result = new ErrorDto(response.status, 'Failed to make the update. Another user has made a change. Please reload.'); result = new ErrorDto(response.status, 'Failed to make the update. Another user has made a change. Please reload.');
} else if (response.status !== 500) { } else if (response.status !== 500) {
@ -113,6 +116,8 @@ export function pretifyError(message: string): Observable<any> {
} }
} }
result = result || new ErrorDto(500, message);
return Observable.throw(result); return Observable.throw(result);
}); });
} }
Loading…
Cancel
Save