1
1
using Microsoft . AspNetCore . Components ;
2
+ using Microsoft . AspNetCore . Components . Rendering ;
3
+ using MudBlazor ;
4
+ using System . Text . Json ;
2
5
using System . Text . Json . Nodes ;
3
6
4
7
namespace MudExtensions ;
@@ -22,4 +25,176 @@ public partial class MudJsonTreeViewNode : ComponentBase
22
25
/// </summary>
23
26
[ Parameter ]
24
27
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
+ }
25
200
}
0 commit comments