public static void EnumTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
        {
            XcstWriter output = DocumentWriter.CastElement(package, seqOutput);

            string?            className      = GetEditorCssClass(new EditorInfo("Enum", "select"), null);
            var                htmlAttributes = CreateHtmlAttributes(html, className);
            ViewDataDictionary viewData       = html.ViewData;

            Type modelType = viewData.ModelMetadata.ModelType;
            Type enumType  = Nullable.GetUnderlyingType(modelType) ?? modelType;

            if (!enumType.IsEnum)
            {
                throw new InvalidOperationException("Enum template can only be used on Enum members.");
            }

            string?formatString = viewData.ModelMetadata.EditFormatString
                                  ?? viewData.ModelMetadata.DisplayFormatString;

            bool applyFormatInEdit = viewData.ModelMetadata.EditFormatString != null;

            IList <SelectListItem> options = EnumOptions(enumType, output, formatString, applyFormatInEdit);
            string optionLabel             = viewData.ModelMetadata.Watermark ?? String.Empty;

            SelectInstructions.SelectHelper(html, output, viewData.ModelMetadata, String.Empty, options, optionLabel, multiple: false, htmlAttributes: htmlAttributes);
        }
        public static void BooleanTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
        {
            ViewDataDictionary viewData = html.ViewData;

            bool?value = null;

            if (viewData.Model != null)
            {
                value = Convert.ToBoolean(viewData.Model, CultureInfo.InvariantCulture);
            }

            if (viewData.ModelMetadata.IsNullableValueType)
            {
                XcstWriter output = DocumentWriter.CastElement(package, seqOutput);

                string?className      = GetEditorCssClass(new EditorInfo("Boolean", "select"), "list-box tri-state");
                var    htmlAttributes = CreateHtmlAttributes(html, className);

                SelectInstructions.Select(html, output, String.Empty, TriStateValues(value), htmlAttributes: htmlAttributes);
            }
            else
            {
                string?className      = GetEditorCssClass(new EditorInfo("Boolean", "input", InputType.CheckBox), "check-box");
                var    htmlAttributes = CreateHtmlAttributes(html, className);

                InputInstructions.CheckBox(html, package, seqOutput, String.Empty, value.GetValueOrDefault(), htmlAttributes: htmlAttributes);
            }
        }
Example #3
0
        public static void CheckBoxForModel(
            HtmlHelper htmlHelper, IXcstPackage package, ISequenceWriter <XElement> output, bool isChecked, HtmlAttribs?htmlAttributes = null)
        {
            ModelMetadata metadata = htmlHelper.ViewData.ModelMetadata;

            CheckBoxForMetadata(htmlHelper, package, output, metadata, /*expression: */ String.Empty, isChecked, htmlAttributes);
        }
        public static void PasswordTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
        {
            XcstWriter output = DocumentWriter.CastElement(package, seqOutput);

            string?className      = GetEditorCssClass(new EditorInfo("Password", "input", InputType.Password), "text-box single-line password");
            var    htmlAttributes = CreateHtmlAttributes(html, className, addMetadataAttributes: true);

            InputInstructions.Input(html, output, String.Empty, value: null, type: "password", htmlAttributes: htmlAttributes);
        }
        /// <summary>
        ///     Adds a singleton sequence writer with an instance specified in
        ///     <paramref name="implementationInstance" />
        ///     to the <see cref="Microsoft.Extensions.DependencyInjection.IServiceCollection" />.
        /// </summary>
        /// <param name="silverbackBuilder">
        ///     The <see cref="ISilverbackBuilder" /> that references the <see cref="IServiceCollection" /> to add
        ///     the services to.
        /// </param>
        /// <param name="implementationInstance">
        ///     The instance of the service.
        /// </param>
        /// <returns>
        ///     The <see cref="ISilverbackBuilder" /> so that additional calls can be chained.
        /// </returns>
        public static ISilverbackBuilder AddSingletonSequenceWriter(
            this ISilverbackBuilder silverbackBuilder,
            ISequenceWriter implementationInstance)
        {
            Check.NotNull(silverbackBuilder, nameof(silverbackBuilder));

            silverbackBuilder.Services.AddSingleton(typeof(ISequenceWriter), implementationInstance);

            return(silverbackBuilder);
        }
        static void HtmlInputTemplateHelper(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput, string templateName, string?inputType = null)
        {
            XcstWriter output = DocumentWriter.CastElement(package, seqOutput);

            object value = html.ViewData.TemplateInfo.FormattedModelValue;

            string?className      = GetEditorCssClass(new EditorInfo(templateName, "input", InputType.Text), "text-box single-line");
            var    htmlAttributes = CreateHtmlAttributes(html, className, inputType: inputType, addMetadataAttributes: true);

            InputInstructions.Input(html, output, name: String.Empty, value: value, htmlAttributes: htmlAttributes);
        }
