Implemented decimal property editor

This commit is contained in:
AndyButland
2015-09-26 22:41:56 +02:00
committed by Claus
parent 30d8e53541
commit dda247fea5
16 changed files with 190 additions and 8 deletions

View File

@@ -158,6 +158,11 @@ namespace Umbraco.Core
/// </summary>
public const string IntegerAlias = "Umbraco.Integer";
/// <summary>
/// Alias for the Decimal datatype.
/// </summary>
public const string DecimalAlias = "Umbraco.Decimal";
/// <summary>
/// Alias for the listview datatype.
/// </summary>

View File

@@ -431,6 +431,7 @@ namespace Umbraco.Core
new Lazy<Type>(() => typeof (DelimitedManifestValueValidator)),
new Lazy<Type>(() => typeof (EmailValidator)),
new Lazy<Type>(() => typeof (IntegerValidator)),
new Lazy<Type>(() => typeof (DecimalValidator)),
});
//by default we'll use the db server registrar unless the developer has the legacy

View File

@@ -21,6 +21,8 @@ namespace Umbraco.Core.Models
[EnumMember]
Integer,
[EnumMember]
Date
Date,
[EnumMember]
Decimal
}
}

View File

@@ -402,6 +402,9 @@ namespace Umbraco.Core.Models
if (DataTypeDatabaseType == DataTypeDatabaseType.Integer && type == typeof(int))
return true;
if (DataTypeDatabaseType == DataTypeDatabaseType.Decimal && type == typeof(decimal))
return true;
if (DataTypeDatabaseType == DataTypeDatabaseType.Date && type == typeof(DateTime))
return true;

View File

