@model ManuscriptScanReviewViewModel @{ ViewData["Title"] = "Review manuscript scan"; var probableCharacters = Model.CharacterCandidates .Where(candidate => string.Equals(candidate.Category, "ProbableCharacter", StringComparison.OrdinalIgnoreCase)) .ToList(); var possibleCharacters = Model.CharacterCandidates .Where(candidate => string.Equals(candidate.Category, "PossibleCharacter", StringComparison.OrdinalIgnoreCase)) .ToList(); var relationshipTitles = Model.CharacterCandidates .Where(candidate => string.Equals(candidate.Category, "RelationshipTitle", StringComparison.OrdinalIgnoreCase)) .ToList(); var excludedCharacters = Model.CharacterCandidates .Where(candidate => string.Equals(candidate.Category, "Excluded", StringComparison.OrdinalIgnoreCase)) .ToList(); var primaryCharacters = probableCharacters .Concat(possibleCharacters) .Concat(relationshipTitles) .ToList(); var detectedAliasTargets = Model.CharacterCandidates .Where(candidate => !string.Equals(candidate.Category, "Excluded", StringComparison.OrdinalIgnoreCase)) .OrderBy(candidate => candidate.ReviewName) .ToList(); var visibleCharacterCount = probableCharacters.Count + possibleCharacters.Count + relationshipTitles.Count; var isCharacterStep = string.Equals(ViewData["ScanReviewStep"] as string, "characters", StringComparison.OrdinalIgnoreCase); const int characterPageSize = 10; var primaryCharacterPageCount = Math.Max(1, (int)Math.Ceiling(primaryCharacters.Count / (double)characterPageSize)); var excludedCharacterPageCount = excludedCharacters.Any() ? (int)Math.Ceiling(excludedCharacters.Count / (double)characterPageSize) : 0; var characterReviewPageCount = primaryCharacterPageCount + excludedCharacterPageCount; var requestedCharacterPage = ViewData["CharacterReviewPage"] is int requestedPage ? requestedPage : 1; var characterPage = Math.Clamp(requestedCharacterPage, 1, characterReviewPageCount); var isExcludedCharacterPage = excludedCharacterPageCount > 0 && characterPage > primaryCharacterPageCount; var excludedPageIndex = isExcludedCharacterPage ? characterPage - primaryCharacterPageCount : 0; var currentCharacters = isExcludedCharacterPage ? excludedCharacters.Skip((excludedPageIndex - 1) * characterPageSize).Take(characterPageSize).ToList() : primaryCharacters.Skip((characterPage - 1) * characterPageSize).Take(characterPageSize).ToList(); var currentStep = isCharacterStep ? 7 + characterPage : 7; var totalSteps = 7 + characterReviewPageCount + 2; var characterPageTitle = isExcludedCharacterPage ? "Review Excluded Characters" : $"Review Characters {characterPage} of {primaryCharacterPageCount}"; }
@Html.AntiForgeryToken()

Step @currentStep of @totalSteps

@(isCharacterStep ? characterPageTitle : "Review Chapters")

@(isCharacterStep ? "Review this page of detected names and aliases, then continue through the wizard." : "Confirm the chapter and scene structure before reviewing detected characters.")

@if (TempData["OnboardingReviewMessage"] is string reviewMessage) {
@reviewMessage
} @if (!ViewData.ModelState.IsValid) { }
Chapters @Model.SelectedChapterCount / @Model.ChapterCount
Scenes @Model.SelectedSceneCount / @Model.SceneCount
Characters @Model.SelectedCharacterCount / @Model.CharacterCandidateCount
Words @Model.SelectedWordCount.ToString("N0")
@if (!isCharacterStep) {
}
@if (isCharacterStep) { @if (characterPage <= 1) { Back to chapters } else { } @if (characterPage < characterReviewPageCount) { } else { } } else { Back to setup }