Example #7
0
        public static void UrlTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
        {
            XcstWriter output = DocumentWriter.CastElement(package, seqOutput);

            ViewDataDictionary viewData = html.ViewData;

            output.WriteStartElement("a");
            output.WriteAttributeString("href", Convert.ToString(viewData.Model, CultureInfo.InvariantCulture));
            output.WriteString(output.SimpleContent.Convert(viewData.TemplateInfo.FormattedModelValue));
            output.WriteEndElement();
        }
        public static void ListBoxTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
        {
            XcstWriter output = DocumentWriter.CastElement(package, seqOutput);

            string?            className      = GetEditorCssClass(new EditorInfo("ListBox", "select"), null);
            var                htmlAttributes = CreateHtmlAttributes(html, className);
            ViewDataDictionary viewData       = html.ViewData;

            IEnumerable <SelectListItem>?options = Options(viewData);

            SelectInstructions.SelectHelper(html, output, viewData.ModelMetadata, String.Empty, options, optionLabel: null, multiple: true, htmlAttributes: htmlAttributes);
        }
        public static void DecimalTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
        {
            ViewDataDictionary viewData = html.ViewData;

            if (viewData.TemplateInfo.FormattedModelValue == viewData.ModelMetadata.Model)
            {
                viewData.TemplateInfo.FormattedModelValue =
                    String.Format(CultureInfo.CurrentCulture, "{0:0.00}", viewData.ModelMetadata.Model);
            }

            HtmlInputTemplateHelper(html, package, seqOutput, "Decimal");
        }
Example #10
0
        public static void DecimalTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
        {
            ViewDataDictionary viewData = html.ViewData;

            if (viewData.TemplateInfo.FormattedModelValue == viewData.ModelMetadata.Model)
            {
                viewData.TemplateInfo.FormattedModelValue =
                    package.Context.SimpleContent.Format("{0:0.00}", viewData.ModelMetadata.Model);
            }

            StringTemplate(html, package, seqOutput);
        }
Example #11
0
        public static void ImageUrlTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
        {
            ViewDataDictionary viewData = html.ViewData;

            if (viewData.Model != null)
            {
                XcstWriter output = DocumentWriter.CastElement(package, seqOutput);

                output.WriteStartElement("img");
                output.WriteAttributeString("src", Convert.ToString(viewData.Model, CultureInfo.InvariantCulture));
                output.WriteEndElement();
            }
        }
Example #12
0
        internal static void DisplayTextHelper(HtmlHelper html, ISequenceWriter <string> output, ModelMetadata metadata)
        {
            string text = metadata.SimpleDisplayText;

            if (metadata.HtmlEncode)
            {
                output.WriteString(text);
            }
            else
            {
                output.WriteRaw(text);
            }
        }
