@using Newtonsoft.Json @model UserResponsesViewModel @{ ViewData["Title"] = "User Response Details"; }
Back to List

Survey Summary

Progress Overview

User Progress Timeline

Response Timeline

Detailed view of all survey responses and interactions

@foreach (var response in Model.Responses.Select((r, index) => new { Response = r, Index = index })) {

@response.Response.Questionnaire.Title

Submitted: @response.Response.SubmissionDate.ToString("MMMM dd, yyyy 'at' HH:mm")
Questions: @response.Response.Questionnaire.Questions.Count()
@foreach (var question in response.Response.Questionnaire.Questions.OrderBy(q => q.Id)) { var responseDetail = response.Response.ResponseDetails.FirstOrDefault(rd => rd.QuestionId == question.Id); }
Question Status Response
@question.Text
@question.Type
@if (responseDetail != null) { @switch (responseDetail.Status) { case ResponseStatus.Answered:
Answered
Completed successfully
break; case ResponseStatus.Shown:
Shown
Displayed but not answered
break; case ResponseStatus.Skipped:
Skipped
@responseDetail.SkipReason
break; } } else {
Unknown
No response data
}
@if (responseDetail != null && responseDetail.Status == ResponseStatus.Answered) { @if (responseDetail.QuestionType == QuestionType.Text || responseDetail.QuestionType == QuestionType.Slider || responseDetail.QuestionType == QuestionType.Open_ended) {
Text Response
@responseDetail.TextResponse
} else if (responseDetail.ResponseAnswers.Any()) {
@foreach (var answer in responseDetail.ResponseAnswers) { var answerObj = question.Answers.FirstOrDefault(a => a.Id == answer.AnswerId); var answerText = answerObj?.Text; @answerText @if (answerObj?.IsOtherOption == true) { Other } }
} @* Display "Other" text if available *@ @if (!string.IsNullOrEmpty(responseDetail.OtherText)) {
Custom Response:
@responseDetail.OtherText
} } else {
No response provided
}
}
@section Scripts { }