Browse Source

Closes #46

Closes #47
pull/65/head
Sebastian Stehle 9 years ago
parent
commit
0f45c4ac99
  1. 56
      src/Squidex.Core/Contents/ContentData.cs
  2. 4
      src/Squidex.Read.MongoDb/Contents/MongoContentEntity.cs
  3. 48
      src/Squidex/app/framework/angular/json-editor.component.ts
  4. 50
      tests/Squidex.Core.Tests/Contents/ContentDataTests.cs

56
src/Squidex.Core/Contents/ContentData.cs

@ -9,6 +9,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Squidex.Core.Schemas; using Squidex.Core.Schemas;
using Squidex.Infrastructure; using Squidex.Infrastructure;
@ -84,7 +85,7 @@ namespace Squidex.Core.Contents
return result; return result;
} }
public ContentData ToIdModel(Schema schema) public ContentData ToIdModel(Schema schema, bool encodeJsonField)
{ {
Guard.NotNull(schema, nameof(schema)); Guard.NotNull(schema, nameof(schema));
@ -97,13 +98,38 @@ namespace Squidex.Core.Contents
continue; continue;
} }
result[field.Id.ToString()] = fieldValue.Value; var fieldId = field.Id.ToString();
if (encodeJsonField && field is JsonField)
{
var encodedValue = new ContentFieldData();
foreach (var languageValue in fieldValue.Value)
{
if (languageValue.Value == null || languageValue.Value.Type == JTokenType.Null)
{
encodedValue[languageValue.Key] = null;
}
else
{
var value = Convert.ToBase64String(Encoding.UTF8.GetBytes(languageValue.Value.ToString()));
encodedValue[languageValue.Key] = value;
}
}
result[fieldId] = encodedValue;
}
else
{
result[fieldId] = fieldValue.Value;
}
} }
return result; return result;
} }
public ContentData ToNameModel(Schema schema) public ContentData ToNameModel(Schema schema, bool decodeJsonField)
{ {
Guard.NotNull(schema, nameof(schema)); Guard.NotNull(schema, nameof(schema));
@ -116,8 +142,32 @@ namespace Squidex.Core.Contents
continue; continue;
} }
if (decodeJsonField && field is JsonField)
{
var encodedValue = new ContentFieldData();
foreach (var languageValue in fieldValue.Value)
{
if (languageValue.Value == null || languageValue.Value.Type == JTokenType.Null)
{
encodedValue[languageValue.Key] = null;
}
else
{
var value = Encoding.UTF8.GetString(Convert.FromBase64String(languageValue.Value.ToString()));
encodedValue[languageValue.Key] = JToken.Parse(value);
}
}
result[field.Name] = encodedValue;
}
else
{
result[field.Name] = fieldValue.Value; result[field.Name] = fieldValue.Value;
} }
}
return result; return result;
} }

4
src/Squidex.Read.MongoDb/Contents/MongoContentEntity.cs

