From 6f53afffa4deb5e4c8197a88d54180c88026fc88 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 17 Jan 2012 17:07:17 -0800 Subject: [PATCH] Enhancing the Text field --HG-- branch : 1.x --- .../Core/Common/Drivers/TextFieldDriver.cs | 51 +++++++++++++-- src/Orchard.Web/Core/Common/Placement.info | 3 +- .../Core/Common/Settings/TextFieldSettings.cs | 8 +++ .../Settings/TextFieldSettingsEvents.cs | 63 +++++++++++++++++++ .../ViewModels/TextFieldDriverViewModel.cs | 10 +++ .../TextFieldSettingsEventsViewModel.cs | 8 +++ .../Common/Views/Body-Textarea.Editor.cshtml | 1 + .../TextFieldSettingsEventsViewModel.cshtml | 28 +++++++++ .../Fields.Common.Text.Edit.cshtml | 18 ++++-- .../Common/Views/Fields.Common.Text.cshtml | 6 +- src/Orchard.Web/Core/Orchard.Core.csproj | 7 +++ 11 files changed, 189 insertions(+), 14 deletions(-) create mode 100644 src/Orchard.Web/Core/Common/Settings/TextFieldSettings.cs create mode 100644 src/Orchard.Web/Core/Common/Settings/TextFieldSettingsEvents.cs create mode 100644 src/Orchard.Web/Core/Common/ViewModels/TextFieldDriverViewModel.cs create mode 100644 src/Orchard.Web/Core/Common/ViewModels/TextFieldSettingsEventsViewModel.cs create mode 100644 src/Orchard.Web/Core/Common/Views/Body-Textarea.Editor.cshtml create mode 100644 src/Orchard.Web/Core/Common/Views/DefinitionTemplates/TextFieldSettingsEventsViewModel.cshtml diff --git a/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs index 6ab1261ef..08df36ff4 100644 --- a/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs +++ b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs @@ -1,14 +1,23 @@ -using JetBrains.Annotations; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using JetBrains.Annotations; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; using Orchard.ContentManagement.Handlers; using Orchard.Core.Common.Fields; +using Orchard.Core.Common.Settings; +using Orchard.Core.Common.ViewModels; using Orchard.Localization; +using Orchard.Services; namespace Orchard.Core.Common.Drivers { [UsedImplicitly] public class TextFieldDriver : ContentFieldDriver { - public TextFieldDriver(IOrchardServices services) { + private readonly IEnumerable _htmlFilters; + + public TextFieldDriver(IOrchardServices services, IEnumerable htmlFilters) { + _htmlFilters = htmlFilters; Services = services; T = NullLocalizer.Instance; } @@ -26,16 +35,48 @@ namespace Orchard.Core.Common.Drivers { protected override DriverResult Display(ContentPart part, TextField field, string displayType, dynamic shapeHelper) { return ContentShape("Fields_Common_Text", GetDifferentiator(field, part), - () => shapeHelper.Fields_Common_Text(Name: field.Name, Value: field.Value)); + () => { + var settings = field.PartFieldDefinition.Settings.GetModel(); + object fieldValue = field.Value; + + if (!string.IsNullOrWhiteSpace(settings.Flavor)) { + fieldValue = new HtmlString(_htmlFilters.Aggregate(field.Value, (text, filter) => filter.ProcessContent(text, settings.Flavor))); + } + + return shapeHelper.Fields_Common_Text(Name: field.Name, Value: fieldValue); + }); } protected override DriverResult Editor(ContentPart part, TextField field, dynamic shapeHelper) { return ContentShape("Fields_Common_Text_Edit", GetDifferentiator(field, part), - () => shapeHelper.EditorTemplate(TemplateName: "Fields.Common.Text.Edit", Model: field, Prefix: GetPrefix(field, part))); + () => { + var viewModel = new TextFieldDriverViewModel { + Field = field, + Text = field.Value, + Settings = field.PartFieldDefinition.Settings.GetModel() + }; + + return shapeHelper.EditorTemplate(TemplateName: "Fields.Common.Text.Edit", Model: viewModel, Prefix: GetPrefix(field, part)); + }); } protected override DriverResult Editor(ContentPart part, TextField field, IUpdateModel updater, dynamic shapeHelper) { - updater.TryUpdateModel(field, GetPrefix(field, part), null, null); + var viewModel = new TextFieldDriverViewModel { + Field = field, + Text = field.Value, + Settings = field.PartFieldDefinition.Settings.GetModel() + }; + + if(updater.TryUpdateModel(viewModel, GetPrefix(field, part), null, null)) { + if (viewModel.Settings.Required && string.IsNullOrWhiteSpace(viewModel.Text)) { + updater.AddModelError("Text", T("The fields {0} is mandatory", field.DisplayName)); + return ContentShape("Fields_Common_Text_Edit", GetDifferentiator(field, part), + () => shapeHelper.EditorTemplate(TemplateName: "Fields.Common.Text.Edit", Model: viewModel, Prefix: GetPrefix(field, part))); + } + + field.Value = viewModel.Text; + } + return Editor(part, field, shapeHelper); } diff --git a/src/Orchard.Web/Core/Common/Placement.info b/src/Orchard.Web/Core/Common/Placement.info index 7b4f825c3..f9a6bf259 100644 --- a/src/Orchard.Web/Core/Common/Placement.info +++ b/src/Orchard.Web/Core/Common/Placement.info @@ -31,6 +31,7 @@ + Parts_Common_Metadata_SummaryAdmin="Meta:5" + Fields_Common_Text="-"/> diff --git a/src/Orchard.Web/Core/Common/Settings/TextFieldSettings.cs b/src/Orchard.Web/Core/Common/Settings/TextFieldSettings.cs new file mode 100644 index 000000000..4674286c5 --- /dev/null +++ b/src/Orchard.Web/Core/Common/Settings/TextFieldSettings.cs @@ -0,0 +1,8 @@ +namespace Orchard.Core.Common.Settings { + + public class TextFieldSettings { + public string Flavor { get; set; } + public bool Required { get; set; } + public string Hint { get; set; } + } +} diff --git a/src/Orchard.Web/Core/Common/Settings/TextFieldSettingsEvents.cs b/src/Orchard.Web/Core/Common/Settings/TextFieldSettingsEvents.cs new file mode 100644 index 000000000..74b589634 --- /dev/null +++ b/src/Orchard.Web/Core/Common/Settings/TextFieldSettingsEvents.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using Orchard.ContentManagement; +using Orchard.ContentManagement.MetaData; +using Orchard.ContentManagement.MetaData.Builders; +using Orchard.ContentManagement.MetaData.Models; +using Orchard.ContentManagement.ViewModels; +using Orchard.Core.Common.ViewModels; +using Orchard.DisplayManagement.Descriptors; +using Orchard.Utility.Extensions; + +namespace Orchard.Core.Common.Settings { + public class TextFieldSettingsEvents : ContentDefinitionEditorEventsBase { + private readonly IOrchardServices _orchardServices; + private readonly Func _shapeTableLocator; + + public TextFieldSettingsEvents(IOrchardServices orchardServices, Func shapeTableLocator) { + _orchardServices = orchardServices; + _shapeTableLocator = shapeTableLocator; + } + + public override IEnumerable PartFieldEditor(ContentPartFieldDefinition definition) { + if (definition.FieldDefinition.Name == "TextField") { + var shapeTable = _shapeTableLocator().Lookup(_orchardServices.WorkContext.CurrentTheme.Id); + var flavors = shapeTable.Bindings.Keys + .Where(x => x.StartsWith("Body_Editor__", StringComparison.OrdinalIgnoreCase)) + .Select(x => x.Substring("Body_Editor__".Length)) + .Where(x => !String.IsNullOrWhiteSpace(x)) + .Select(x => x[0].ToString(CultureInfo.InvariantCulture).ToUpper() + x.Substring(1) ) + .Select(x => x.CamelFriendly()) + ; + + + var model = new TextFieldSettingsEventsViewModel { + Settings = definition.Settings.GetModel(), + Flavors = flavors.ToArray() + }; + + yield return DefinitionTemplate(model); + } + } + + public override IEnumerable PartFieldEditorUpdate(ContentPartFieldDefinitionBuilder builder, IUpdateModel updateModel) { + if (builder.FieldType != "TextField") { + yield break; + } + + var model = new TextFieldSettingsEventsViewModel { + Settings = new TextFieldSettings() + }; + + if (updateModel.TryUpdateModel(model, "TextFieldSettingsEventsViewModel", null, null)) { + builder.WithSetting("TextFieldSettings.Flavor", model.Settings.Flavor); + builder.WithSetting("TextFieldSettings.Hint", model.Settings.Hint); + builder.WithSetting("TextFieldSettings.Required", model.Settings.Required.ToString(CultureInfo.InvariantCulture)); + + yield return DefinitionTemplate(model); + } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/ViewModels/TextFieldDriverViewModel.cs b/src/Orchard.Web/Core/Common/ViewModels/TextFieldDriverViewModel.cs new file mode 100644 index 000000000..d5b730cd5 --- /dev/null +++ b/src/Orchard.Web/Core/Common/ViewModels/TextFieldDriverViewModel.cs @@ -0,0 +1,10 @@ +using Orchard.Core.Common.Fields; +using Orchard.Core.Common.Settings; + +namespace Orchard.Core.Common.ViewModels { + public class TextFieldDriverViewModel { + public TextField Field { get; set; } + public string Text { get; set; } + public TextFieldSettings Settings { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/ViewModels/TextFieldSettingsEventsViewModel.cs b/src/Orchard.Web/Core/Common/ViewModels/TextFieldSettingsEventsViewModel.cs new file mode 100644 index 000000000..ad65a81b4 --- /dev/null +++ b/src/Orchard.Web/Core/Common/ViewModels/TextFieldSettingsEventsViewModel.cs @@ -0,0 +1,8 @@ +using Orchard.Core.Common.Settings; + +namespace Orchard.Core.Common.ViewModels { + public class TextFieldSettingsEventsViewModel { + public TextFieldSettings Settings { get; set; } + public string[] Flavors { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Views/Body-Textarea.Editor.cshtml b/src/Orchard.Web/Core/Common/Views/Body-Textarea.Editor.cshtml new file mode 100644 index 000000000..1e6af76c4 --- /dev/null +++ b/src/Orchard.Web/Core/Common/Views/Body-Textarea.Editor.cshtml @@ -0,0 +1 @@ +@Html.TextArea("Text", (string)Model.Text, 10, 80, new {}) diff --git a/src/Orchard.Web/Core/Common/Views/DefinitionTemplates/TextFieldSettingsEventsViewModel.cshtml b/src/Orchard.Web/Core/Common/Views/DefinitionTemplates/TextFieldSettingsEventsViewModel.cshtml new file mode 100644 index 000000000..142d13aaa --- /dev/null +++ b/src/Orchard.Web/Core/Common/Views/DefinitionTemplates/TextFieldSettingsEventsViewModel.cshtml @@ -0,0 +1,28 @@ +@using Orchard.Utility.Extensions +@model Orchard.Core.Common.ViewModels.TextFieldSettingsEventsViewModel + +
+
+ + + + @Html.ValidationMessageFor(m => m.Settings.Flavor) +
+
+
+
+ @Html.CheckBoxFor(m => m.Settings.Required) + @T("Check to ensure the user enters a value in this field.") +
+
+
+ + @Html.TextAreaFor(m => m.Settings.Hint, new { @class = "textMedium", rows = "5" }) + @T("The help text is written under the field when authors are editing the content item.") + @Html.ValidationMessageFor(m => m.Settings.Hint) +
\ No newline at end of file diff --git a/src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields.Common.Text.Edit.cshtml b/src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields.Common.Text.Edit.cshtml index 32715b179..9c8caad46 100644 --- a/src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields.Common.Text.Edit.cshtml +++ b/src/Orchard.Web/Core/Common/Views/EditorTemplates/Fields.Common.Text.Edit.cshtml @@ -1,5 +1,13 @@ -@model Orchard.Core.Common.Fields.TextField -
- - @Html.EditorFor(m=>m.Value)@Html.ValidationMessageFor(m=>m.Value) -
\ No newline at end of file +@model Orchard.Core.Common.ViewModels.TextFieldDriverViewModel + + +
+@if (String.IsNullOrWhiteSpace(Model.Settings.Flavor)) { + @Html.TextBoxFor(m => m.Text, new { @class = "text" }) + @Html.ValidationMessageFor(m => m.Text) +} +else { + @Display.Body_Editor(Text: Model.Text, EditorFlavor: Model.Settings.Flavor) +} +@Model.Settings.Hint +
diff --git a/src/Orchard.Web/Core/Common/Views/Fields.Common.Text.cshtml b/src/Orchard.Web/Core/Common/Views/Fields.Common.Text.cshtml index 7f8dc9013..1811733f3 100644 --- a/src/Orchard.Web/Core/Common/Views/Fields.Common.Text.cshtml +++ b/src/Orchard.Web/Core/Common/Views/Fields.Common.Text.cshtml @@ -1,7 +1,7 @@ @{ string name = Model.ContentField.DisplayName; - string value = Model.Value; } -@if (HasText(name) && HasText(value)) { -

@name: @value

+ +@if (HasText(name) && HasText(Model.Value)) { +

@name: @Model.Value

} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 166876ffc..29b2aa886 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -78,6 +78,10 @@ + + + + @@ -494,6 +498,9 @@ + + +