Implemented decimal property editor
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -21,6 +21,8 @@ namespace Umbraco.Core.Models
|
||||
[EnumMember]
|
||||
Integer,
|
||||
[EnumMember]
|
||||
Date
|
||||
Date,
|
||||
[EnumMember]
|
||||
Decimal
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
30
src/Umbraco.Core/PropertyEditors/DecimalValidator.cs
Normal file
30
src/Umbraco.Core/PropertyEditors/DecimalValidator.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
57
src/Umbraco.Web/PropertyEditors/DecimalPropertyEditor.cs
Normal file
57
src/Umbraco.Web/PropertyEditors/DecimalPropertyEditor.cs
Normal 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"
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user