internal IHtmlContent?GenerateHint(TagHelperContext tagHelperContext, FormGroupContext formGroupContext)
        {
            var content    = formGroupContext.Hint?.Content;
            var attributes = formGroupContext.Hint?.Attributes;

            if (content == null && AspFor != null)
            {
                var description = ModelHelper.GetDescription(AspFor.ModelExplorer);

                if (description != null)
                {
                    content = new HtmlString(description);
                }
            }

            if (content != null)
            {
                var resolvedIdPrefix = ResolveIdPrefix();
                var hintId           = resolvedIdPrefix + "-hint";
                DescribedBy = AppendToDescribedBy(DescribedBy, hintId);
                return(Generator.GenerateHint(hintId, content, attributes));
            }
            else
            {
                return(null);
            }
        }
Example #2
0
        private protected override IHtmlContent GenerateFormGroupContent(
            TagHelperContext tagHelperContext,
            FormGroupContext formGroupContext,
            TagHelperOutput tagHelperOutput,
            IHtmlContent childContent,
            out bool haveError)
        {
            var radiosContext = tagHelperContext.GetContextItem <RadiosContext>();

            var contentBuilder = new HtmlContentBuilder();

            var hint = GenerateHint(tagHelperContext, formGroupContext);

            if (hint != null)
            {
                contentBuilder.AppendHtml(hint);
            }

            var errorMessage = GenerateErrorMessage(tagHelperContext, formGroupContext);

            if (errorMessage != null)
            {
                contentBuilder.AppendHtml(errorMessage);
            }

            haveError = errorMessage != null;
            var haveFieldset = radiosContext.Fieldset != null;

            var radiosTagBuilder = GenerateRadios();

            contentBuilder.AppendHtml(radiosTagBuilder);

            if (haveFieldset)
            {
                return(Generator.GenerateFieldset(
                           DescribedBy,
                           role: null,
                           radiosContext.Fieldset !.Legend?.IsPageHeading,
                           radiosContext.Fieldset.Legend?.Content,
                           radiosContext.Fieldset.Legend?.Attributes,
                           content: contentBuilder,
                           radiosContext.Fieldset.Attributes));
            }

            return(contentBuilder);

            TagBuilder GenerateRadios()
            {
                var resolvedIdPrefix = ResolveIdPrefix();

                TryResolveName(out var resolvedName);

                return(Generator.GenerateRadios(
                           resolvedIdPrefix,
                           resolvedName,
                           items: radiosContext.Items,
                           attributes: RadiosAttributes.ToAttributeDictionary()));
            }
        }
