public static void AddElementName(ElementRequest request, HtmlTag tag)
 {
     if (tag.IsInputElement())
     {
         tag.Attr("name", request.ElementId);
         tag.Attr("id", idRegex.Replace(request.ElementId, "_"));
     }
 }
 public override HtmlTag Build(ElementRequest request)
 {
     HtmlTag root = new HtmlTag("a");
     root.Attr("href", "mailto:" + request.StringValue());
     root.Attr("name", request.Accessor.FieldName + "Link");
     root.Append(new HtmlTag("span").Text(request.StringValue()));
     return root;
 }
        public InputConventions()
        {
            Editors.Always
                .Modify((request, tag) => tag.Attr("id", request.Accessor.Name));

            Editors
                .If(x => x.Accessor.FieldName.Contains("Password") && x.Accessor.PropertyType.IsString())
                .Attr("type", "password");

            Editors
                .If(x => x.Accessor.FieldName.Contains("Email") && x.Accessor.PropertyType.IsString())
                .Attr("type", "email");

            Editors
                .If(x => x.Accessor.FieldName.Contains("Body") && x.Accessor.PropertyType.IsString())
                .Modify((r, x) =>
                            {
                                x.TagName("textarea");
                                x.Text(r.StringValue());
                            });

            Editors
                .If(x => x.Accessor.InnerProperty.HasAttribute<RequiredAttribute>())
                .Modify(x => x.AddClass("required"));

            Editors
                .If(x => x.Accessor.InnerProperty.HasAttribute<MinLengthAttribute>())
                .Modify((request, tag) =>
                {
                    var length = request.Accessor.InnerProperty.GetAttribute<MinLengthAttribute>().Length;
                    tag.Attr("minlength", length);
                });

            Editors
                .If(x => x.Accessor.InnerProperty.HasAttribute<MaxLengthAttribute>())
                .Modify((request, tag) =>
                {
                    var length = request.Accessor.InnerProperty.GetAttribute<MaxLengthAttribute>().Length;
                    tag.Attr("maxlength", length);
                });

            Editors.Always
                .Modify((request, tag) =>
                            {
                                var result = request.Get<IFubuRequest>().Get<ValidationResult>();
                                if (result == null || result.IsValid) return;
                                var error = result.Errors.FirstOrDefault(x => x.PropertyName == request.Accessor.InnerProperty.Name);
                                if (error == null) return;

                                var errorLabel = new HtmlTag("label");
                                errorLabel.Text(error.ErrorMessage);
                                errorLabel.AddClass("error");
                                errorLabel.Attr("for", request.Accessor.InnerProperty.Name);
                                errorLabel.Attr("generated", "true");
                                tag.Next = errorLabel;
                            });
        }
 public override HtmlTag Build(ElementRequest request)
 {
     HtmlTag root = new HtmlTag("a");
     root.Attr("href", request.RawValue);
     root.Attr("target", "_blank");
     root.Id(request.Accessor.FieldName);
     var img = new HtmlTag("img");
     img.Attr("src", request.RawValue);
     root.Append(img);
     return root;
 }
