diff --git a/src/Umbraco.Core/Manifest/PropertyEditorConverter.cs b/src/Umbraco.Core/Manifest/PropertyEditorConverter.cs index b0b90b3842..8d946d56a9 100644 --- a/src/Umbraco.Core/Manifest/PropertyEditorConverter.cs +++ b/src/Umbraco.Core/Manifest/PropertyEditorConverter.cs @@ -22,13 +22,17 @@ namespace Umbraco.Core.Manifest { if (jObject["editor"] != null) { - //we need to specify the view value for the editor here otherwise we'll get an exception - target.StaticallyDefinedValueEditor.View = jObject["editor"]["view"].ToString(); + //since it's a manifest editor, we need to create it's instance. + //we need to specify the view value for the editor here otherwise we'll get an exception. + target.ManifestDefinedValueEditor = new ValueEditor + { + View = jObject["editor"]["view"].ToString() + }; + } - if (jObject["preValueEditor"] != null) { - target.StaticallyDefinedPreValueEditor.Fields = new List(); + target.ManifestDefinedPreValueEditor = new PreValueEditor(); } base.Deserialize(jObject, target, serializer); diff --git a/src/Umbraco.Core/PropertyEditors/IntegerValidator.cs b/src/Umbraco.Core/PropertyEditors/IntegerValidator.cs new file mode 100644 index 0000000000..9573db27a5 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/IntegerValidator.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Core.PropertyEditors +{ + /// + /// A validator that validates that the value is a valid integer + /// + [ValueValidator("Integer")] + internal sealed class IntegerValidator : ManifestValueValidator, IPropertyValidator + { + public override IEnumerable Validate(object value, string config, string preValues, PropertyEditor editor) + { + var result = value.TryConvertTo(); + if (result.Success == false) + { + yield return new ValidationResult("The value " + value + " is not a valid integer", new[] {"value"}); + } + } + + public IEnumerable Validate(object value, string preValues, PropertyEditor editor) + { + return Validate(value, "", preValues, editor); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/PropertyEditors/PreValueEditor.cs b/src/Umbraco.Core/PropertyEditors/PreValueEditor.cs index da4eafa059..899b5d7bfd 100644 --- a/src/Umbraco.Core/PropertyEditors/PreValueEditor.cs +++ b/src/Umbraco.Core/PropertyEditors/PreValueEditor.cs @@ -85,7 +85,7 @@ namespace Umbraco.Core.PropertyEditors /// If fields are specified then the master View and Validators will be ignored /// [JsonProperty("fields")] - public IEnumerable Fields { get; set; } + public List Fields { get; private set; } /// /// A method to format the posted values from the editor to the values to be persisted @@ -135,7 +135,13 @@ namespace Umbraco.Core.PropertyEditors //we just need to merge the dictionaries now, the persisted will replace default. foreach (var item in persistedPreVals.PreValuesAsDictionary) { - defaultPreVals[item.Key] = item.Value; + //we want the json output to be in camelcase so change the value to a custom dictionary + + defaultPreVals[item.Key] = new Dictionary + { + {"id", item.Value.Id}, + {"value", item.Value.Value} + }; } return defaultPreVals; } diff --git a/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs b/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs index 81711c10ea..e01cc8c8b4 100644 --- a/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs +++ b/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs @@ -16,23 +16,20 @@ namespace Umbraco.Core.PropertyEditors /// public class PropertyEditor { + private readonly PropertyEditorAttribute _attribute; + /// /// The constructor will setup the property editor based on the attribute if one is found /// internal PropertyEditor() { - StaticallyDefinedValueEditor = new ValueEditor(); - StaticallyDefinedPreValueEditor = new PreValueEditor(); - //assign properties based on the attribute if it is found - var att = GetType().GetCustomAttribute(false); - if (att != null) + _attribute = GetType().GetCustomAttribute(false); + if (_attribute != null) { - Id = Guid.Parse(att.Id); - Name = att.Name; - - StaticallyDefinedValueEditor.ValueType = att.ValueType; - StaticallyDefinedValueEditor.View = att.EditorView; + //set the id/name from the attribute + Id = Guid.Parse(_attribute.Id); + Name = _attribute.Name; } } @@ -40,13 +37,13 @@ namespace Umbraco.Core.PropertyEditors /// These are assigned by default normally based on property editor attributes or manifest definitions, /// developers have the chance to override CreateValueEditor if they don't want to use the pre-defined instance /// - internal ValueEditor StaticallyDefinedValueEditor = null; + internal ValueEditor ManifestDefinedValueEditor = null; /// /// These are assigned by default normally based on property editor attributes or manifest definitions, /// developers have the chance to override CreatePreValueEditor if they don't want to use the pre-defined instance /// - internal PreValueEditor StaticallyDefinedPreValueEditor = null; + internal PreValueEditor ManifestDefinedPreValueEditor = null; /// /// The id of the property editor @@ -81,17 +78,28 @@ namespace Umbraco.Core.PropertyEditors /// protected virtual ValueEditor CreateValueEditor() { - if (StaticallyDefinedValueEditor != null && !StaticallyDefinedValueEditor.View.IsNullOrWhiteSpace()) + if (ManifestDefinedValueEditor != null) { //detect if the view is a virtual path (in most cases, yes) then convert it - if (StaticallyDefinedValueEditor.View.StartsWith("~/")) + if (ManifestDefinedValueEditor.View.StartsWith("~/")) { - StaticallyDefinedValueEditor.View = IOHelper.ResolveUrl(StaticallyDefinedValueEditor.View); + ManifestDefinedValueEditor.View = IOHelper.ResolveUrl(ManifestDefinedValueEditor.View); } - - return StaticallyDefinedValueEditor; + return ManifestDefinedValueEditor; } - throw new NotImplementedException("This method must be implemented if a view is not explicitly set"); + + //create a new editor + var editor = new ValueEditor(); + + if (_attribute.EditorView.IsNullOrWhiteSpace()) + { + throw new NotImplementedException("This method must be implemented if a view is not explicitly set"); + } + + editor.View = _attribute.EditorView; + editor.ValueType = _attribute.ValueType; + return editor; + } /// @@ -99,19 +107,23 @@ namespace Umbraco.Core.PropertyEditors /// /// protected virtual PreValueEditor CreatePreValueEditor() - { - if (StaticallyDefinedPreValueEditor != null) + { + //This will not be null if it is a manifest defined editor + if (ManifestDefinedPreValueEditor != null) { - foreach (var f in StaticallyDefinedPreValueEditor.Fields) + foreach (var f in ManifestDefinedPreValueEditor.Fields) { //detect if the view is a virtual path (in most cases, yes) then convert it if (f.View.StartsWith("~/")) { f.View = IOHelper.ResolveUrl(f.View); } - } + } + return ManifestDefinedPreValueEditor; } - return StaticallyDefinedPreValueEditor; + + //There's no manifest, just return an empty one + return new PreValueEditor(); } protected bool Equals(PropertyEditor other) diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 1d5fa08454..34c67a2d02 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -582,6 +582,7 @@ + diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js index 9041135a8e..042b2145c1 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js @@ -139,6 +139,7 @@ function umbDataFormatter() { /** formats the display model used to display the data type to the model used to save the data type */ formatDataTypePostData: function(displayModel, preValues, action) { var saveModel = { + parentId: -1, id: displayModel.id, name: displayModel.name, selectedEditor: displayModel.selectedEditor, @@ -149,7 +150,7 @@ function umbDataFormatter() { for (var i = 0; i < preValues.length; i++) { saveModel.preValues.push({ key: preValues[i].alias, - value: preValues[i].value + value: preValues[i].value.value }); } return saveModel; diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/boolean.html b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/boolean.html index 8af17a18ea..128a5a9504 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/boolean.html +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/boolean.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/hidden.html b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/hidden.html index 758ba68fd7..e04621b3ed 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/hidden.html +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/hidden.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/requiredfield.html b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/requiredfield.html index 2d1f3dde42..80bcb9c0f9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/requiredfield.html +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/requiredfield.html @@ -1,6 +1,6 @@ 
diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/textarea.html b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/textarea.html index 2321f3dd8d..98efd572fc 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/textarea.html +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/textarea.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/Umbraco.Web/PropertyEditors/ColorPickerPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/ColorPickerPropertyEditor.cs index c40bf09d95..566a79ac07 100644 --- a/src/Umbraco.Web/PropertyEditors/ColorPickerPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/ColorPickerPropertyEditor.cs @@ -8,6 +8,30 @@ using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.PropertyEditors { + [PropertyEditor(Constants.PropertyEditors.MultipleTextstring, "Multiple Textbox", "multipletextbox")] + public class MultipleTextStringPropertyEditor : PropertyEditor + { + protected override PreValueEditor CreatePreValueEditor() + { + var prevals = base.CreatePreValueEditor(); + prevals.Fields.Add(new PreValueField(new IntegerValidator()) + { + Description = "Enter the minimum amount of text boxes to be displayed", + Key = "min", + View = "requiredfield", + Name = "Minimum" + }); + prevals.Fields.Add(new PreValueField(new IntegerValidator()) + { + Description = "Enter the maximum amount of text boxes to be displayed, enter -1 for unlimited", + Key = "max", + View = "requiredfield", + Name = "Maximum" + }); + return prevals; + } + } + [PropertyEditor(Constants.PropertyEditors.ColorPicker, "Color Picker", "colorpicker")] public class ColorPickerPropertyEditor : PropertyEditor { @@ -29,7 +53,7 @@ namespace Umbraco.Web.PropertyEditors { public ColorListPreValueEditor() { - Fields = CreatePreValueFields(); + Fields.AddRange(CreatePreValueFields()); //use a custom editor too Fields.First().View = "views/propertyeditors/colorpicker/colorpicker.prevalues.html"; //change the description diff --git a/src/Umbraco.Web/PropertyEditors/DropDownMultipleWithKeysPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/DropDownMultipleWithKeysPropertyEditor.cs index e4af43f623..781880557f 100644 --- a/src/Umbraco.Web/PropertyEditors/DropDownMultipleWithKeysPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/DropDownMultipleWithKeysPropertyEditor.cs @@ -36,15 +36,14 @@ namespace Umbraco.Web.PropertyEditors { public DropDownMultiplePreValueEditor() { - var fields = CreatePreValueFields(); + Fields.AddRange(CreatePreValueFields()); //add the multiple field, we'll make it hidden so it is not seen in the pre-value editor - fields.Add(new PreValueField + Fields.Add(new PreValueField { Key = "multiple", Name = "multiple", View = "hidden" - }); - Fields = fields; + }); } /// diff --git a/src/Umbraco.Web/PropertyEditors/IntegerPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/IntegerPropertyEditor.cs index a9705ee5f5..c6d4912bf9 100644 --- a/src/Umbraco.Web/PropertyEditors/IntegerPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/IntegerPropertyEditor.cs @@ -13,7 +13,7 @@ namespace Umbraco.Web.PropertyEditors protected override ValueEditor CreateValueEditor() { var editor = base.CreateValueEditor(); - editor.Validators.Add(new RegexValidator("^\\d*$")); + editor.Validators.Add(new IntegerValidator()); return editor; } diff --git a/src/Umbraco.Web/PropertyEditors/ValueListPreValueEditor.cs b/src/Umbraco.Web/PropertyEditors/ValueListPreValueEditor.cs index 06f2146cc9..3aca2850ba 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueListPreValueEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/ValueListPreValueEditor.cs @@ -24,7 +24,7 @@ namespace Umbraco.Web.PropertyEditors public ValueListPreValueEditor() { - Fields = CreatePreValueFields(); + Fields.AddRange(CreatePreValueFields()); } ///