@@ -33,6 +33,10 @@ namespace Umbraco.Core.Models.Rdbms
[NullSetting(NullSetting = NullSettings.Null)]
public int? Integer { get; set; }
[Column("dataDecimal")]
[NullSetting(NullSetting = NullSettings.Null)]
public decimal? Decimal { get; set; }
[Column("dataDate")]
[NullSetting(NullSetting = NullSettings.Null)]
public DateTime? Date { get; set; }
@@ -55,22 +59,27 @@ namespace Umbraco.Core.Models.Rdbms
{
get
{
if(Integer.HasValue)
if (Integer.HasValue)
{
return Integer.Value;
}
if (Decimal.HasValue)
{
return Decimal.Value;
}
if(Date.HasValue)
if (Date.HasValue)
{
return Date.Value;
}
if(string.IsNullOrEmpty(VarChar) == false)
if (string.IsNullOrEmpty(VarChar) == false)
{
return VarChar;
}
if(string.IsNullOrEmpty(Text) == false)
if (string.IsNullOrEmpty(Text) == false)
{
return Text;
}

View File

@@ -63,7 +63,9 @@ namespace Umbraco.Core.Persistence.Factories
//Check if property has an Id and set it, so that it can be updated if it already exists
if (property.HasIdentity)
{
dto.Id = property.Id;
}
if (property.DataTypeDatabaseType == DataTypeDatabaseType.Integer)
{
@@ -82,11 +84,21 @@ namespace Umbraco.Core.Persistence.Factories
}
}
}
else if (property.DataTypeDatabaseType == DataTypeDatabaseType.Decimal && property.Value != null)
{
decimal val;
if (decimal.TryParse(property.Value.ToString(), out val))
{
dto.Decimal = val;
}
}
else if (property.DataTypeDatabaseType == DataTypeDatabaseType.Date && property.Value != null && string.IsNullOrWhiteSpace(property.Value.ToString()) == false)
{
DateTime date;
if(DateTime.TryParse(property.Value.ToString(), out date))
if (DateTime.TryParse(property.Value.ToString(), out date))
{
dto.Date = date;
}
}
else if (property.DataTypeDatabaseType == DataTypeDatabaseType.Ntext && property.Value != null)
{

View File

@@ -0,0 +1,30 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Umbraco.Core.Models;
namespace Umbraco.Core.PropertyEditors
{
/// <summary>
/// A validator that validates that the value is a valid decimal
/// </summary>
[ValueValidator("Decimal")]
internal sealed class DecimalValidator : ManifestValueValidator, IPropertyValidator
{
public override IEnumerable<ValidationResult> Validate(object value, string config, PreValueCollection preValues, PropertyEditor editor)
{
if (value != null && value.ToString() != string.Empty)
{
var result = value.TryConvertTo<decimal>();
if (result.Success == false)
{
yield return new ValidationResult("The value " + value + " is not a valid decimal", new[] { "value" });
}
}
}
public IEnumerable<ValidationResult> Validate(object value, PreValueCollection preValues, PropertyEditor editor)
{
return Validate(value, "", preValues, editor);
}
}
}

View File

@@ -133,6 +133,8 @@ namespace Umbraco.Core.PropertyEditors
case "INT":
case "INTEGER":
return DataTypeDatabaseType.Integer;
case "DECIMAL":
return DataTypeDatabaseType.Decimal;
case "STRING":
return DataTypeDatabaseType.Nvarchar;
case "TEXT":
@@ -202,6 +204,11 @@ namespace Umbraco.Core.PropertyEditors
? Attempt<object>.Succeed((int)(long)result.Result)
: result;
case DataTypeDatabaseType.Decimal:
//ensure these are nullable so we can return a null if required
valueType = typeof(decimal?);
break;
case DataTypeDatabaseType.Date:
//ensure these are nullable so we can return a null if required
valueType = typeof(DateTime?);
@@ -283,6 +290,7 @@ namespace Umbraco.Core.PropertyEditors
}
return property.Value.ToString();
case DataTypeDatabaseType.Integer:
case DataTypeDatabaseType.Decimal:
//we can just ToString() any of these types
return property.Value.ToString();
case DataTypeDatabaseType.Date:
@@ -325,6 +333,7 @@ namespace Umbraco.Core.PropertyEditors
{
case DataTypeDatabaseType.Date:
case DataTypeDatabaseType.Integer:
case DataTypeDatabaseType.Decimal:
return new XText(ConvertDbToString(property, propertyType, dataTypeService));
case DataTypeDatabaseType.Nvarchar:
case DataTypeDatabaseType.Ntext:
@@ -354,6 +363,7 @@ namespace Umbraco.Core.PropertyEditors
property.Value.ToXmlString<string>();
return property.Value.ToXmlString<string>();
case DataTypeDatabaseType.Integer:
case DataTypeDatabaseType.Decimal:
return property.Value.ToXmlString(property.Value.GetType());
case DataTypeDatabaseType.Date:
//treat dates differently, output the format as xml format

View File

@@ -0,0 +1,31 @@
using Umbraco.Core.Models.PublishedContent;
namespace Umbraco.Core.PropertyEditors.ValueConverters
{
[PropertyValueType(typeof(decimal))]
[PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.Content)]
public class DecimalValueConverter : PropertyValueConverterBase
{
public override bool IsConverter(PublishedPropertyType propertyType)
{
return Constants.PropertyEditors.DecimalAlias.Equals(propertyType.PropertyEditorAlias);
}
public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview)
{
if (source == null) return 0M;
// in XML a decimal is a string
var sourceString = source as string;
if (sourceString != null)
{
decimal d;
return (decimal.TryParse(sourceString, out d)) ? d : 0M;
}
// in the database an a decimal is an a decimal
// default value is zero
return (source is decimal) ? source : 0M;
}
}
}

View File

@@ -456,7 +456,9 @@
<Compile Include="Persistence\Repositories\RepositoryCacheOptions.cs" />
<Compile Include="Persistence\Repositories\TaskRepository.cs" />
<Compile Include="Persistence\Repositories\TaskTypeRepository.cs" />
<Compile Include="PropertyEditors\DecimalValidator.cs" />
<Compile Include="PropertyEditors\ValueConverters\GridValueConverter.cs" />
<Compile Include="PropertyEditors\ValueConverters\DecimalValueConverter.cs" />
<Compile Include="Publishing\UnPublishedStatusType.cs" />
<Compile Include="Publishing\UnPublishStatus.cs" />
<Compile Include="Security\BackOfficeClaimsIdentityFactory.cs" />