示例#5
0
        public override HtmlTag Build(ElementRequest request)
        {
            var tag = new HtmlTag("div").Text(request.StringValue()).AddClass("editable").Id(request.Accessor.Name);

            var options = new EditOptions();

            if (request.Accessor.HasAttribute<MarkdownAttribute>())
            {
                tag.UnEncoded().Text(new Markdown().Transform(request.RawValue== null ? "" : request.RawValue.ToString()));
                options.Markdown = true;
            }

            options.MultiLine = request.Accessor.Name == "Details";
            options.RequiresExplicitUserActionForSave = true;

            options.MaximumLength = request.Accessor.PropertyType.Equals(typeof(string)) ? Entity.UnboundedStringLength : 0;
            options.IsDate = request.Accessor.PropertyType.IsDateTime();
            options.IsTime = request.Accessor.Name.ToLower().Contains("time");
            options.IsNumber = request.Accessor.PropertyType.IsIntegerBased() || request.Accessor.PropertyType.IsFloatingPoint();
            options.Required = request.Accessor.HasAttribute<RequiredAttribute>();
            options.PlaceholderText = "Double-Click to edit " + request.Accessor.Name.ToLower() + ".";

            var data = options.ToJson();

            tag.Attr("data", "{editoptions:"+data+"}");
            return tag;
        }
        public void AssertValid(HtmlTag tag, string tagName, string name, string type = "", object value = null)
        {
            Assert.Equal(tagName, tag.TagName());
            Assert.Equal(name, tag.Attr("name"));
            Assert.Equal(name, tag.Attr("id"));

            if (type == null)
                Assert.False(tag.HasAttr("type"));
            else
                Assert.Equal(type, tag.Attr("type"));

            if (value == null)
                Assert.True(!tag.HasAttr("value") || tag.Attr("value") == "");
            else
                Assert.Equal(value.ToString(), tag.Attr("value"));
        }
 public override HtmlTag Build(ElementRequest request)
 {
     HtmlTag root = new HtmlTag("a");
     root.Attr("data-bind", "attr: { href: mailto:" + CCHtmlConventionsKO.DeriveElementName(request)+"}");
     root.Children.Add(new HtmlTag("span").Attr("data-bind", "text:" + CCHtmlConventionsKO.DeriveElementName(request)));
     return root;
 }
 private void AssertOptionGroup(
     HtmlTag optgroup,
     string display)
 {
     Assert.Equal("optgroup", optgroup.TagName());
     Assert.Equal(display, optgroup.Attr("label"));
 }
 public static void AddElementName(ElementRequest request, HtmlTag tag)
 {
     if (tag.IsInputElement())
     {
         tag.Attr("name", request.ElementId);
     }
 }
 public static void AddElementName(ElementRequest request, HtmlTag tag)
 {
     if (tag.IsInputElement())
     {
         tag.Attr(HtmlAttributeConstants.Name, request.ElementId);
     }
 }
示例#11
0
        private void MarkOptionAsSelected(HtmlTag optionTag)
        {
            var prevSelected = Children.FirstOrDefault(x => x.HasAttr(SelectedAttributeKey));

            prevSelected?.RemoveAttr(SelectedAttributeKey);

            optionTag.Attr(SelectedAttributeKey, SelectedAttributeKey);
        }
示例#12
0
        private void MarkOptionAsSelected(HtmlTag optionTag)
        {
            var prevSelected = Children.FirstOrDefault(x => x.HasAttr(SelectedAttributeKey));

            prevSelected?.RemoveAttr(SelectedAttributeKey);

            optionTag.Attr(SelectedAttributeKey, SelectedAttributeKey);
        }
        public override HtmlTags.HtmlTag Build(ElementRequest request)
        {
            HtmlTag el = new HtmlTag("ul").AddClass("pizza-type");

            IRepository repository = request.Get<IRepository>();
            IEnumerable<PizzaType> pizzaTypes = repository.GetAll<PizzaType>().Cast<PizzaType>();
            var stringifier = request.Get<Stringifier>();

            foreach (PizzaType pt in pizzaTypes)
            {
                HtmlTag radio = new HtmlTag("input");
                radio.Attr("type", "radio").Attr("name", "PizzaType");
                radio.Attr("value", pt.Id);
                radio.Text(stringifier.GetString(pt));
                el.Append(new HtmlTag("li").Append(radio));
            }

            return el;
        }
示例#14
0
 private HtmlTag getLiItem(MenuItem item)
 {
     if (item == null) return null;
     var li = new HtmlTag("li");
     if(item.CssClass.IsNotEmpty())
         li.AddClass(item.CssClass);
     var anchor = new HtmlTag("a");
     anchor.Attr("href", "#");
     anchor.Attr("rel", item.Url);
     anchor.Text(item.Text);
     li.Children.Add(anchor);
     if(item.Children!=null)
     {
         var ul = new HtmlTag("ul");
         renderListItems(ul, item.Children);
         li.Children.Add(ul);
     }
     return li;
 }
示例#15
0
        private void writeChildren(MenuItemToken item, HtmlTag link)
        {
            link.AddClass("dropdown-toggle");
            link.Attr("data-toggle", "dropdown");

            link.Add("b").AddClass("caret");

            var ul = Add("ul").AddClass("dropdown-menu");
            item.Children.Each(child =>
            {
                var childTag = new MenuItemTag(child);
                ul.Append(childTag);
            });
        }
		public static HtmlTag GetRatingStars(int rating)
		{
			var t = new HtmlTag("span");

			for (int i = 0; i < rating; i++)
			{
				var img = new HtmlTag("img");
				img.Attr("src", "/Public/images/rating.png");
				img.AddClass("ratingImage");
				t.Append(img);
			}

			return t;
		}
