@model ProjectDetailViewModel @{ ViewData["Title"] = Model.Project.ProjectName; ViewData["ProjectSection"] = "Overview"; var summaryCards = new[] { ("Total Books", Model.Summary.TotalBooks.ToString("N0"), string.Empty), ("Published Books", Model.Summary.PublishedBooks.ToString("N0"), string.Empty), ("Drafting Books", Model.Summary.DraftingBooks.ToString("N0"), string.Empty), ("Planning Books", Model.Summary.PlanningBooks.ToString("N0"), string.Empty), ("Total Words", Model.Summary.TotalWords.ToString("N0"), string.Empty), ("Characters", Model.Summary.CharacterCount.ToString("N0"), string.Empty), ("Locations", Model.Summary.LocationCount.ToString("N0"), string.Empty), ("Active Plot Threads", Model.Summary.ActivePlotThreadCount.ToString("N0"), string.Empty), ("Issues to Review", Model.Summary.ContinuityWarningCount.ToString("N0"), Model.Summary.ContinuityWarningCount == 0 ? "dashboard-summary-calm" : Model.Summary.ContinuityWarningCount <= 10 ? "dashboard-summary-mild" : "dashboard-summary-attention") }; }

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
}

Series Progress

@Model.SeriesProgress.Percentage.ToString("0.#")% complete

@Model.SeriesProgress.SupportingLine

@Model.SeriesProgress.CalculationLabel

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")
}
}

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

}
}

Worth a look

@if (!Model.NeedsAttention.HasItems) {

Nothing urgent. This project is in good shape.

} 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.BookItems.Any()) {

Book setup

@foreach (var item in Model.NeedsAttention.BookItems) {
@item.Label
@item.BookTitle

@item.Message

}
} @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")

}
} }