@camachohoraciogmail-com

@camachohoraciogmail-com

Forum Replies Created

Viewing 1 post (of 1 total)
  • Author
    Posts
  • in reply to: Dynamically Add Blazor Component into Docking Layout #102476
    horacio camacho
    Participant

    Hello,

    With the example above a single docking item can be added dynamically. I tried to add multiple items dynamically (see example), but only the last item added renders its custom content.

    Thank you,

    Horacio

    <hr />

    <style>
        smart-docking-layout {
            width: 100%;
            height: 500px;
            max-width: 1000px;
            background-color: #EEEDF3;
        }
     
            smart-docking-layout .smart-items-container smart-splitter-item.smart-element,
            smart-docking-layout .smart-items-container > .smart-container > smart-splitter-item.smart-element {
                width: 50%;
                height: 50%;
            }
     
            smart-docking-layout smart-tabs-window smart-slider.smart-element,
            smart-docking-layout smart-tabs-window smart-multiline-text-box.smart-element {
                height: 100%;
                width: 100%;
            }
     
            smart-docking-layout smart-tabs-window smart-multiline-text-box.smart-element {
                display: block;
            }
    </style>
    <DockingLayout OnReady="OnReady" Layout=@layoutStructure>
    </DockingLayout>
    @foreach (var label in _labels)
    {
        <div id="@label">
            "@label"
        </div>
    }
    <Button @onclick="InjectBlazorComponent">Inject Component</Button>
    @code {
        private List<object> layoutStructureTmp = new List<object>();
        private List<object> layoutStructure = new List<object> {
            new {
                type = "LayoutGroup",
                orientation = "horizontal",
                items = new object[0]
            }
        };
        private bool doRender;
     
        private RenderFragment DynamicRender { get; set; }
        private void OnReady(DockingLayout dockingLayout)
        {
        }
     
        private RenderFragment CreateDynamicComponent() => builder =>
        {
            builder.OpenComponent(0, typeof(SurveyPrompt));
            builder.AddAttribute(1, "Title", "Some title");
            builder.CloseComponent();
        };
     
        protected override void OnAfterRender(bool firstRender)
        {
            if (doRender)
            {
                layoutStructure = layoutStructureTmp.ToList();
                InvokeAsync(StateHasChanged).Wait();
            }
            doRender = false;
        }
     
        int labelCounter = 0;
        List<string> _labels = new List<string>();
        private void InjectBlazorComponent(MouseEventArgs e)
        {
            DynamicRender = CreateDynamicComponent();
            layoutStructureTmp = layoutStructure.ToList();
            labelCounter++;
     
            var label = "Custom" + labelCounter;
            if (!_labels.Contains(label))
            {
                _labels.Add(label);
            }
            layoutStructureTmp.Add(
                new
                {
                    id = "item" + labelCounter,
                    label = "Tabs" + labelCounter,
                    items = new object[]{
                            new {
                                label = "Tab " + labelCounter,
                                content = "#" + label
                            }
                                                                                                                                                                                                                                            }
                }
            );
            doRender = true;
        }
    }

     

Viewing 1 post (of 1 total)