示例#17
0
        private void ModifyWithValidationGraph(ElementRequest request, HtmlTag tag)
        {
            // check for partials
            var modelType = (request.Accessor is SingleProperty) ? request.Model.GetType() : request.Accessor.OwnerType;

            var calls = _graph
                            .FindChain(modelType)
                            .CallsFor(request.Accessor.FieldName);

            calls
                .Where(call => !typeof(ComparisonValidationRule<>).IsAssignableFrom(call.RuleType))
                .Each(call => tag.Modify(t => t.AddClass(call.ToRuleDef().Name.ToLower())));

            tag.Attr("id", request.ElementId);
        }
示例#18
0
 public static void AddElementName(ElementRequest request, HtmlTag tag)
 {
     if (tag.IsInputElement())
     {
         var name = request.Accessor.Name;
         if (request.Accessor is PropertyChain)
         {
             name = ((PropertyChain)(request.Accessor)).PropertyNames.Aggregate((current, next) => current + "." + next);
             if (new InheritsFromDomainEntity().execute(request.Accessor.PropertyType))
                 name += ".EntityId";
         }
         //var name = request.Accessor.Name.Substring(0, request.Accessor.Name.IndexOf(request.Accessor.FieldName)) + "." + request.Accessor.FieldName;
         //tag.Attr("name", name);
         tag.Attr("name", name);
     }
 }
 public HtmlTag ToHtmlTag()
 {
     var root = new HtmlTag("form");
     if (!string.IsNullOrEmpty(_id))
     {
         root.Attr("id", _id);
     }
     var innerDiv = new HtmlTag("div");
     innerDiv.Append(new StyledButtonExpression("all", true).NonLocalizedText("All").ToHtmlTag());
     for (int i = 65; i < 91; i++)
     {
         string letter = ((char)i).ToString();
         innerDiv.Append(new StyledButtonExpression(letter, true).NonLocalizedText(letter).ToHtmlTag());
     }
     root.Append(innerDiv);
     return root;
 }
        private static HtmlTag ListItemFor(object enumValue, ElementRequest request)
        {
            var radioId = string.Format("{0}_{1}", request.ElementId, enumValue);

            var radioButton = new HtmlTag("input")
                .Attr("id", radioId)
                .Attr("name", request.ElementId)
                .Attr("type", "radio")
                .Attr("value", enumValue.ToString());
            if (enumValue.ToString() == request.StringValue())
            {
                radioButton.Attr("checked", "checked");
            }

            var label = new HtmlTag("label")
                .Attr("for", radioId)
                .Encoded(false)
                .Text(enumValue.ToDescriptionString());

            return new HtmlTag("li", tag => tag.Children.AddMany(new[] {radioButton, label}));
        }
        public static void AddElementName(ElementRequest request, HtmlTag tag)
        {
            if (tag.IsInputElement())
            {
                var name = request.Accessor.Name;
                if (request.Accessor is FubuMVC.Core.Util.PropertyChain)
                {
                    name = ((FubuMVC.Core.Util.PropertyChain)(request.Accessor)).Names.Aggregate((current, next) => current + "." + next);
                    var isDomainEntity =false;
                    var de = request.Accessor.PropertyType.BaseType;
                    while(de.Name!="Object")
                    {
                        if (de.Name == "DomainEntity") isDomainEntity = true;
                        de = de.BaseType;
                    }
                    if (isDomainEntity) name += ".EntityId";

                }
                //var name = request.Accessor.Name.Substring(0, request.Accessor.Name.IndexOf(request.Accessor.FieldName)) + "." + request.Accessor.FieldName;
                //tag.Attr("name", name);
                tag.Attr("name", name);
            }
        }
 public void AddLengthClasses(IEnumerable<ValidationAttribute> propertyValidators, HtmlTag htmlTag, RequestData requestData)
 {
     var lengthValidator = propertyValidators.OfType<StringLengthAttribute>().FirstOrDefault();
     if (lengthValidator != null)
     {
         htmlTag.Attr("maxlength", lengthValidator.MaximumLength);
     }
 }
 public void AddLengthClasses(IEnumerable<PropertyValidatorResult> propertyValidators, HtmlTag htmlTag, RequestData requestData)
 {
     var result = propertyValidators.FirstOrDefault(x => x.PropertyValidator is LengthValidator);
     if (result != null)
     {
         htmlTag.Attr("maxlength", result.PropertyValidator.As<LengthValidator>().Max);
     }
 }
 private static void SetColspan(HtmlTag cell, ExportCell exportCell)
 {
     if (!cell.HasAttr(HtmlAttributeConstants.Colspan))
     {
         return;
     }
     int colspan;
     if(int.TryParse(cell.Attr(HtmlAttributeConstants.Colspan), out colspan))
     {
         exportCell.ColumnSpan = colspan;
     }
 }
 public void SetsOn()
 {
     var tag = new HtmlTag("input");
     tag.Autocomplete(true);
     tag.Attr("autocomplete").ShouldEqual("on");
 }
 public void AddsPlaceholderAttribute()
 {
     var tag = new HtmlTag("input");
     tag.Placeholder("dummy text");
     tag.Attr("placeholder").ShouldEqual("dummy text");
 }
