diff --git a/src/Orchard.Web/Modules/Orchard.DevTools/Controllers/HomeController.cs b/src/Orchard.Web/Modules/Orchard.DevTools/Controllers/HomeController.cs index d0650ed2b..83b2b8252 100644 --- a/src/Orchard.Web/Modules/Orchard.DevTools/Controllers/HomeController.cs +++ b/src/Orchard.Web/Modules/Orchard.DevTools/Controllers/HomeController.cs @@ -55,14 +55,22 @@ namespace Orchard.DevTools.Controllers { } public ActionResult FormShapes() { - var model = Shape.Form(Submit: Shape.FormSubmit(Text: T("Finish Setup"))) - .Fieldsets(Shape.Zone(typeof (Array), Name: "Fieldsets")); + var model = Shape.Form() + .Fieldsets(Shape.Fieldsets(typeof(Array)) + .Add(Shape.Fieldset(typeof(Array)).Name("site") + .Add(Shape.InputText().Name("SiteName").Text(T("Site Name")).Value(T("some default/pre-pop value...").Text)) + ) + .Add(Shape.Fieldset(typeof(Array)).Name("admin") + .Add(Shape.InputText().Name("AdminUsername").Text(T("Admin Username"))) + .Add(Shape.InputPassword().Name("AdminPassword").Text(T("Admin Password"))) + ) + .Add(Shape.Fieldset(typeof(Array)).Name("actions") + .Add(Shape.FormSubmit().Text(T("Finish Setup"))) + ) + ); - model.Fieldsets.Add(Shape.InputText(Name: "SiteName", Text: T("Site Name"), Value: T("some default/pre-pop value..."))); - model.Fieldsets.Add(Shape.InputText(Name: "AdminUsername", Text: T("Admin Username"))); - model.Fieldsets.Add(Shape.InputPassword(Name: "AdminPassword", Text: T("Admin Password"))); - - model.Fieldsets[0].Attributes(new {autofocus = "autofocus"}); // <-- could be applied by some other behavior - need to be able to modify attributes instead of clobbering them like this + // get at the first input? + //model.Fieldsets[0].Attributes(new {autofocus = "autofocus"}); // <-- could be applied by some other behavior - need to be able to modify attributes instead of clobbering them like this return View(model); } diff --git a/src/Orchard/Mvc/Html/Shapes.cs b/src/Orchard/Mvc/Html/Shapes.cs index 878cb2784..51c9014c6 100644 --- a/src/Orchard/Mvc/Html/Shapes.cs +++ b/src/Orchard/Mvc/Html/Shapes.cs @@ -1,45 +1,152 @@ -using System.Web; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; using System.Web.Mvc; using ClaySharp; using Orchard.DisplayManagement; +using Orchard.Localization; namespace Orchard.Mvc.Html { public class Shapes : IShapeDriver { + public Shapes(IShapeHelperFactory shapeHelperFactory) { + New = shapeHelperFactory.CreateHelper(); + } + + dynamic New { get; set; } + public IHtmlString Link(dynamic Display, object Content, string Url, INamedEnumerable Attributes) { - var tagBuilder = new TagBuilder("a") { InnerHtml = Display(Content).ToString() }; - tagBuilder.MergeAttributes(Attributes.Named); - tagBuilder.MergeAttribute("href", Url); - return Display(new HtmlString(tagBuilder.ToString(TagRenderMode.Normal))); + var a = new TagBuilder("a") { + InnerHtml = Display(Content).ToString() + }; + a.MergeAttributes(Attributes.Named); + a.MergeAttribute("href", Url); + return Display(new HtmlString(a.ToString())); } public IHtmlString Image(dynamic Display, string Url, INamedEnumerable Attributes) { - var tagBuilder = new TagBuilder("img"); - tagBuilder.MergeAttributes(Attributes.Named); - tagBuilder.MergeAttribute("src", Url); - return Display(new HtmlString(tagBuilder.ToString(TagRenderMode.SelfClosing))); + var img = new TagBuilder("img"); + img.MergeAttributes(Attributes.Named); + img.MergeAttribute("src", Url); + return Display(new HtmlString(img.ToString(TagRenderMode.SelfClosing))); + } + + public IHtmlString UnorderedList(dynamic Display, dynamic Shape, INamedEnumerable Attributes) { + var ul = new TagBuilder("ul") { + InnerHtml = Combine(DisplayAll(Display, Shape, New.ListItem())).ToString() + }; + ul.MergeAttributes(Attributes.Named); + return Display(new HtmlString(ul.ToString())); + } + + public IHtmlString ListItem(dynamic Display, dynamic Shape, INamedEnumerable Attributes) { + var li = new TagBuilder("li") { + InnerHtml = Display(Shape.Content).ToString() + }; + li.MergeAttributes(Attributes.Named); + if (!string.IsNullOrWhiteSpace(Shape.Content.Name as string)) + li.MergeAttribute("class", Shape.Content.Name); + return Display(new HtmlString(li.ToString())); } #region form and company - public IHtmlString Form(dynamic Display, dynamic Shape, object Submit) { - return Display(new HtmlString("
" + Display(Shape.Fieldsets, Submit).ToString() + "
")); + public IHtmlString Form(dynamic Display, dynamic Shape, object Submit, INamedEnumerable Attributes) { + var form = new TagBuilder("form") { + InnerHtml = Display(Shape.Fieldsets).ToString() + }; + form.MergeAttributes(Attributes.Named); + return Display(new HtmlString(form.ToString())); + } + + public IHtmlString Fieldsets(dynamic Display, dynamic Shape) { + return Display(new HtmlString(Combine(DisplayAll(Display, Shape)).ToString())); + } + + public IHtmlString Fieldset(dynamic Display, dynamic Shape, INamedEnumerable Attributes) { + var fieldset = new TagBuilder("fieldset"); + fieldset.MergeAttributes(Attributes.Named); + if (!string.IsNullOrWhiteSpace(Shape.Name as string)) + fieldset.MergeAttribute("class", Shape.Name); + + if (Shape.Count > 1) { + Shape.ShapeMetadata.Type = "UnorderedList"; + fieldset.InnerHtml = Display(Shape).ToString(); + } + else { + fieldset.InnerHtml = Combine(DisplayAll(Display, Shape)).ToString(); + } + + return Display(new HtmlString(fieldset.ToString())); + } + + public IHtmlString FormButton(dynamic Display, dynamic Shape, INamedEnumerable Attributes) { + var button = new TagBuilder("button") { + InnerHtml = Display(Shape.Text).ToString() //not caring about anything other than text at the moment + }; + button.MergeAttributes(Attributes.Named); + return Display(new HtmlString(button.ToString())); } public IHtmlString FormSubmit(dynamic Display, dynamic Shape) { - return Display(new HtmlString("")); + Shape.ShapeMetadata.Type = "FormButton"; + Shape.Attributes(new { type = "submit" }); + return Display(Shape); + } + + public IHtmlString Input(dynamic Display, dynamic Shape, INamedEnumerable Attributes) { + var input = new TagBuilder("input"); + input.MergeAttributes(Attributes.Named); + input.MergeAttribute("name", Shape.Name); + if (!string.IsNullOrWhiteSpace(Shape.Value as string)) + input.MergeAttribute("value", Shape.Value); + return Display(new HtmlString(input.ToString(TagRenderMode.SelfClosing))); + } + + public IHtmlString Label(dynamic Display, dynamic Shape, INamedEnumerable Attributes) { + var label = new TagBuilder("label") { + InnerHtml = Display(Shape.Text).ToString() + }; + label.MergeAttributes(Attributes.Named); + return Display(new HtmlString(label.ToString())); + } + + public IHtmlString Text(dynamic Shape) { + return new HtmlString(Shape.ToString()); } public IHtmlString InputPassword(dynamic Display, dynamic Shape) { - return Display(new HtmlString("")); + Shape.ShapeMetadata.Type = "Input"; + Shape.Attributes(new { type = "password" }); + return Display( + New.Label().Text(Shape.Text), + Shape); //need validation shape } - public IHtmlString InputText(dynamic Display, dynamic Shape, INamedEnumerable Attributes) { - // not optimal obviously, just testing the waters - return Display(new HtmlString("" - + "")); // <- otherwise Shape.Value is "ClaySharp.Clay" + public IHtmlString InputText(dynamic Display, dynamic Shape) { + Shape.ShapeMetadata.Type = "Input"; + Shape.Attributes(new { type = "text" }); + return Display( + New.Label().Text(Shape.Text), + Shape); //need validation shape } #endregion + + static IHtmlString Combine(IEnumerable contents) { + return new HtmlString(contents.Aggregate("", (a, b) => a + b)); + } + + IEnumerable DisplayAll(dynamic Display, dynamic Shape) { + foreach (var item in Shape) { + yield return Display(item); + } + } + + IEnumerable DisplayAll(dynamic Display, dynamic Shape, dynamic Wrapper) { + foreach (var item in Shape) { + yield return Display(Wrapper.Content(item)); + } + } } }