diff --git a/src/Umbraco.Core/Manifest/PropertyEditorConverter.cs b/src/Umbraco.Core/Manifest/PropertyEditorConverter.cs index 8d946d56a9..e6f256c789 100644 --- a/src/Umbraco.Core/Manifest/PropertyEditorConverter.cs +++ b/src/Umbraco.Core/Manifest/PropertyEditorConverter.cs @@ -28,14 +28,63 @@ namespace Umbraco.Core.Manifest { View = jObject["editor"]["view"].ToString() }; - + + //the manifest JSON is a simplified json for the validators which is actually a dictionary, however, the + //c# model requires an array of validators not a dictionary so we need to change the json to an array + //to deserialize properly. + JArray converted; + if (TryConvertValidatorDictionaryToArray(jObject["editor"]["validation"] as JObject, out converted)) + { + jObject["editor"]["validation"] = converted; + } + } - if (jObject["preValueEditor"] != null) + if (jObject["prevalues"] != null) { target.ManifestDefinedPreValueEditor = new PreValueEditor(); + + //the manifest JSON is a simplified json for the validators which is actually a dictionary, however, the + //c# model requires an array of validators not a dictionary so we need to change the json to an array + //to deserialize properly. + var fields = jObject["prevalues"]["fields"] as JArray; + if (fields != null) + { + foreach (var f in fields) + { + JArray converted; + if (TryConvertValidatorDictionaryToArray(f["validation"] as JObject, out converted)) + { + f["validation"] = converted; + } + } + } } base.Deserialize(jObject, target, serializer); } + + private bool TryConvertValidatorDictionaryToArray(JObject validation, out JArray result) + { + if (validation == null) + { + result = null; + return false; + } + + result = new JArray(); + foreach (var entry in validation) + { + //in a special case if the value is simply 'true' (boolean) this just indicates that the + // validator is enabled, the config should just be empty. + var formattedItem = JObject.FromObject(new { type = entry.Key, config = entry.Value }); + if (entry.Value.Type == JTokenType.Boolean) + { + formattedItem["config"] = ""; + } + + result.Add(formattedItem); + } + return true; + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs b/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs index 7b2adf0e26..6df0f91275 100644 --- a/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs +++ b/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs @@ -63,7 +63,7 @@ namespace Umbraco.Core.PropertyEditors get { return CreateValueEditor(); } } - [JsonProperty("preValueEditor")] + [JsonProperty("prevalues")] public PreValueEditor PreValueEditor { get { return CreatePreValueEditor(); } diff --git a/src/Umbraco.Core/PropertyEditors/ValidatorsResolver.cs b/src/Umbraco.Core/PropertyEditors/ValidatorsResolver.cs index 4b1f0b7c28..6fcbe112f7 100644 --- a/src/Umbraco.Core/PropertyEditors/ValidatorsResolver.cs +++ b/src/Umbraco.Core/PropertyEditors/ValidatorsResolver.cs @@ -30,7 +30,7 @@ namespace Umbraco.Core.PropertyEditors /// public ManifestValueValidator GetValidator(string name) { - return Values.FirstOrDefault(x => x.TypeName == name); + return Values.FirstOrDefault(x => x.TypeName.InvariantEquals(name)); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Serialization/JsonCreationConverter.cs b/src/Umbraco.Core/Serialization/JsonCreationConverter.cs index 5716d11dd9..1dd79fbb96 100644 --- a/src/Umbraco.Core/Serialization/JsonCreationConverter.cs +++ b/src/Umbraco.Core/Serialization/JsonCreationConverter.cs @@ -4,6 +4,7 @@ using Newtonsoft.Json.Linq; namespace Umbraco.Core.Serialization { + internal abstract class JsonCreationConverter : JsonConverter { /// diff --git a/src/Umbraco.Tests/Manifest/ManifestParserTests.cs b/src/Umbraco.Tests/Manifest/ManifestParserTests.cs index 1e631bb09a..5cc1c2fae0 100644 --- a/src/Umbraco.Tests/Manifest/ManifestParserTests.cs +++ b/src/Umbraco.Tests/Manifest/ManifestParserTests.cs @@ -1,14 +1,13 @@ using System; using System.IO; using System.Linq; -using System.Text; -using System.Threading.Tasks; using NUnit.Framework; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Umbraco.Core.Manifest; +using Umbraco.Core.PropertyEditors; -namespace Umbraco.Belle.Tests +namespace Umbraco.Tests.Manifest { [TestFixture] public class ManifestParserTests @@ -25,27 +24,20 @@ namespace Umbraco.Belle.Tests editor: { view: '~/App_Plugins/MyPackage/PropertyEditors/MyEditor.html', valueType: 'int', - validation: [ - { - type: 'Required' - }, - { - type: 'Regex', - value: '\\d*' - }, - ] + validation: { + 'required': true, + 'Regex': '\\d*' + } }, - preValueEditor: { + prevalues: { fields: [ { label: 'Some config 1', key: 'key1', view: '~/App_Plugins/MyPackage/PropertyEditors/Views/pre-val1.html', - validation: [ - { - type: 'Required' - } - ] + validation: { + required: true + } }, { label: 'Some config 2', @@ -64,7 +56,7 @@ namespace Umbraco.Belle.Tests Assert.AreEqual("Some config 1", parser.ElementAt(0).PreValueEditor.Fields.ElementAt(0).Name); Assert.AreEqual("/App_Plugins/MyPackage/PropertyEditors/Views/pre-val1.html", parser.ElementAt(0).PreValueEditor.Fields.ElementAt(0).View); Assert.AreEqual(1, parser.ElementAt(0).PreValueEditor.Fields.ElementAt(0).Validators.Count()); - + Assert.AreEqual("key2", parser.ElementAt(0).PreValueEditor.Fields.ElementAt(1).Key); Assert.AreEqual("Some config 2", parser.ElementAt(0).PreValueEditor.Fields.ElementAt(1).Name); Assert.AreEqual("/App_Plugins/MyPackage/PropertyEditors/Views/pre-val2.html", parser.ElementAt(0).PreValueEditor.Fields.ElementAt(1).View); @@ -82,15 +74,10 @@ namespace Umbraco.Belle.Tests editor: { view: '~/App_Plugins/MyPackage/PropertyEditors/MyEditor.html', valueType: 'int', - validation: [ - { - type: 'Required' - }, - { - type: 'Regex', - value: '\\d*' - }, - ] + validation: { + required : true, + regex : '\\d*' + } } }, { @@ -110,6 +97,12 @@ namespace Umbraco.Belle.Tests Assert.AreEqual("/App_Plugins/MyPackage/PropertyEditors/MyEditor.html", parser.ElementAt(0).ValueEditor.View); Assert.AreEqual("int", parser.ElementAt(0).ValueEditor.ValueType); Assert.AreEqual(2, parser.ElementAt(0).ValueEditor.Validators.Count()); + var manifestValidator1 = parser.ElementAt(0).ValueEditor.Validators.ElementAt(0) as ManifestPropertyValidator; + Assert.IsNotNull(manifestValidator1); + Assert.AreEqual("required", manifestValidator1.Type); + var manifestValidator2 = parser.ElementAt(0).ValueEditor.Validators.ElementAt(1) as ManifestPropertyValidator; + Assert.IsNotNull(manifestValidator2); + Assert.AreEqual("regex", manifestValidator2.Type); Assert.AreEqual(new Guid("1FCF5C39-5FC7-4BCE-AFBE-6500D9EBA261"), parser.ElementAt(1).Id); Assert.AreEqual("Test 2", parser.ElementAt(1).Name); diff --git a/src/Umbraco.Web.UI.Client/docs/src/tutorials/Adding-Configuration-To-Property-Editor.ngdoc b/src/Umbraco.Web.UI.Client/docs/src/tutorials/Adding-Configuration-To-Property-Editor.ngdoc index 79663f1a6b..75fd88857b 100644 --- a/src/Umbraco.Web.UI.Client/docs/src/tutorials/Adding-Configuration-To-Property-Editor.ngdoc +++ b/src/Umbraco.Web.UI.Client/docs/src/tutorials/Adding-Configuration-To-Property-Editor.ngdoc @@ -15,7 +15,7 @@ So an editor can be used several times, with different configurations, and that ##package.manifest So to add configuration options to our markdown editor, open the package.manifest file. rigth below the editor definition, paste in the following: - preValueEditor: { + prevalues: { fields: [ { label: "Preview", diff --git a/src/Umbraco.Web.UI.Client/src/packages/MarkdownEditor/package.manifest b/src/Umbraco.Web.UI.Client/src/packages/MarkdownEditor/package.manifest index dc3c7bb77b..fa7be19e47 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/MarkdownEditor/package.manifest +++ b/src/Umbraco.Web.UI.Client/src/packages/MarkdownEditor/package.manifest @@ -6,7 +6,7 @@ editor: { view: "~/App_Plugins/MarkDownEditor/markdowneditor.html" }, - preValueEditor: { + prevalues: { fields: [ { label: "Preview", diff --git a/src/Umbraco.Web.UI.Client/src/packages/propertyeditors/package.manifest b/src/Umbraco.Web.UI.Client/src/packages/propertyeditors/package.manifest index 46831aaae2..5ac299c246 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/propertyeditors/package.manifest +++ b/src/Umbraco.Web.UI.Client/src/packages/propertyeditors/package.manifest @@ -7,7 +7,7 @@ view: "~/App_Plugins/propertyeditors/mntp/mntp.html" }, - preValueEditor: { + prevalues: { fields: [ { label: "Multipicker", diff --git a/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest b/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest index 5b68389b52..d612d3f0e3 100644 --- a/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest +++ b/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest @@ -8,17 +8,12 @@ }, editor: { view: "~/App_Plugins/MyPackage/PropertyEditors/Views/RegexEditor.html", - validation: [ - { - type: "Required" - }, - { - type: "Regex", - config: "^\\d*$" - } - ] + validation: { + required : true, + regex : "^\\d*$" + } }, - preValueEditor: { + prevalues: { fields: [ { label: "Regular expression", @@ -39,31 +34,19 @@ name: "CSV Editor", editor: { view: "~/App_Plugins/MyPackage/PropertyEditors/Views/CsvEditor.html", - validation: [ - { - type: "Delimited", - config: { - delimiter: ",", - pattern: "^[a-zA-Z]*$" - } - }, - ] + validation: { + delimited : { + delimiter: ",", + pattern: "^[a-zA-Z]*$" + } + } } - }, - { - id: "48B0DA8C-3492-4693-96DB-5C5099C680F3", - name: "Custom editor", - editor: { - view: "~/App_Plugins/MyPackage/PropertyEditors/Views/CustomJson.html" - } - } + } ], javascript: [ '~/App_Plugins/MyPackage/Common/Js/MyPackage.js', '~/App_Plugins/MyPackage/PropertyEditors/Js/CsvEditor.js', '~/App_Plugins/MyPackage/PropertyEditors/Js/PostcodeEditor.js', '~/App_Plugins/MyPackage/PropertyEditors/Js/RegexEditor.js' - /* - '~/App_Plugins/MyPackage/PropertyEditors/Js/CustomJsonEditor.js'*/ ] } \ No newline at end of file