@@ -154,11 +154,240 @@ public string GetFieldValue(string fieldId)
154154 {
155155 if ( FormData . TryGetValue ( fieldId , out var value ) )
156156 {
157- return value ? . ToString ( ) ?? string . Empty ;
157+ if ( value == null )
158+ {
159+ return string . Empty ;
160+ }
161+
162+ // If it's already a string, return it
163+ if ( value is string stringValue )
164+ {
165+ return stringValue ;
166+ }
167+
168+ // If it's an object (like from autocomplete), serialize it to JSON
169+ try
170+ {
171+ return JsonSerializer . Serialize ( value ) ;
172+ }
173+ catch
174+ {
175+ return value . ToString ( ) ?? string . Empty ;
176+ }
158177 }
159178 return string . Empty ;
160179 }
161180
181+ public string GetFormattedFieldValue ( string fieldId )
182+ {
183+ var fieldValue = GetFieldValue ( fieldId ) ;
184+
185+ if ( string . IsNullOrEmpty ( fieldValue ) )
186+ {
187+ return string . Empty ;
188+ }
189+
190+ // Try to format as autocomplete data if it looks like JSON
191+ if ( fieldValue . StartsWith ( "{" ) || fieldValue . StartsWith ( "[" ) )
192+ {
193+ return FormatAutocompleteValue ( fieldValue ) ;
194+ }
195+
196+ return fieldValue ;
197+ }
198+
199+ public List < string > GetFormattedFieldValues ( string fieldId )
200+ {
201+ var fieldValue = GetFieldValue ( fieldId ) ;
202+
203+ if ( string . IsNullOrEmpty ( fieldValue ) )
204+ {
205+ return new List < string > ( ) ;
206+ }
207+
208+ // Try to format as autocomplete data if it looks like JSON
209+ if ( fieldValue . StartsWith ( "{" ) || fieldValue . StartsWith ( "[" ) )
210+ {
211+ return FormatAutocompleteValuesList ( fieldValue ) ;
212+ }
213+
214+ return new List < string > { fieldValue } ;
215+ }
216+
217+ public string GetFieldItemLabel ( string fieldId )
218+ {
219+ // Find the field in the template
220+ var field = Template ? . TaskGroups ?
221+ . SelectMany ( g => g . Tasks )
222+ . SelectMany ( t => t . Pages )
223+ . SelectMany ( p => p . Fields )
224+ . FirstOrDefault ( f => f . FieldId == fieldId ) ;
225+
226+ if ( field ? . ComplexField != null )
227+ {
228+ try
229+ {
230+ var complexField = JsonSerializer . Deserialize < Dictionary < string , object > > ( field . ComplexField ) ;
231+ if ( complexField ? . ContainsKey ( "properties" ) == true )
232+ {
233+ var properties = JsonSerializer . Deserialize < Dictionary < string , object > > ( complexField [ "properties" ] . ToString ( ) ) ;
234+ if ( properties ? . ContainsKey ( "label" ) == true )
235+ {
236+ return properties [ "label" ] . ToString ( ) ;
237+ }
238+ }
239+ }
240+ catch
241+ {
242+ // If parsing fails, return default
243+ }
244+ }
245+
246+ // Default label if not found in properties
247+ return "Item" ;
248+ }
249+
250+ public bool IsFieldAllowMultiple ( string fieldId )
251+ {
252+ // Find the field in the template
253+ var field = Template ? . TaskGroups ?
254+ . SelectMany ( g => g . Tasks )
255+ . SelectMany ( t => t . Pages )
256+ . SelectMany ( p => p . Fields )
257+ . FirstOrDefault ( f => f . FieldId == fieldId ) ;
258+
259+ if ( field ? . ComplexField != null )
260+ {
261+ try
262+ {
263+ var complexField = JsonSerializer . Deserialize < Dictionary < string , object > > ( field . ComplexField ) ;
264+ if ( complexField ? . ContainsKey ( "properties" ) == true )
265+ {
266+ var properties = JsonSerializer . Deserialize < Dictionary < string , object > > ( complexField [ "properties" ] . ToString ( ) ) ;
267+ if ( properties ? . ContainsKey ( "allowMultiple" ) == true )
268+ {
269+ return bool . Parse ( properties [ "allowMultiple" ] . ToString ( ) ) ;
270+ }
271+ }
272+ }
273+ catch
274+ {
275+ // If parsing fails, return default
276+ }
277+ }
278+
279+ return false ; // Default to single selection
280+ }
281+
282+ private string FormatAutocompleteValue ( string value )
283+ {
284+ if ( string . IsNullOrEmpty ( value ) )
285+ {
286+ return string . Empty ;
287+ }
288+
289+ try
290+ {
291+ using ( var doc = JsonDocument . Parse ( value ) )
292+ {
293+ if ( doc . RootElement . ValueKind == JsonValueKind . Array )
294+ {
295+ var displayValues = new List < string > ( ) ;
296+ foreach ( var element in doc . RootElement . EnumerateArray ( ) )
297+ {
298+ displayValues . Add ( FormatSingleAutocompleteValue ( element ) ) ;
299+ }
300+ return string . Join ( "<br />" , displayValues ) ;
301+ }
302+ else if ( doc . RootElement . ValueKind == JsonValueKind . Object )
303+ {
304+ return FormatSingleAutocompleteValue ( doc . RootElement ) ;
305+ }
306+ }
307+ }
308+ catch
309+ {
310+ // If not JSON, return as is
311+ }
312+
313+ return value ;
314+ }
315+
316+ private List < string > FormatAutocompleteValuesList ( string value )
317+ {
318+ if ( string . IsNullOrEmpty ( value ) )
319+ {
320+ return new List < string > ( ) ;
321+ }
322+
323+ try
324+ {
325+ using ( var doc = JsonDocument . Parse ( value ) )
326+ {
327+ if ( doc . RootElement . ValueKind == JsonValueKind . Array )
328+ {
329+ var displayValues = new List < string > ( ) ;
330+ foreach ( var element in doc . RootElement . EnumerateArray ( ) )
331+ {
332+ displayValues . Add ( FormatSingleAutocompleteValue ( element ) ) ;
333+ }
334+ return displayValues ;
335+ }
336+ else if ( doc . RootElement . ValueKind == JsonValueKind . Object )
337+ {
338+ return new List < string > { FormatSingleAutocompleteValue ( doc . RootElement ) } ;
339+ }
340+ }
341+ }
342+ catch
343+ {
344+ // If not JSON, return as single item
345+ }
346+
347+ return new List < string > { value } ;
348+ }
349+
350+ private string FormatSingleAutocompleteValue ( JsonElement element )
351+ {
352+ if ( element . ValueKind == JsonValueKind . Object )
353+ {
354+ string name = "" ;
355+ string ukprn = "" ;
356+
357+ if ( element . TryGetProperty ( "name" , out var nameProperty ) && nameProperty . ValueKind == JsonValueKind . String )
358+ {
359+ name = nameProperty . GetString ( ) ?? "" ;
360+ }
361+
362+ if ( element . TryGetProperty ( "ukprn" , out var ukprnProperty ) )
363+ {
364+ if ( ukprnProperty . ValueKind == JsonValueKind . String )
365+ {
366+ ukprn = ukprnProperty . GetString ( ) ?? "" ;
367+ }
368+ else if ( ukprnProperty . ValueKind == JsonValueKind . Number )
369+ {
370+ ukprn = ukprnProperty . GetInt64 ( ) . ToString ( ) ;
371+ }
372+ }
373+
374+ if ( ! string . IsNullOrEmpty ( name ) && ! string . IsNullOrEmpty ( ukprn ) )
375+ {
376+ return $ "{ System . Web . HttpUtility . HtmlEncode ( name ) } (UKPRN: { System . Web . HttpUtility . HtmlEncode ( ukprn ) } )";
377+ }
378+ else if ( ! string . IsNullOrEmpty ( name ) )
379+ {
380+ return System . Web . HttpUtility . HtmlEncode ( name ) ;
381+ }
382+ }
383+ else if ( element . ValueKind == JsonValueKind . String )
384+ {
385+ return System . Web . HttpUtility . HtmlEncode ( element . GetString ( ) ?? "" ) ;
386+ }
387+
388+ return System . Web . HttpUtility . HtmlEncode ( element . ToString ( ) ) ;
389+ }
390+
162391 public bool HasFieldValue ( string fieldId )
163392 {
164393 var value = GetFieldValue ( fieldId ) ;
0 commit comments