@model ProjectDetailViewModel @{ ViewData["Title"] = Model.Project.ProjectName; ViewData["ProjectSection"] = "Overview"; var summaryCards = new[] { ("Total Books", Model.Summary.TotalBooks.ToString("N0")), ("Published Books", Model.Summary.PublishedBooks.ToString("N0")), ("Drafting Books", Model.Summary.DraftingBooks.ToString("N0")), ("Planning Books", Model.Summary.PlanningBooks.ToString("N0")), ("Total Words", Model.Summary.TotalWords.ToString("N0")), ("Characters", Model.Summary.CharacterCount.ToString("N0")), ("Locations", Model.Summary.LocationCount.ToString("N0")), ("Active Plot Threads", Model.Summary.ActivePlotThreadCount.ToString("N0")), ("Continuity Warnings", Model.Summary.ContinuityWarningCount.ToString("N0")) }; }

Series Dashboard

@Model.Project.ProjectName

@if (!string.IsNullOrWhiteSpace(Model.Project.Description)) {

@Model.Project.Description

}
Edit project Add book
@if (TempData["ProjectExportMessage"] is string projectExportMessage) {
@projectExportMessage
}
@foreach (var card in summaryCards) {

@card.Item1

@card.Item2
}

Recent Activity

View all
@if (!Model.RecentActivity.Any()) {

No project activity has been recorded yet.

} else {
@foreach (var item in Model.RecentActivity) {
@item.IconLabel
@item.ActivityType @item.EntityType @item.TimeLabel
@if (!string.IsNullOrWhiteSpace(item.EntityName)) {

@item.EntityName

} @if (!string.IsNullOrWhiteSpace(item.Description)) {

@item.Description

}

@item.UserLabel

}
}

Needs Attention

@if (!Model.NeedsAttention.HasItems) {

Nothing needs attention right now.

} else { @if (Model.NeedsAttention.Warnings.Any()) {

Continuity warnings

Review
@foreach (var warning in Model.NeedsAttention.Warnings) {
@warning.SeverityName @warning.WarningTypeName

@warning.Message

@if (!string.IsNullOrWhiteSpace(warning.LocationLabel)) {

@warning.LocationLabel

}
}
} @if (Model.NeedsAttention.Threads.Any()) {

Plot threads

Review
@foreach (var thread in Model.NeedsAttention.Threads) {
@thread.AttentionLabel Importance @thread.Importance
@thread.ThreadTitle

@thread.PlotLineName / @thread.ThreadStatusName

}
} @if (Model.NeedsAttention.ShowMissingSchedulePrompt) {
No active writing schedule

Create a schedule when you are ready to plan writing sessions.

Set up
} @if (Model.NeedsAttention.OverdueBooks.Any()) {

Overdue target dates

@foreach (var book in Model.NeedsAttention.OverdueBooks) {
@book.BookTitle

Target completion was @book.TargetCompletionDate.ToString("dd MMM yyyy")

}
} }

Books

Add book
@if (!Model.Books.Any()) {

No books yet

Add the first book to begin shaping this series.

} else {
@foreach (var book in Model.Books) {
Cover for @book.BookTitle

Book @book.BookNumber

@book.BookTitle

@if (!string.IsNullOrWhiteSpace(book.Subtitle)) {

@book.Subtitle

}
@book.Status

@book.WordCountLabel

@if (book.ProgressPercentage.HasValue) { var progressValue = Math.Round(book.ProgressPercentage.Value);
}
@book.ChapterCount.ToString("N0") chapters @book.SceneCount.ToString("N0") scenes Modified @book.UpdatedDate.ToString("dd MMM yyyy")
}
}