@ -69,7 +69,7 @@ namespace Squidex.Read.MongoDb.Contents
{ {
if (Data != null) if (Data != null)
{ {
contentData = JsonConvert.DeserializeObject<ContentData>(Data.ToJson()).ToNameModel(schema); contentData = JsonConvert.DeserializeObject<ContentData>(Data.ToJson()).ToNameModel(schema, true);
} }
else else
{ {
@ -81,7 +81,7 @@ namespace Squidex.Read.MongoDb.Contents
{ {
if (newContentData != null) if (newContentData != null)
{ {
Data = BsonDocument.Parse(JsonConvert.SerializeObject(newContentData.ToIdModel(schema))); Data = BsonDocument.Parse(JsonConvert.SerializeObject(newContentData.ToIdModel(schema, true)));
} }
else else
{ {

48
src/Squidex/app/framework/angular/json-editor.component.ts

@ -30,7 +30,8 @@ export class JsonEditorComponent implements ControlValueAccessor, AfterViewInit
private touchedCallback: () => void = NOOP; private touchedCallback: () => void = NOOP;
private valueChanged = new Subject(); private valueChanged = new Subject();
private aceEditor: any; private aceEditor: any;
private value: any; private oldValue: any;
private oldValueString: string;
private isDisabled = false; private isDisabled = false;
@ViewChild('editor') @ViewChild('editor')
@ -42,7 +43,8 @@ export class JsonEditorComponent implements ControlValueAccessor, AfterViewInit
} }
public writeValue(value: any) { public writeValue(value: any) {
this.value = value; this.oldValue = value;
this.oldValueString = JSON.stringify(value);
if (this.aceEditor) { if (this.aceEditor) {
this.setValue(value); this.setValue(value);
@ -66,21 +68,9 @@ export class JsonEditorComponent implements ControlValueAccessor, AfterViewInit
} }
public ngAfterViewInit() { public ngAfterViewInit() {
this.valueChanged.debounceTime(1000) this.valueChanged.debounceTime(500)
.subscribe(() => { .subscribe(() => {
const isValid = this.aceEditor.getSession().getAnnotations().length === 0; this.changeValue();
if (!isValid) {
this.changeCallback(null);
} else {
try {
const value = JSON.parse(this.aceEditor.getValue());
this.changeCallback(value);
} catch (e) {
this.changeCallback(null);
}
}
}); });
this.resourceLoader.loadScript('https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/ace.js').then(() => { this.resourceLoader.loadScript('https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/ace.js').then(() => {
@ -90,9 +80,10 @@ export class JsonEditorComponent implements ControlValueAccessor, AfterViewInit
this.aceEditor.setReadOnly(this.isDisabled); this.aceEditor.setReadOnly(this.isDisabled);
this.aceEditor.setFontSize(14); this.aceEditor.setFontSize(14);
this.setValue(this.value); this.setValue(this.oldValue);
this.aceEditor.on('blur', () => { this.aceEditor.on('blur', () => {
this.changeValue();
this.touchedCallback(); this.touchedCallback();
}); });
@ -102,6 +93,29 @@ export class JsonEditorComponent implements ControlValueAccessor, AfterViewInit
}); });
} }
private changeValue() {
const isValid = this.aceEditor.getSession().getAnnotations().length === 0;
let newValue: any = null;
if (isValid) {
try {
newValue = JSON.parse(this.aceEditor.getValue());
} catch (e) {
newValue = null;
}
}
const newValueString = JSON.stringify(newValue);
if (this.oldValueString !== newValueString) {
this.changeCallback(newValue);
}
this.oldValue = newValue;
this.oldValueString = newValueString;
}
private setValue(value: any) { private setValue(value: any) {
if (value) { if (value) {
const jsonString = JSON.stringify(value, undefined, 4); const jsonString = JSON.stringify(value, undefined, 4);

50
tests/Squidex.Core.Tests/Contents/ContentDataTests.cs

@ -24,6 +24,8 @@ namespace Squidex.Core.Contents
new NumberFieldProperties { IsLocalizable = false })) new NumberFieldProperties { IsLocalizable = false }))
.AddOrUpdateField(new NumberField(3, "field3", .AddOrUpdateField(new NumberField(3, "field3",
new NumberFieldProperties { IsLocalizable = false })) new NumberFieldProperties { IsLocalizable = false }))
.AddOrUpdateField(new JsonField(4, "json",
new JsonFieldProperties { IsLocalizable = true }))
.HideField(3); .HideField(3);
private readonly LanguagesConfig languagesConfig = LanguagesConfig.Create(Language.EN, Language.DE); private readonly LanguagesConfig languagesConfig = LanguagesConfig.Create(Language.EN, Language.DE);
@ -43,7 +45,7 @@ namespace Squidex.Core.Contents
new ContentFieldData() new ContentFieldData()
.AddValue("iv", 3)); .AddValue("iv", 3));
var actual = input.ToIdModel(schema); var actual = input.ToIdModel(schema, false);
var expected = var expected =
new ContentData() new ContentData()
@ -59,7 +61,31 @@ namespace Squidex.Core.Contents
} }
[Fact] [Fact]
public void Should_convert_to_from_id_model() public void Should_convert_to_encoded_id_model()
{
var input =
new ContentData()
.AddField("json",
new ContentFieldData()
.AddValue("en", new JObject())
.AddValue("de", null)
.AddValue("it", JValue.CreateNull()));
var actual = input.ToIdModel(schema, true);
var expected =
new ContentData()
.AddField("4",
new ContentFieldData()
.AddValue("en", "e30=")
.AddValue("de", null)
.AddValue("it", null));
Assert.Equal(expected, actual);
}
[Fact]
public void Should_convert_from_id_model()
{ {
var input = var input =
new ContentData() new ContentData()
@ -74,7 +100,7 @@ namespace Squidex.Core.Contents
new ContentFieldData() new ContentFieldData()
.AddValue("iv", 3)); .AddValue("iv", 3));
var actual = input.ToNameModel(schema); var actual = input.ToNameModel(schema, false);
var expected = var expected =
new ContentData() new ContentData()
@ -88,6 +114,23 @@ namespace Squidex.Core.Contents
Assert.Equal(expected, actual); Assert.Equal(expected, actual);
} }
[Fact]
public void Should_convert_from_encoded_id_model()
{
var input =
new ContentData()
.AddField("4",
new ContentFieldData()
.AddValue("en", "e30=")
.AddValue("de", null)
.AddValue("it", null));
var actual = input.ToNameModel(schema, true);
Assert.True(actual["json"]["en"] is JObject);
}
[Fact] [Fact]
public void Should_cleanup_old_fields() public void Should_cleanup_old_fields()
{ {
@ -112,6 +155,7 @@ namespace Squidex.Core.Contents
Assert.Equal(expected, actual); Assert.Equal(expected, actual);
} }
[Fact] [Fact]
public void Should_cleanup_old_languages() public void Should_cleanup_old_languages()
{ {

Loading…
Cancel
Save