View File

@@ -0,0 +1,11 @@
<div>
<input name="decimalField" class="umb-editor umb-number"
type="number"
ng-model="model.value"
val-server="value"
fix-number />
<span class="help-inline" val-msg-for="decimalField" val-toggle-msg="number">Not a number</span>
<span class="help-inline" val-msg-for="decimalField" val-toggle-msg="valServer">{{propertyForm.requiredField.errorMsg}}</span>
</div>

View File

@@ -3,7 +3,7 @@
type="number"
ng-model="model.value"
val-server="value"
fix-number />
fix-number />
<span class="help-inline" val-msg-for="numberField" val-toggle-msg="number">Not a number</span>
<span class="help-inline" val-msg-for="numberField" val-toggle-msg="valServer">{{propertyForm.requiredField.errorMsg}}</span>

View File

@@ -0,0 +1,9 @@
<div class="umb-editor">
<input name="decimalField" type="number" class="umb-editor umb-number"
ng-model="model.value"
val-server="value"
fix-number min="{{model.config.min}}" max="{{model.config.max}}" step="{{model.config.step}}" />
<span class="help-inline" val-msg-for="decimalField" val-toggle-msg="number">Not a number</span>
<span class="help-inline" val-msg-for="decimalField" val-toggle-msg="valServer">{{propertyForm.requiredField.errorMsg}}</span>
</div>

View File

@@ -6,5 +6,4 @@
<span class="help-inline" val-msg-for="integerField" val-toggle-msg="number">Not a number</span>
<span class="help-inline" val-msg-for="integerField" val-toggle-msg="valServer">{{propertyForm.requiredField.errorMsg}}</span>
</div>

View File

@@ -0,0 +1,57 @@
using Umbraco.Core;
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Web.PropertyEditors
{
[PropertyEditor(Constants.PropertyEditors.DecimalAlias, "Decimal", "decimal", "decimal", IsParameterEditor = true)]
public class DecimalPropertyEditor : PropertyEditor
{
/// <summary>
/// Overridden to ensure that the value is validated
/// </summary>
/// <returns></returns>
protected override PropertyValueEditor CreateValueEditor()
{
var editor = base.CreateValueEditor();
editor.Validators.Add(new DecimalValidator());
return editor;
}
protected override PreValueEditor CreatePreValueEditor()
{
return new DecimalPreValueEditor();
}
/// <summary>
/// A custom pre-value editor class to deal with the legacy way that the pre-value data is stored.
/// </summary>
internal class DecimalPreValueEditor : PreValueEditor
{
public DecimalPreValueEditor()
{
//create the fields
Fields.Add(new PreValueField(new DecimalValidator())
{
Description = "Enter the minimum amount of number to be entered",
Key = "min",
View = "decimal",
Name = "Minimum"
});
Fields.Add(new PreValueField(new DecimalValidator())
{
Description = "Enter the intervals amount between each step of number to be entered",
Key = "step",
View = "decimal",
Name = "Step Size"
});
Fields.Add(new PreValueField(new DecimalValidator())
{
Description = "Enter the maximum amount of number to be entered",
Key = "max",
View = "decimal",
Name = "Maximum"
});
}
}
}
}

View File

@@ -307,6 +307,7 @@
<Compile Include="Models\ContentEditing\SimpleNotificationModel.cs" />
<Compile Include="Models\PublishedContentWithKeyBase.cs" />
<Compile Include="PropertyEditors\DatePreValueEditor.cs" />
<Compile Include="PropertyEditors\DecimalPropertyEditor.cs" />
<Compile Include="RequestLifespanMessagesFactory.cs" />
<Compile Include="Scheduling\LatchedBackgroundTaskBase.cs" />
<Compile Include="Security\Identity\ExternalSignInAutoLinkOptions.cs" />