Beispiel #1
0
        private static string BuildFormSummaryTag(
            string formSummaryId,
            MiruValidationException validationException,
            ExceptionResultContext m)
        {
            var formSummary = m.GetService <HtmlGenerator>()
                              .FormSummaryFor(validationException.Model)
                              .RemoveAttr("hidden");

            // TODO: get from htmlconventions
            var turboStreamTag = new TurboStreamTag("replace", formSummaryId)
                                 .AppendIntoTemplate(formSummary);

            validationException.Errors.Each(error => formSummary.Add("div", tag => tag.Text(error.ErrorMessage)));

            return(turboStreamTag.ToString());
        }
Beispiel #2
0
        public void MiruTurboFormSummary()
        {
            When(m =>
                 m.Request.IsPost() &&
                 m.Request.CanAccept(TurboStreamResult.MimeType) &&
                 m.Exception is ValidationException).Respond(m =>
            {
                var validationException = (MiruValidationException)m.Exception;
                var naming        = m.GetService <ElementNaming>();
                var formSummaryId = naming.FormSummaryId(validationException.Model);

                var html = new StringBuilder();

                html.Append(BuildValidationMessageTags(validationException));

                html.Append(BuildFormSummaryTag(formSummaryId, validationException, m));

                return(new TurboStreamResult(html.ToString(), HttpStatusCode.UnprocessableEntity));
            });

            When(m =>
                 m.Request.IsPost() &&
                 m.Request.CanAccept(TurboStreamResult.MimeType)).Respond(m =>
            {
                var formSummaryId = m.Request.Headers["turbo-form-summary-id"];

                var formSummary = m.GetService <HtmlGenerator>()
                                  .FormSummaryFor(m.Request)
                                  .Id(formSummaryId)
                                  .RemoveAttr("hidden");

                var turboStream = new TurboStreamTag("replace", formSummaryId)
                                  .AppendIntoTemplate(formSummary);

                App.Log.Error(m.Exception, "An error occurred while processing your request");

                var errorMessage = m.Exception is DomainException domainException
                    ? domainException.Message
                    : "An error occurred while processing your request";

                formSummary.Add("div", tag => tag.Text(errorMessage));

                return(new TurboStreamResult(turboStream, HttpStatusCode.UnprocessableEntity));
            });
        }
Beispiel #3
0
        private static StringBuilder BuildValidationMessageTags(MiruValidationException validationException)
        {
            var html = new StringBuilder();

            foreach (var error in validationException.Errors)
            {
                var inputId = ElementNaming.BuildId(error.PropertyName);
                var validationMessageTagId = $"{inputId}-validation";

                var validationMessageTag =
                    new InputValidationTag(validationMessageTagId, inputId, error.ErrorMessage);

                var turboStreamTag = new TurboStreamTag("replace", validationMessageTagId)
                                     .AppendIntoTemplate(validationMessageTag);

                html.AppendLine(turboStreamTag.ToString());
            }

            return(html);
        }
Beispiel #4
0
        public void MiruTurboFormSummary()
        {
            When(m =>
                 m.Request.IsPost() &&
                 m.Request.CanAccept(TurboStreamResult.MimeType) &&
                 m.Exception is ValidationException).Respond(m =>
            {
                var validationException = (MiruValidationException)m.Exception;
                var naming = m.GetService <ElementNaming>();

                var template = new HtmlTag("template");

                var summaryId = naming.FormSummaryId(validationException.Model).Replace('.', '_');

                var summary = new HtmlTag("div")
                              // TODO: parse css selector to HtmlTag (at least basic .class #id attribute
                              .Id(summaryId)
                              .AddClass("form-summary")
                              .AddClass("alert")
                              .AddClass("alert-danger")
                              .Attr("data-controller", "form-summary");

                template.Append(summary);

                // TODO: get from htmlconventions
                var turboStream = new HtmlTag("turbo-stream")
                                  .Attr("action", "replace")
                                  .Attr("target", summaryId)
                                  .Append(template);

                var turboStreamTag = new TurboStreamTag("replace", summaryId)
                                     .AppendIntoTemplate(summary);

                validationException.Errors.Each(error => summary.Add("div", tag => tag.Text(error.ErrorMessage)));

                return(new TurboStreamResult(turboStream, HttpStatusCode.UnprocessableEntity));
            });

            When(m =>
                 m.Request.IsPost() &&
                 m.Request.CanAccept(TurboStreamResult.MimeType)).Respond(m =>
            {
                var template = new HtmlTag("template");

                var summaryId = m.Request.Form["__Summary"];

                var summary = new HtmlTag("div")
                              // TODO: parse css selector to HtmlTag (at least basic .class #id attribute
                              // TODO: should not be hardcoded. Should get from HtmlConventions
                              .Id(summaryId)
                              .AddClass("form-summary")
                              .AddClass("alert")
                              .AddClass("alert-danger")
                              .Attr("data-controller", "form-summary");

                template.Append(summary);

                // TODO: get from htmlconventions
                // TODO: new TurboStreamTag()
                var turboStream = new HtmlTag("turbo-stream")
                                  .Attr("action", "replace")
                                  .Attr("target", summaryId)
                                  .Append(template);

                var errorMessage = m.Exception is DomainException domainException
                    ? domainException.Message
                    : "An error occurred while processing your request";

                summary.Add("div", tag => tag.Text(errorMessage));

                return(new TurboStreamResult(turboStream, HttpStatusCode.UnprocessableEntity));
            });
        }