Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions BlazingDev.BlazorToolkit/Components/BzObjectInspector.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
@page "/BzObjectInspector"
@using System.Reflection

<div class="bz-object-inspector">
@RenderObjectTree(ObjectToInspect)
</div>

@code {
[Parameter] public object ObjectToInspect { get; set; }

private RenderFragment RenderObjectTree(object obj) => builder =>
{
var properties = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var property in properties)
{
var value = property.GetValue(obj);
var isExpandable = value != null && !value.GetType().IsPrimitive && value.GetType() != typeof(string);

builder.OpenElement(0, "div");
builder.AddAttribute(1, "class", "bz-object-inspector-node");

if (isExpandable)
{
builder.OpenElement(2, "button");
builder.AddAttribute(3, "onclick", EventCallback.Factory.Create(this, () => ToggleExpandCollapse(property.Name)));
builder.AddContent(4, IsExpanded(property.Name) ? "-" : "+");
builder.CloseElement();
}

builder.AddContent(5, $"{property.Name}: {value}");

if (isExpandable && IsExpanded(property.Name))
{
builder.OpenElement(6, "div");
builder.AddAttribute(7, "class", "bz-object-inspector-children");
builder.AddContent(8, RenderObjectTree(value));
builder.CloseElement();
}

builder.CloseElement();
}
};

private HashSet<string> expandedNodes = new();

private void ToggleExpandCollapse(string nodeName)
{
if (expandedNodes.Contains(nodeName))
{
expandedNodes.Remove(nodeName);
}
else
{
expandedNodes.Add(nodeName);
}
}

private bool IsExpanded(string nodeName) => expandedNodes.Contains(nodeName);
}
58 changes: 58 additions & 0 deletions BlazingDev.BlazorToolkit/Components/BzObjectInspector.razor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
using Microsoft.AspNetCore.Components;
using System.Reflection;

namespace BlazingDev.BlazorToolkit.Components;

public partial class BzObjectInspector : ComponentBase
{
[Parameter] public object ObjectToInspect { get; set; }

private HashSet<string> expandedNodes = new();

private RenderFragment RenderObjectTree(object obj) => builder =>
{
var properties = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var property in properties)
{
var value = property.GetValue(obj);
var isExpandable = value != null && !value.GetType().IsPrimitive && value.GetType() != typeof(string);

builder.OpenElement(0, "div");
builder.AddAttribute(1, "class", "bz-object-inspector-node");

if (isExpandable)
{
builder.OpenElement(2, "button");
builder.AddAttribute(3, "onclick", EventCallback.Factory.Create(this, () => ToggleExpandCollapse(property.Name)));
builder.AddContent(4, IsExpanded(property.Name) ? "-" : "+");
builder.CloseElement();
}

builder.AddContent(5, $"{property.Name}: {value}");

if (isExpandable && IsExpanded(property.Name))
{
builder.OpenElement(6, "div");
builder.AddAttribute(7, "class", "bz-object-inspector-children");
builder.AddContent(8, RenderObjectTree(value));
builder.CloseElement();
}

builder.CloseElement();
}
};

private void ToggleExpandCollapse(string nodeName)
{
if (expandedNodes.Contains(nodeName))
{
expandedNodes.Remove(nodeName);
}
else
{
expandedNodes.Add(nodeName);
}
}

private bool IsExpanded(string nodeName) => expandedNodes.Contains(nodeName);
}
6 changes: 6 additions & 0 deletions Playground/AppFrame/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,11 @@
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> BzTimerComponents
</NavLink>
</div>

<div class="nav-item px-3">
<NavLink class="nav-link" href="BzObjectInspector">
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> BzObjectInspector
</NavLink>
</div>
</nav>
</div>
37 changes: 37 additions & 0 deletions Playground/Components/BzObjectInspectorUsage.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
@page "/BzObjectInspectorUsage"
@using BlazingDev.BlazorToolkit.Components

<MyCard>
<h3>Object Inspector Usage</h3>
<BzObjectInspector ObjectToInspect="@sampleObject" />
</MyCard>

@code {
private SampleObject sampleObject = new SampleObject
{
Name = "Sample Object",
Age = 30,
Address = new Address
{
Street = "123 Main St",
City = "Anytown",
State = "CA",
ZipCode = "12345"
}
};

private class SampleObject
{
public string Name { get; set; }
public int Age { get; set; }
public Address Address { get; set; }
}

private class Address
{
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
}
}
9 changes: 9 additions & 0 deletions Playground/Pages/BzObjectInspectorPage.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
@page "/BzObjectInspector"

<PageTitle>BzObjectInspector</PageTitle>

<h3>BzObjectInspector</h3>

<p>This page showcases the BzObjectInspector component in the Playground app.</p>

<BzObjectInspectorUsage />