csharp/Aaltuj/VxFormGenerator/VxFormGenerator.Core/RenderFormElements.cs

RenderFormElements.cs
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components.Rendering;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using VxFormGenerator.Core.Layout;
using VxFormGenerator.Core.Render;
using VxFormGenerator.Settings;

namespace VxFormGenerator.Core
{
    public clast RenderFormElements : OwningComponentBase
    {
        /// 
        /// Get the  instance. This instance will be used to fill out the values inputted by the user
        /// 
        [CascadingParameter] EditContext CascadedEditContext { get; set; }

        [Inject]
        IFormGeneratorOptions FormGeneratorOptions { get; set; }

        [Parameter] public Layout.VxFormLayoutOptions FormLayoutOptions { get; set; }

        /// 
        /// Override the default render method, determining if the  
        /// is a regular clast or a dynamic 
        /// 
        /// Instance of the page builder
        protected override void BuildRenderTree(RenderTreeBuilder builder)
        {
            base.BuildRenderTree(builder);

            var formDefinition = VxFormDefinition.CreateFromModel(CascadedEditContext.Model, FormLayoutOptions);

            builder.OpenComponent(0, typeof(CascadingValue));
            builder.AddAttribute(1, nameof(CascadingValue.Value), FormLayoutOptions);
            builder.AddAttribute(2, nameof(CascadingValue.ChildContent), new RenderFragment(_builder =>
            {
                var counter = 2;

                foreach (var group in formDefinition.Groups)
                {
                    _builder.OpenComponent(counter++, FormGeneratorOptions.FormGroupElement);
                    _builder.AddAttribute(counter++, nameof(VxFormGroupBase.FormGroupDefinition), group);
                    _builder.CloseComponent();
                }

            }));

            builder.CloseComponent();

        }

        protected override void OnInitialized()
        {
            base.OnInitialized();
            SetupFramework();
        }
        protected override void OnParametersSet()
        {
            base.OnParametersSet();
            SetupFramework();
        }

        private void SetupFramework()
        {
            if (FormGeneratorOptions.FieldCssClastProvider != null)
            {
                var provider = FormGeneratorOptions.FieldCssClastProvider as VxFormCssClastProviderBase;
                // Set the options in the custom FieldCssClastProvider
                provider.FormLayoutOptions = FormLayoutOptions;

                CascadedEditContext.SetFieldCssClastProvider(provider);
            }
            if (FormLayoutOptions == null)
            {
                FormLayoutOptions = (VxFormLayoutOptions)ScopedServices.GetService(typeof(Layout.VxFormLayoutOptions));
            }
        }



    }

}