@model AnalyticsViewModel
@{
ViewData["Title"] = "Story Health";
var openThreads = Model.ThreadHealth.Where(x => x.IsOpenStatus).ToList();
var dormantThreads = Model.ThreadHealth.Where(x => x.IsDormant).ToList();
var unresolvedAssets = Model.AssetHealth.Where(x => !x.IsResolved).ToList();
var metricScenes = Model.MetricGraphs
.SelectMany(graph => graph.Points)
.GroupBy(point => point.SceneID)
.Select(group => group.OrderBy(point => point.GlobalSceneIndex).First())
.OrderBy(point => point.GlobalSceneIndex)
.Select(point => new
{
sceneId = point.SceneID,
axisLabel = $"{point.ChapterNumber:g}.{point.SceneNumber:g}",
chapterLabel = $"Chapter {point.ChapterNumber:g}",
sceneNumber = point.SceneNumber.ToString("g"),
sceneTitle = point.SceneTitle,
bookTitle = point.BookTitle,
timelineUrl = Url.Action("Index", "Timeline", new { projectId = Model.Project.ProjectID, bookId = point.BookID, selectedSceneId = point.SceneID })
})
.ToList();
var metricShapePayload = new
{
scenes = metricScenes,
metrics = Model.MetricGraphs.Select(graph => new
{
metricName = graph.MetricName,
points = graph.Points.Select(point => new { sceneId = point.SceneID, value = point.Value })
})
};
}
Analytics / Story health
Add scene metrics to begin seeing peaks and troughs across the story.
} else {Compare selected pacing and emotional metrics across scenes in narrative order. Click a point to open that scene on the timeline.
Metric chart could not load. The raw metric rows are still available below.
No sustained pacing runs found in this scope.
} else { @foreach (var note in Model.PacingReviewNotes) {@note.ReviewNote
Ch @chapter.ChapterNumber: @chapter.ChapterTitle has @chapter.POVCount POVs.
}Busy scene: Ch @busy.ChapterNumber / Scene @busy.SceneNumber has @busy.CharacterCount characters.
}