示例#27
0
 private void addClassesAndAttributesToRoot(HtmlTag root)
 {
     HtmlAttributes.Each(x => root.Attr(x.Key, x.Value));
 }
        public NTCodingFubuRegistry()
        {
        	IncludeDiagnostics(true);

        	Routes
        		.IgnoreNamespaceText("Endpoints")
        		.IgnoreClassSuffix("Endpoint")
				.IgnoreClassSuffix("Index")
        		.IgnoreMethodsNamed("get")
        		.IgnoreMethodsNamed("post")
        		.ConstrainToHttpMethod(x => x.Method.Name.Equals("Get"), "Get")
        		.ConstrainToHttpMethod(x => x.Method.Name.Equals("Post"), "Post")
        		.RootAtAssemblyNamespace()
        		.HomeIs<IndexEndpoint>(e => e.Get(new HomepageLinkModel()));

        	Actions
        		.IncludeTypes(t => t.Namespace.Contains("Web.Endpoints") && t.Name.EndsWith("Endpoint"));

        	Views
        		.TryToAttach(x => x.by_ViewModel())
        		.RegisterActionLessViews(t => t.ViewModelType == typeof (Notification));

        	Output.To<RenderImageNode>().WhenTheOutputModelIs<ImageModel>();

			Services(x => x.ReplaceService<IAuthorizationFailureHandler, NTCodingAuthorizationFailureHandler>());


        	Policies
				.Add<NTCodingValidationConvention>()
				.Add<RemapFormValuesOnValidationFailurePolicy>()
        		.WrapBehaviorChainsWith<RavenSessionBehaviour>()
        		.Add<AuthenticationConvention>();


			// TODO - move into conventions / policies? Put Html building logic into helpers
        	HtmlConvention(x =>
        	               x.Displays
        	               	.If(e => e.Accessor.Name.EndsWith("Html") && e.Accessor.PropertyType == typeof (String))
        	               	.BuildBy(er => new HtmlTag("div").AppendHtml(er.Value<String>())));

        	HtmlConvention(x =>
        	               x.Labels
        	               	.If(e => e.Accessor.Name.EndsWith("_BigText"))
        	               	.BuildBy(er => new HtmlTag("label").Text(er.Accessor.Name.Replace("_BigText", "")))
        		);

        	HtmlConvention(x =>
        	               x.Displays
        	               	.If(e => e.Accessor.PropertyType.IsAssignableFrom(typeof (IEnumerable<String>)))
        	               	.BuildBy(er =>
        	               	         	{
        	               	         		var list = new HtmlTag("ul");
        	               	         		foreach (var item in er.Value<IEnumerable<String>>())
        	               	         		{
        	               	         			list.Append(new HtmlTag("li", t => t.Text(item)));
        	               	         		}

        	               	         		return list;
        	               	         	}
        	               	));

			HtmlConvention(x =>
						x.Displays
						.If(e => e.Accessor.PropertyType.IsAssignableFrom(typeof(ImageDisplayModel)))
						.BuildBy(er =>
						{
							// TODO - New convention to blog about - mention how we are making url's irrelevant to the internals of the application
							var model = er.Value<ImageDisplayModel>();
							var urlForImage = String.Format("/Image?id={0}&width={1}&height={2}", model.Id, model.Width, model.Height);
							return new HtmlTag("img").Attr("src", urlForImage);
						}
							));

        	HtmlConvention(x =>
        	               x.Editors
        	               	.If(e => e.Accessor.Name.EndsWith("_BigText"))
        	               	.BuildBy(er => new HtmlTag("textarea").Text(er.Value<String>()))
        		);


        	HtmlConvention(x =>
        	               x.Editors
        	               	.If(e => e.Accessor.PropertyType.IsEnum)
        	               	.BuildBy(er =>
        	               	         	{
											var name = er.Accessor.Name;

											// TODO - duplicated logic for creating select lists
        	               	         		var tag = new HtmlTag("select");
											tag.Children.Add(new HtmlTag("option").Text(GetDefaultValue(er, name)).Attr("value", "-"));
        	               	         		var enumValues = Enum.GetValues(er.Accessor.PropertyType);
        	               	         		foreach (var enumValue in enumValues)
        	               	         		{
        	               	         			var option = new HtmlTag("option").Text(enumValue.ToString());
        	               	         			
        	               	         			if (GetSelectedValue(er, name) == enumValue.ToString())
												{
													option.Attr("selected", "selected");
												}

												tag.Children.Add(option);
        	               	         		}

        	               	         		return tag;
        	               	         	})
        		);

        	HtmlConvention(x =>
        	               x.Editors
        	               	.If(e => e.Accessor.PropertyType.IsAssignableFrom(typeof (IDictionary<String, String>)))
        	               	.BuildBy(er =>
        	               	         	{
											// TODO - getting ugly - make this a class / method itself

        	               	         		string name = er.Accessor.PropertyNames[0].Substring(0, er.Accessor.PropertyNames[0].Length - 1);
        	               	         		string selectedValue = GetSelectedValue(er, name);
        	               	         		string defaultValue = GetDefaultValue(er, name);

        	               	         		var dictionary = er.Value<IDictionary<String, String>>();
        	               	         		var tag = new HtmlTag("select").Attr("name", name);
        	               	         		tag.Children.Add(new HtmlTag("option").Text(defaultValue).Attr("value", "-"));
        	               	         		foreach (var item in dictionary)
        	               	         		{
        	               	         			var option = new HtmlTag("option").Text(item.Value).Attr("value", item.Key);

												// TODO - new convention for next blog post
												if (selectedValue != null && selectedValue == item.Value)
												{
													option.Attr("selected", "selected");
												}

        	               	         			tag.Children.Add(option);
        	               	         		}

        	               	         		return tag;
        	               	         	})
        		);

        	HtmlConvention(x =>
        	               x.Editors
        	               	.If(e => e.Accessor.PropertyType.IsAssignableFrom(typeof (IList<StringWrapper>)))
        	               	.BuildBy(er =>
        	               	         	{
        	               	         		var tag = new HtmlTag("div").AddClass("hasHiddenGroup");
											
											tag.Children.Add(
												new HtmlTag("input")
												.Attr("type", "text")
												.Attr("name", er.Accessor.Name)
												);
											
											tag.Children.Add(
												new HtmlTag("a")
												.Attr("href", "#")
												.Text("add")
												.AddClass("addItem")
												);

        	               	         		var list = new HtmlTag("ul");
        	               	         		tag.Children.Add(list);

											var values = er.Value<IEnumerable<StringWrapper>>() ?? Enumerable.Empty<StringWrapper>();
											foreach (var s in values)
											{

												// add a list item showing the value and a delete link
												var li = new HtmlTag("li");
												li.Text(s.Text + "  ");

												var deleteLInk = new HtmlTag("a")
													.AddClass("listDelete")
													.Text("delete")
													.Attr("href", "#");

												li.Children.Add(deleteLInk);

												list.Children.Add(li);

												// add a hidden element so magic javascript can delete and manage indices
												var hidden = new HtmlTag("input")
													.Attr("type", "hidden")
													.Attr("name", er.Accessor.PropertyNames[0])
													.Attr("value", s.Text);

												tag.Children.Add(hidden);
											}

        	               	         		return tag;
        	               	         	}));

			HtmlConvention(x =>
						x.Editors
						.If(e => e.Accessor.PropertyType.IsAssignableFrom(typeof(HttpPostedFileBase)))
						.BuildBy(er => new HtmlTag("input").Attr("type", "file"))
				);

			HtmlConvention(x =>
					x.Editors
					.If(e => e.Accessor.Name.Equals("Id"))
					.BuildBy(er => new HtmlTag("input").Attr("type", "hidden").Attr("value", er.Value<String>()))
				);

			this.UseSpark();
        }
 public void AddsAutofocusAttribute()
 {
     var tag = new HtmlTag("input");
     tag.Autofocus();
     tag.Attr("autofocus").ShouldEqual("autofocus");
 }
 public void SetsOff()
 {
     var tag = new HtmlTag("input");
     tag.Autocomplete(false);
     tag.Attr("autocomplete").ShouldEqual("off");
 }
 private void addClassesAndAttributesToRoot(HtmlTag root)
 {
     HtmlAttributes.ForEachItem(x => root.Attr(x.Key, x.Value));
     CssClasses.ForEachItem(x => root.AddClass(x));
 }