Example #13
0
        public static void CheckBoxFor <TModel>(
            HtmlHelper <TModel> htmlHelper, IXcstPackage package, ISequenceWriter <XElement> output,
            Expression <Func <TModel, bool> > expression, HtmlAttribs?htmlAttributes = null)
        {
            if (expression is null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            ModelMetadata metadata         = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
            string        expressionString = ExpressionHelper.GetExpressionText(expression);

            CheckBoxForMetadata(htmlHelper, package, output, metadata, expressionString, /*isChecked: */ null, htmlAttributes);
        }
Example #14
0
 public static void DisplayFor <TModel, TValue>(
     HtmlHelper <TModel> html, IXcstPackage package, ISequenceWriter <object> output, Expression <Func <TModel, TValue> > expression,
     string?htmlFieldName = null, string?templateName = null, IList <string>?membersNames = null, object?additionalViewData = null) =>
 TemplateHelpers.TemplateFor(
     html,
     package,
     output,
     expression: expression,
     htmlFieldName: htmlFieldName,
     templateName: templateName,
     membersNames,
     DataBoundControlMode.ReadOnly,
     additionalViewData
     );
Example #15
0
 public static void DisplayForModel(
     HtmlHelper html, IXcstPackage package, ISequenceWriter <object> output,
     string?htmlFieldName = null, string?templateName = null, IList <string>?membersNames = null, object?additionalViewData = null) =>
 TemplateHelpers.TemplateHelper(
     html,
     package,
     output,
     html.ViewData.ModelMetadata,
     htmlFieldName: htmlFieldName,
     templateName: templateName,
     membersNames,
     DataBoundControlMode.ReadOnly,
     additionalViewData
     );
Example #16
0
 public static void Editor(
     HtmlHelper html, IXcstPackage package, ISequenceWriter <object> output, string expression,
     string?htmlFieldName = null, string?templateName = null, IList <string>?membersNames = null, object?additionalViewData = null) =>
 TemplateHelpers.Template(
     html,
     package,
     output,
     expression: expression,
     htmlFieldName: htmlFieldName,
     templateName: templateName,
     membersNames,
     DataBoundControlMode.Edit,
     additionalViewData
     );
Example #17
0
        public static void ColorInputTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
        {
            ViewDataDictionary viewData = html.ViewData;

            if (viewData.Model is Color color)
            {
                if (viewData.TemplateInfo.FormattedModelValue == viewData.ModelMetadata.Model)
                {
                    viewData.TemplateInfo.FormattedModelValue =
                        String.Format(CultureInfo.InvariantCulture, "#{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B);
                }
            }

            HtmlInputTemplateHelper(html, package, seqOutput, "Color", "color");
        }
Example #18
0
        static void CheckBoxForMetadata(
            HtmlHelper htmlHelper, IXcstPackage package, ISequenceWriter <XElement> output, ModelMetadata?metadata, string expression,
            bool?isChecked, HtmlAttribs?htmlAttributes)
        {
            object?model = metadata?.Model;

            if (isChecked is null &&
                model != null)
            {
                if (Boolean.TryParse(model.ToString(), out bool modelChecked))
                {
                    isChecked = modelChecked;
                }
            }

            CheckBoxHelper(htmlHelper, package, output, metadata, expression, isChecked, htmlAttributes);
        }
Example #19
0
        internal void RenderXcstView(ViewContext viewContext, ISequenceWriter <object> writer)
        {
            object?instance = null;

            Type type = BuildManager.GetCompiledType(this.ViewPath);

            if (type != null)
            {
                instance = Activator.CreateInstance(type);
            }

            if (instance is null)
            {
                throw new InvalidOperationException($"The view found at '{this.ViewPath}' was not created.");
            }

            RenderViewImpl(viewContext, t => t.OutputToRaw(writer), instance);
        }
Example #20
0
        static void CheckBoxHelper(
            HtmlHelper htmlHelper, IXcstPackage package, ISequenceWriter <XElement> output, ModelMetadata?metadata, string name, bool?isChecked, HtmlAttribs?htmlAttributes)
        {
            XcstWriter inputWriter  = DocumentWriter.CastElement(package, output);
            XcstWriter hiddenWriter = DocumentWriter.CastElement(package, output);

            bool explicitChecked = isChecked.HasValue;

            if (explicitChecked &&
                htmlAttributes != null &&
                htmlAttributes.ContainsKey("checked"))
            {
                htmlAttributes = htmlAttributes.Clone();
                htmlAttributes.Remove("checked"); // Explicit value must override dictionary
            }

            InputHelper(
                htmlHelper,
                inputWriter,
                InputType.CheckBox,
                metadata,
                name,
                value: "true",
                useViewData: !explicitChecked,
                isChecked: isChecked ?? false,
                setId: true,
                isExplicitValue: false,
                format: null,
                htmlAttributes: htmlAttributes);

            string fullName = Name(htmlHelper, name);

            // Render an additional <input type="hidden".../> for checkboxes. This
            // addresses scenarios where unchecked checkboxes are not sent in the request.
            // Sending a hidden input makes it possible to know that the checkbox was present
            // on the page when the request was submitted.

            hiddenWriter.WriteStartElement("input");
            hiddenWriter.WriteAttributeString("type", HtmlHelper.GetInputTypeString(InputType.Hidden));
            hiddenWriter.WriteAttributeString("name", fullName);
            hiddenWriter.WriteAttributeString("value", "false");
            hiddenWriter.WriteEndElement();
        }
Example #21
0
        public static void BooleanTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
        {
            XcstWriter output = DocumentWriter.CastElement(package, seqOutput);

            ViewDataDictionary viewData = html.ViewData;

            bool?value = null;

            if (viewData.Model != null)
            {
                value = Convert.ToBoolean(viewData.Model, CultureInfo.InvariantCulture);
            }

            if (viewData.ModelMetadata.IsNullableValueType)
            {
                output.WriteStartElement("select");

                string?className = DefaultEditorTemplates.GetEditorCssClass(new EditorInfo("Boolean", "select"), "list-box tri-state");

                HtmlAttributeHelper.WriteClass(className, null, output);
                HtmlAttributeHelper.WriteBoolean("disabled", true, output);

                foreach (SelectListItem item in DefaultEditorTemplates.TriStateValues(value))
                {
                    SelectInstructions.WriteOption(item, output);
                }

                output.WriteEndElement();
            }
            else
            {
                output.WriteStartElement("input");
                output.WriteAttributeString("type", "checkbox");

                string?className = DefaultEditorTemplates.GetEditorCssClass(new EditorInfo("Boolean", "input", InputType.CheckBox), "check-box");

                HtmlAttributeHelper.WriteClass(className, null, output);
                HtmlAttributeHelper.WriteBoolean("disabled", true, output);
                HtmlAttributeHelper.WriteBoolean("checked", value.GetValueOrDefault(), output);

                output.WriteEndElement();
            }
        }
Example #22
0
        public static void EnumTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
        {
            ViewDataDictionary viewData      = html.ViewData;
            ModelMetadata      modelMetadata = viewData.ModelMetadata;

            if (modelMetadata.Model != null)
            {
                if (modelMetadata.EditFormatString != null)
                {
                    // undo formatting if applicable to edit mode, for consistency with editor template
                    viewData.TemplateInfo.FormattedModelValue = modelMetadata.Model;
                }

                if (viewData.TemplateInfo.FormattedModelValue == modelMetadata.Model)
                {
#if ASPNETMVC
                    Type modelType = modelMetadata.ModelType;
                    Type enumType  = Nullable.GetUnderlyingType(modelType) ?? modelType;

                    if (enumType.IsEnum)
                    {
                        FieldInfo?enumField = enumType.GetField(modelMetadata.Model.ToString());

                        if (enumField != null)
                        {
                            viewData.TemplateInfo.FormattedModelValue =
                                DisplayNameUtil.GetFieldDisplayName(enumField);
                        }
                    }
#else
                    viewData.TemplateInfo.FormattedModelValue = modelMetadata.SimpleDisplayText;
#endif
                }
            }

            StringTemplate(html, package, seqOutput);
        }
Example #23
0
        internal static void CollectionTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput, TemplateHelpers.TemplateHelperDelegate templateHelper)
        {
            ViewDataDictionary viewData = html.ViewData;

            object?model = viewData.ModelMetadata.Model;

            if (model is null)
            {
                return;
            }

            IEnumerable collection = model as IEnumerable
                                     ?? throw new InvalidOperationException($"The Collection template was used with an object of type '{model.GetType().FullName}', which does not implement System.IEnumerable.");

            Type typeInCollection      = typeof(string);
            Type?genericEnumerableType = TypeHelpers.ExtractGenericInterface(collection.GetType(), typeof(IEnumerable <>));

            if (genericEnumerableType != null)
            {
                typeInCollection = genericEnumerableType.GetGenericArguments()[0];
            }

            bool typeInCollectionIsNullableValueType = TypeHelpers.IsNullableValueType(typeInCollection);

            string oldPrefix = viewData.TemplateInfo.HtmlFieldPrefix;

            try {
                viewData.TemplateInfo.HtmlFieldPrefix = String.Empty;

                string fieldNameBase = oldPrefix;
                int    index         = 0;

                foreach (object item in collection)
                {
                    Type itemType = typeInCollection;

                    if (item != null &&
                        !typeInCollectionIsNullableValueType)
                    {
                        itemType = item.GetType();
                    }

                    ModelMetadata metadata  = ModelMetadataProviders.Current.GetMetadataForType(() => item, itemType);
                    string        fieldName = String.Format(CultureInfo.InvariantCulture, "{0}[{1}]", fieldNameBase, index++);

                    templateHelper(
                        html,
                        package,
                        seqOutput,
                        metadata,
                        htmlFieldName: fieldName,
                        templateName: null,
                        membersNames: null,
                        DataBoundControlMode.ReadOnly,
                        additionalViewData: null
                        );
                }
            } finally {
                viewData.TemplateInfo.HtmlFieldPrefix = oldPrefix;
            }
        }
Example #24
0
 public static void CollectionTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput) =>
 CollectionTemplate(html, package, seqOutput, TemplateHelpers.TemplateHelper);