Example #3
0
        private protected override IHtmlContent GenerateFormGroupContent(
            TagHelperContext tagHelperContext,
            FormGroupContext formGroupContext,
            TagHelperOutput tagHelperOutput,
            IHtmlContent childContent,
            out bool haveError)
        {
            var contentBuilder = new HtmlContentBuilder();

            var label = GenerateLabel(formGroupContext);

            contentBuilder.AppendHtml(label);

            var hint = GenerateHint(tagHelperContext, formGroupContext);

            if (hint != null)
            {
                contentBuilder.AppendHtml(hint);
            }

            var errorMessage = GenerateErrorMessage(tagHelperContext, formGroupContext);

            if (errorMessage != null)
            {
                contentBuilder.AppendHtml(errorMessage);
            }

            haveError = errorMessage != null;

            var inputTagBuilder = GenerateFileUpload(haveError);

            contentBuilder.AppendHtml(inputTagBuilder);

            return(contentBuilder);

            TagBuilder GenerateFileUpload(bool haveError)
            {
                var resolvedId   = ResolveIdPrefix();
                var resolvedName = ResolveName();

                return(Generator.GenerateFileUpload(
                           haveError,
                           resolvedId,
                           resolvedName,
                           DescribedBy,
                           InputAttributes.ToAttributeDictionary()));
            }
        }
        internal IHtmlContent GenerateLabel(FormGroupContext formGroupContext)
        {
            // We need some content for the label; if AspFor is null then label content must have been specified
            if (AspFor == null && formGroupContext.Label?.Content == null)
            {
                throw new InvalidOperationException(
                          $"Label content must be specified when the '{AspForAttributeName}' attribute is not specified.");
            }

            var resolvedIdPrefix = ResolveIdPrefix();

            var isPageHeading = formGroupContext.Label?.IsPageHeading ?? ComponentGenerator.LabelDefaultIsPageHeading;
            var content       = formGroupContext.Label?.Content;
            var attributes    = formGroupContext.Label?.Attributes;

            var resolvedContent = content ??
                                  new HtmlString(ModelHelper.GetDisplayName(ViewContext, AspFor !.ModelExplorer, AspFor.Name));

            return(Generator.GenerateLabel(resolvedIdPrefix, isPageHeading, resolvedContent, attributes));
        }
 private protected abstract IHtmlContent GenerateFormGroupContent(
     TagHelperContext tagHelperContext,
     FormGroupContext formGroupContext,
     TagHelperOutput tagHelperOutput,
     IHtmlContent childContent,
     out bool haveError);
        internal IHtmlContent?GenerateErrorMessage(TagHelperContext tagHelperContext, FormGroupContext formGroupContext)
        {
            var visuallyHiddenText = formGroupContext.ErrorMessage?.VisuallyHiddenText ??
                                     ComponentGenerator.ErrorMessageDefaultVisuallyHiddenText;

            var content    = formGroupContext.ErrorMessage?.Content;
            var attributes = formGroupContext.ErrorMessage?.Attributes;

            if (content == null && AspFor != null && IgnoreModelStateErrors != true)
            {
                var validationMessage = ModelHelper.GetValidationMessage(
                    ViewContext,
                    AspFor !.ModelExplorer,
                    AspFor.Name);

                if (validationMessage != null)
                {
                    content = new HtmlString(validationMessage);
                }
            }

            if (content != null)
            {
                AddErrorToFormErrorContext();

                var resolvedIdPrefix = ResolveIdPrefix();
                var errorId          = resolvedIdPrefix + "-error";
                DescribedBy = AppendToDescribedBy(DescribedBy, errorId);

                attributes ??= new AttributeDictionary();
                attributes["id"] = errorId;

                return(Generator.GenerateErrorMessage(visuallyHiddenText, content, attributes));
            }
            else
            {
                return(null);
            }

            void AddErrorToFormErrorContext()
            {
                if (tagHelperContext.Items.TryGetValue(typeof(FormErrorContext), out var formErrorContextObj) &&
                    formErrorContextObj is FormErrorContext formErrorContext)
                {
                    var errorFieldId = GetErrorFieldId(tagHelperContext);
                    var href         = "#" + errorFieldId;

                    formErrorContext.AddError(content, href);
                }
            }
        }
        private protected override IHtmlContent GenerateFormGroupContent(
            TagHelperContext tagHelperContext,
            FormGroupContext formGroupContext,
            TagHelperOutput tagHelperOutput,
            IHtmlContent childContent,
            out bool haveError)
        {
            var contentBuilder = new HtmlContentBuilder();

            var label = GenerateLabel(formGroupContext);

            contentBuilder.AppendHtml(label);

            var hint = GenerateHint(tagHelperContext, formGroupContext);

            if (hint != null)
            {
                contentBuilder.AppendHtml(hint);
            }

            var errorMessage = GenerateErrorMessage(tagHelperContext, formGroupContext);

            if (errorMessage != null)
            {
                contentBuilder.AppendHtml(errorMessage);
            }

            haveError = errorMessage != null;

            var textAreaTagBuilder = GenerateTextArea(haveError);

            contentBuilder.AppendHtml(textAreaTagBuilder);

            return(contentBuilder);

            TagBuilder GenerateTextArea(bool haveError)
            {
                var textAreaContext = tagHelperContext.GetContextItem <TextAreaContext>();

                var resolvedId   = ResolveIdPrefix();
                var resolvedName = ResolveName();

                var resolvedContent = textAreaContext.Value ??
                                      new HtmlString(AspFor != null ? ModelHelper.GetModelValue(ViewContext, AspFor.ModelExplorer, AspFor.Name) : string.Empty);

                var resolvedTextAreaAttributes = TextAreaAttributes.ToAttributeDictionary();

                resolvedTextAreaAttributes.MergeCssClass("govuk-js-textarea");

                return(Generator.GenerateTextArea(
                           haveError,
                           resolvedId,
                           resolvedName,
                           Rows,
                           DescribedBy,
                           Autocomplete,
                           Spellcheck,
                           Disabled,
                           resolvedContent,
                           resolvedTextAreaAttributes));
            }
        }