11using Microsoft . AspNetCore . Components ;
2+ using Microsoft . AspNetCore . Components . Rendering ;
3+ using MudBlazor ;
4+ using System . Text . Json ;
25using System . Text . Json . Nodes ;
36
47namespace MudExtensions ;
@@ -22,4 +25,176 @@ public partial class MudJsonTreeViewNode : ComponentBase
2225 /// </summary>
2326 [ Parameter ]
2427 public bool Sorted { get ; set ; }
28+
29+
30+ /// <summary>
31+ /// Gets or sets a children text.
32+ /// </summary>
33+ [ Parameter ]
34+ public string Text { get ; set ; } = string . Empty ;
35+
36+ public RenderFragment RenderJsonItem ( KeyValuePair < string , JsonNode ? > item ) => builder =>
37+ {
38+ try
39+ {
40+ if ( item . Value is JsonValue )
41+ {
42+ var value = item . Value . AsValue ( ) ;
43+ var valueType = value . GetValue < JsonElement > ( ) . ValueKind ;
44+ GenerateItemBasedOnType ( valueType , item . Key , value , builder ) ;
45+ }
46+ else if ( item . Value is JsonArray )
47+ GenerateNestedComponent ( builder , item , Icons . Material . Filled . DataArray , "(Array)" ) ;
48+ else if ( item . Value is JsonObject )
49+ GenerateNestedComponent ( builder , item , Icons . Material . Filled . DataObject , "(Object)" ) ;
50+ else if ( item . Value is null )
51+ GenerateComponent ( builder , item . Key , "null" , Icons . Material . Filled . Block ) ;
52+ }
53+ catch ( Exception ex )
54+ {
55+ builder . OpenComponent < MudAlert > ( 0 ) ;
56+ builder . AddAttribute ( 1 , "Severity" , Severity . Warning ) ;
57+ builder . AddAttribute ( 2 , "ChildContent" , ( RenderFragment ) ( builder2 =>
58+ {
59+ builder2 . AddContent ( 3 , $ "Error rendering JSON item: { ex . Message } ") ;
60+ } ) ) ;
61+ builder . CloseComponent ( ) ;
62+ }
63+ } ;
64+
65+ public RenderFragment RenderJsonItem ( JsonNode ? node ) => builder =>
66+ {
67+ try
68+ {
69+ if ( node is JsonValue )
70+ {
71+ var value = node . AsValue ( ) ;
72+ var valueType = value . GetValue < JsonElement > ( ) . ValueKind ;
73+ GenerateItemBasedOnType ( valueType , Text , value , builder ) ;
74+ }
75+ else if ( node is JsonArray )
76+ GenerateNestedComponent ( builder , node , Icons . Material . Filled . DataArray , "(Array)" ) ;
77+ else if ( node is JsonObject )
78+ GenerateNestedComponent ( builder , node , Icons . Material . Filled . DataObject , "(Object)" ) ;
79+ else if ( node is null )
80+ GenerateComponent ( builder , node . ToString ( ) , "null" , Icons . Material . Filled . Block ) ;
81+ }
82+ catch ( Exception ex )
83+ {
84+ builder . OpenComponent < MudAlert > ( 0 ) ;
85+ builder . AddAttribute ( 2 , "Severity" , Severity . Warning ) ;
86+ builder . AddContent ( 1 , $ "Error rendering JSON item: { ex . Message } ") ;
87+ builder . CloseComponent ( ) ;
88+ }
89+ } ;
90+
91+ void GenerateItemBasedOnType ( JsonValueKind valueType , string text , JsonValue ? value , RenderTreeBuilder builder )
92+ {
93+ switch ( valueType )
94+ {
95+ case JsonValueKind . String :
96+ var str = value ? . GetValue < string > ( ) ;
97+ if ( DateTime . TryParse ( str , out DateTime date ) )
98+ GenerateComponent ( builder , text , date . ToString ( ) , Icons . Material . Filled . DateRange ) ;
99+ else if ( Guid . TryParse ( str , out Guid guid ) )
100+ GenerateComponent ( builder , text , str . ToUpperInvariant ( ) , Icons . Material . Filled . Key ) ;
101+ else
102+ GenerateComponent ( builder , text , str , Icons . Material . Filled . TextSnippet ) ;
103+ break ;
104+
105+ case JsonValueKind . Number :
106+ string endText = string . Empty ;
107+ if ( value . TryGetValue < int > ( out int intVal ) )
108+ {
109+ endText = intVal . ToString ( ) ;
110+ }
111+ else if ( value . TryGetValue < double > ( out double doubleVal ) )
112+ {
113+ endText = doubleVal . ToString ( ) ;
114+ }
115+ GenerateComponent ( builder , text , endText , Icons . Material . Filled . Numbers ) ;
116+ break ;
117+ case JsonValueKind . True :
118+ GenerateComponent ( builder , text , "true" , Icons . Material . Filled . CheckBox ) ;
119+ break ;
120+ case JsonValueKind . False :
121+ GenerateComponent ( builder , text , "false" , Icons . Material . Filled . CheckBoxOutlineBlank ) ;
122+ break ;
123+ }
124+ }
125+
126+ void GenerateComponent ( RenderTreeBuilder builder , string text , string endText , string icon )
127+ {
128+ builder . OpenComponent < MudTreeViewItem < string > > ( 0 ) ;
129+ builder . AddAttribute ( 1 , "Text" , text ) ;
130+ builder . AddAttribute ( 2 , "Icon" , icon ) ;
131+ builder . AddAttribute ( 3 , "EndText" , endText ) ;
132+ builder . CloseComponent ( ) ;
133+ }
134+
135+ void GenerateNestedComponent ( RenderTreeBuilder builder , KeyValuePair < string , JsonNode ? > item , string icon , string endText )
136+ {
137+ builder . OpenComponent < MudTreeViewItem < string > > ( 0 ) ;
138+ builder . AddAttribute ( 1 , "Text" , item . Key ) ;
139+ builder . AddAttribute ( 2 , "Icon" , icon ) ;
140+ builder . AddAttribute ( 3 , "IconColor" , Color . Primary ) ;
141+ builder . AddAttribute ( 4 , "EndText" , endText ) ;
142+ builder . AddAttribute ( 5 , "EndTextClass" , "mud-primary-text" ) ;
143+ builder . AddAttribute ( 6 , "ChildContent" , ( RenderFragment ) ( childBuilder =>
144+ {
145+ if ( item . Value . GetValueKind ( ) is JsonValueKind . Array )
146+ {
147+ int count = 0 ;
148+ foreach ( var childItem in item . Value . AsArray ( ) )
149+ {
150+ count ++ ;
151+ childBuilder . OpenComponent < MudJsonTreeViewNode > ( 0 ) ;
152+ childBuilder . AddAttribute ( 1 , "Node" , childItem ) ;
153+ childBuilder . AddAttribute ( 2 , "Text" , $ "{ count - 1 } ") ;
154+ childBuilder . CloseComponent ( ) ;
155+ }
156+ }
157+ else
158+ {
159+ childBuilder . OpenComponent < MudJsonTreeViewNode > ( 0 ) ;
160+ childBuilder . AddAttribute ( 1 , "Node" , item . Value ) ;
161+ childBuilder . AddAttribute ( 2 , "Text" , $ "{ item . Key } ") ;
162+ childBuilder . CloseComponent ( ) ;
163+ }
164+ } ) ) ;
165+ builder . CloseComponent ( ) ;
166+ }
167+
168+ void GenerateNestedComponent ( RenderTreeBuilder builder , JsonNode ? item , string icon , string endText )
169+ {
170+ builder . OpenComponent < MudTreeViewItem < string > > ( 0 ) ;
171+ builder . AddAttribute ( 1 , "Text" , item ) ;
172+ builder . AddAttribute ( 2 , "Icon" , icon ) ;
173+ builder . AddAttribute ( 3 , "IconColor" , Color . Primary ) ;
174+ builder . AddAttribute ( 4 , "EndText" , endText ) ;
175+ builder . AddAttribute ( 5 , "EndTextClass" , "mud-primary-text" ) ;
176+ builder . AddAttribute ( 6 , "ChildContent" , ( RenderFragment ) ( childBuilder =>
177+ {
178+ if ( item . GetValueKind ( ) is JsonValueKind . Array )
179+ {
180+ int count = 0 ;
181+ foreach ( var childItem in item . AsArray ( ) )
182+ {
183+ count ++ ;
184+ childBuilder . OpenComponent < MudJsonTreeViewNode > ( 0 ) ;
185+ childBuilder . AddAttribute ( 1 , "Node" , childItem ) ;
186+ childBuilder . AddAttribute ( 2 , "Text" , $ "{ count - 1 } ") ;
187+ childBuilder . CloseComponent ( ) ;
188+ }
189+ }
190+ else
191+ {
192+ childBuilder . OpenComponent < MudJsonTreeViewNode > ( 0 ) ;
193+ childBuilder . AddAttribute ( 1 , "Node" , item ) ;
194+ childBuilder . AddAttribute ( 2 , "Text" , $ "{ item } ") ;
195+ childBuilder . CloseComponent ( ) ;
196+ }
197+ } ) ) ;
198+ builder . CloseComponent ( ) ;
199+ }
25200}
0 commit comments