Example #25
0
 public static void CheckBox(
     HtmlHelper htmlHelper, IXcstPackage package, ISequenceWriter <XElement> output, string name, bool isChecked, HtmlAttribs?htmlAttributes = null) =>
 CheckBoxHelper(htmlHelper, package, output, default(ModelMetadata), name, isChecked, htmlAttributes);
Example #26
0
 public static void StringTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput) =>
 seqOutput.WriteString(package.Context.SimpleContent.Convert(html.ViewData.TemplateInfo.FormattedModelValue));
Example #27
0
        internal static void ObjectTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput, TemplateHelpers.TemplateHelperDelegate templateHelper)
        {
            ViewDataDictionary viewData      = html.ViewData;
            ModelMetadata      modelMetadata = viewData.ModelMetadata;

            if (modelMetadata.Model is null ||
                viewData.TemplateInfo.TemplateDepth > 1)
            {
                MetadataInstructions.DisplayTextHelper(html, seqOutput, modelMetadata);
                return;
            }

            var filteredProperties = DisplayInstructions.DisplayProperties(html);
            var groupedProperties  = filteredProperties.GroupBy(p => p.GroupName());

            bool createFieldset = groupedProperties.Any(g => g.Key != null);

            foreach (var group in groupedProperties)
            {
                XcstWriter?fieldsetWriter = null;

                if (createFieldset)
                {
                    fieldsetWriter = DocumentWriter.CastElement(package, seqOutput);

                    fieldsetWriter.WriteStartElement("fieldset");
                    fieldsetWriter.WriteStartElement("legend");
                    fieldsetWriter.WriteString(group.Key);
                    fieldsetWriter.WriteEndElement();
                }

                foreach (ModelMetadata propertyMeta in group)
                {
                    XcstWriter?fieldWriter = null;

                    if (!propertyMeta.HideSurroundingHtml)
                    {
                        XcstDelegate <object>?memberTemplate =
                            DisplayInstructions.MemberTemplate(html, propertyMeta);

                        if (memberTemplate != null)
                        {
                            memberTemplate(null !/* argument is not used */, fieldsetWriter ?? seqOutput);
                            continue;
                        }

                        XcstWriter labelWriter = fieldsetWriter
                                                 ?? DocumentWriter.CastElement(package, seqOutput);

                        labelWriter.WriteStartElement("div");
                        labelWriter.WriteAttributeString("class", "display-label");
                        labelWriter.WriteString(propertyMeta.GetDisplayName() ?? String.Empty);
                        labelWriter.WriteEndElement();

                        fieldWriter = fieldsetWriter
                                      ?? DocumentWriter.CastElement(package, seqOutput);

                        fieldWriter.WriteStartElement("div");
                        fieldWriter.WriteAttributeString("class", "display-field");
                    }

                    templateHelper(
                        html,
                        package,
                        fieldWriter ?? fieldsetWriter ?? seqOutput,
                        propertyMeta,
                        htmlFieldName: propertyMeta.PropertyName,
                        templateName: null,
                        membersNames: null,
                        DataBoundControlMode.ReadOnly,
                        additionalViewData: null
                        );

                    if (!propertyMeta.HideSurroundingHtml)
                    {
                        fieldWriter !.WriteEndElement(); // </div>
                    }
                }

                if (createFieldset)
                {
                    fieldsetWriter !.WriteEndElement(); // </fieldset>
                }
            }
        }
Example #28
0
 public static void HiddenInputTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput)
 {
     if (!html.ViewData.ModelMetadata.HideSurroundingHtml)
     {
         StringTemplate(html, package, seqOutput);
     }
 }
Example #29
0
 public static void DisplayTextFor <TModel, TResult>(HtmlHelper <TModel> html, ISequenceWriter <string> output, Expression <Func <TModel, TResult> > expression) =>
 DisplayTextHelper(html, output, ModelMetadata.FromLambdaExpression(expression, html.ViewData));
Example #30
0
        // display text

        public static void DisplayText(HtmlHelper html, ISequenceWriter <string> output, string name) =>
        DisplayTextHelper(html, output, ModelMetadata.FromStringExpression(name, html.ViewData));