Browse Source

Closes #139

pull/141/head
Sebastian Stehle 8 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.
// ==========================================================================
using Newtonsoft.Json.Linq;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.Schemas;
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))
{
languagePreferences = languagePreferences.Union(languageConfig.Fallback).ToList();
languagePreferences = languagePreferences.Union(languageConfig.LanguageFallbacks).ToList();
}
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
{
public sealed class InvariantPartitioning : IFieldPartitioning
public sealed class InvariantPartitioning : IFieldPartitioning, IFieldPartitionItem
{
public static readonly InvariantPartitioning Instance = new InvariantPartitioning();
private readonly InvariantItem invariantItem = new InvariantItem();
private sealed class InvariantItem : IFieldPartitionItem
public int Count
{
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()
@ -48,19 +55,19 @@ namespace Squidex.Domain.Apps.Core
{
var isFound = string.Equals(key, "iv", StringComparison.OrdinalIgnoreCase);
item = isFound ? invariantItem : null;
item = isFound ? this : null;
return isFound;
}
IEnumerator<IFieldPartitionItem> IEnumerable<IFieldPartitionItem>.GetEnumerator()
{
yield return invariantItem;
yield return this;
}
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 ImmutableList<Language> Fallback { get; }
public ImmutableList<Language> LanguageFallbacks { get; }
public string Key
{
@ -33,7 +33,7 @@ namespace Squidex.Domain.Apps.Core
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)
@ -50,11 +50,10 @@ namespace Squidex.Domain.Apps.Core
{
Guard.NotNull(language, nameof(language));
Language = language;
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)
{
if (languageConfig.Fallback.Contains(language))
if (languageConfig.LanguageFallbacks.Contains(language))
{
newLanguages =
newLanguages.SetItem(languageConfig.Language,
new LanguageConfig(
languageConfig.Language,
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 fallback in languageConfig.Fallback)
foreach (var fallback in languageConfig.LanguageFallbacks)
{
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)
{
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)

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

@ -56,7 +56,7 @@ namespace Squidex.Controllers.Api.Apps
{
IsMaster = x == App.LanguagesConfig.Master,
IsOptional = x.IsOptional,
Fallback = x.Fallback.ToList()
Fallback = x.LanguageFallbacks.ToList()
})).OrderByDescending(x => x.IsMaster).ThenBy(x => x.Iso2Code).ToList();
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 {
public get displayMessage(): string {
let result = this.message;
let lastChar: string;
if (this.details && this.details.length > 0) {
const detailMessage = this.details[0];
function formatMessage(message: string, details?: string[]) {
const parts: string[] = [];
lastChar = result[result.length - 1];
const addPart = (p: string) => {
p = p.trim();
if (lastChar !== '.' && lastChar !== ',') {
result += '.';
}
const c = p[p.length - 1];
result += ' ';
result += detailMessage;
if (c !== '.') {
p += '.';
}
lastChar = result[result.length - 1];
parts.push(p);
};
if (lastChar !== '.') {
result += '.';
}
addPart(message);
return result;
if (details) {
for (let d of details) {
addPart(d);
}
}
return parts.join(' ');
}
export class ErrorDto {
public readonly displayMessage: string;
constructor(
public readonly statusCode: number,
public readonly message: string,
public readonly details: string[] = []
) {
this.displayMessage = formatMessage(message, details);
}
}
@ -97,12 +100,12 @@ export module HTTP {
export function pretifyError(message: string): Observable<any> {
return this.catch((response: HttpErrorResponse) => {
let result = new ErrorDto(500, message);
let result: ErrorDto = null;
if (!(response.error instanceof Error)) {
const errorDto = response.error;
try {
const errorDto = JSON.parse(response.error);
if (response.status === 412) {
result = new ErrorDto(response.status, 'Failed to make the update. Another user has made a change. Please reload.');
} 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);
});
}
Loading…
Cancel
Save