From 138f9a204e40193d1e417c1a1a00a9494c934798 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 21 Sep 2012 16:46:18 -0700 Subject: [PATCH] #18866: Applying current culture when editing and displaying NumericField The editor has been substituted to type="text" as chrome forces the user to use '.' as a decimal separator, and other cultures as french could use ',' for instance. Work Item: 18866 --HG-- branch : 1.x --- .../Drivers/NumericFieldDriver.cs | 39 ++++++++++++++++--- .../Orchard.Fields/Orchard.Fields.csproj | 5 +++ .../ViewModels/NumericFieldViewModel.cs | 10 +++++ .../Fields/Numeric.Edit.cshtml | 12 +++--- .../Views/Fields/Numeric.cshtml | 2 +- 5 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Fields/ViewModels/NumericFieldViewModel.cs diff --git a/src/Orchard.Web/Modules/Orchard.Fields/Drivers/NumericFieldDriver.cs b/src/Orchard.Web/Modules/Orchard.Fields/Drivers/NumericFieldDriver.cs index 4a3cf0615..be6adbd9b 100644 --- a/src/Orchard.Web/Modules/Orchard.Fields/Drivers/NumericFieldDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Fields/Drivers/NumericFieldDriver.cs @@ -6,15 +6,19 @@ using Orchard.ContentManagement.Handlers; using Orchard.Fields.Fields; using Orchard.Fields.Settings; using Orchard.Localization; +using Orchard.Fields.ViewModels; namespace Orchard.Fields.Drivers { public class NumericFieldDriver : ContentFieldDriver { public IOrchardServices Services { get; set; } private const string TemplateName = "Fields/Numeric.Edit"; + private readonly Lazy _cultureInfo; public NumericFieldDriver(IOrchardServices services) { Services = services; T = NullLocalizer.Instance; + + _cultureInfo = new Lazy(() => CultureInfo.GetCultureInfo(Services.WorkContext.CurrentCulture)); } public Localizer T { get; set; } @@ -29,24 +33,49 @@ namespace Orchard.Fields.Drivers { protected override DriverResult Display(ContentPart part, NumericField field, string displayType, dynamic shapeHelper) { return ContentShape("Fields_Numeric", GetDifferentiator(field, part), () => { - var settings = field.PartFieldDefinition.Settings.GetModel(); - return shapeHelper.Fields_Numeric().Settings(settings); + return shapeHelper.Fields_Numeric() + .Settings(field.PartFieldDefinition.Settings.GetModel()) + .Value(Convert.ToString(field.Value, _cultureInfo.Value)); }); } protected override DriverResult Editor(ContentPart part, NumericField field, dynamic shapeHelper) { + return ContentShape("Fields_Numeric_Edit", GetDifferentiator(field, part), - () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: field, Prefix: GetPrefix(field, part))); + () => { + var model = new NumericFieldViewModel { + Field = field, + Settings = field.PartFieldDefinition.Settings.GetModel(), + Value = Convert.ToString(field.Value, _cultureInfo.Value) + }; + + return shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: GetPrefix(field, part)); + }); } protected override DriverResult Editor(ContentPart part, NumericField field, IUpdateModel updater, dynamic shapeHelper) { - if (updater.TryUpdateModel(field, GetPrefix(field, part), null, null)) { + var viewModel = new NumericFieldViewModel(); + + if (updater.TryUpdateModel(viewModel, GetPrefix(field, part), null, null)) { + Decimal value; + var settings = field.PartFieldDefinition.Settings.GetModel(); - if (settings.Required && !field.Value.HasValue) { + if (settings.Required && String.IsNullOrWhiteSpace(viewModel.Value)) { updater.AddModelError(GetPrefix(field, part), T("The field {0} is mandatory.", T(field.DisplayName))); } + if (!settings.Required && String.IsNullOrWhiteSpace(viewModel.Value)) { + field.Value = null; + } + else if (Decimal.TryParse(viewModel.Value, NumberStyles.Any, _cultureInfo.Value, out value)) { + field.Value = value; + } + else { + updater.AddModelError(GetPrefix(field, part), T("{0} is an invalid number", field.DisplayName)); + field.Value = null; + } + if (settings.Minimum.HasValue && field.Value.HasValue && field.Value.Value < settings.Minimum.Value) { updater.AddModelError(GetPrefix(field, part), T("The value must be greater than {0}", settings.Minimum.Value)); } diff --git a/src/Orchard.Web/Modules/Orchard.Fields/Orchard.Fields.csproj b/src/Orchard.Web/Modules/Orchard.Fields/Orchard.Fields.csproj index 2195e2170..f6802e775 100644 --- a/src/Orchard.Web/Modules/Orchard.Fields/Orchard.Fields.csproj +++ b/src/Orchard.Web/Modules/Orchard.Fields/Orchard.Fields.csproj @@ -21,6 +21,10 @@ false + + + + true @@ -138,6 +142,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Fields/ViewModels/NumericFieldViewModel.cs b/src/Orchard.Web/Modules/Orchard.Fields/ViewModels/NumericFieldViewModel.cs new file mode 100644 index 000000000..562765ae9 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Fields/ViewModels/NumericFieldViewModel.cs @@ -0,0 +1,10 @@ +using Orchard.Fields.Fields; +using Orchard.Fields.Settings; +namespace Orchard.Fields.ViewModels { + + public class NumericFieldViewModel { + public NumericField Field { get; set; } + public NumericFieldSettings Settings { get; set; } + public string Value { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Fields/Views/EditorTemplates/Fields/Numeric.Edit.cshtml b/src/Orchard.Web/Modules/Orchard.Fields/Views/EditorTemplates/Fields/Numeric.Edit.cshtml index 8ec89698e..d4e4247e8 100644 --- a/src/Orchard.Web/Modules/Orchard.Fields/Views/EditorTemplates/Fields/Numeric.Edit.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Fields/Views/EditorTemplates/Fields/Numeric.Edit.cshtml @@ -1,12 +1,10 @@ -@model Orchard.Fields.Fields.NumericField +@model Orchard.Fields.ViewModels.NumericFieldViewModel @using System.Globalization @using Orchard.Fields.Settings; -@{ - var settings = Model.PartFieldDefinition.Settings.GetModel(); -} +
- - @Html.TextBoxFor(m => m.Value, new { @class = "text-small", type = "number", min = (settings.Minimum.HasValue) ? settings.Minimum.Value : 0, max = (settings.Maximum.HasValue) ? settings.Maximum.Value : 1000000, step = Math.Pow(10, 0 - settings.Scale).ToString(CultureInfo.InvariantCulture) }) + + @Html.TextBoxFor(m => m.Value, new { @class = "text-small", type = "text", min = (Model.Settings.Minimum.HasValue) ? Model.Settings.Minimum.Value : 0, max = (Model.Settings.Maximum.HasValue) ? Model.Settings.Maximum.Value : 1000000, step = Math.Pow(10, 0 - Model.Settings.Scale).ToString(CultureInfo.InvariantCulture) }) @Html.ValidationMessageFor(m => m.Value) - @settings.Hint + @Model.Settings.Hint
diff --git a/src/Orchard.Web/Modules/Orchard.Fields/Views/Fields/Numeric.cshtml b/src/Orchard.Web/Modules/Orchard.Fields/Views/Fields/Numeric.cshtml index 6958fbf3d..8a6eb26ec 100644 --- a/src/Orchard.Web/Modules/Orchard.Fields/Views/Fields/Numeric.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Fields/Views/Fields/Numeric.cshtml @@ -7,6 +7,6 @@ @if (number.HasValue) {

@name: - @(number.Value) + @(Model.Value)

}