@model StoryIntelligenceProgressViewModel @{ ViewData["Title"] = "Review locations"; const int previewLimit = 50; var showAll = string.Equals(Context.Request.Query["view"], "all", StringComparison.OrdinalIgnoreCase); var locationCandidates = showAll ? Model.LocationReview.Candidates.ToList() : Model.LocationReview.Candidates.Take(previewLimit).ToList(); var hiddenCandidateCount = Math.Max(0, Model.LocationReview.Candidates.Count - locationCandidates.Count); } Phase 3 Review Story Intelligence Review Locations Review place suggestions that need a create, link, alias, or ignore decision. @if (TempData["OnboardingStoryIntelligenceError"] is string error) { @error } @if (TempData["OnboardingStoryIntelligenceMessage"] is string message) { @message } @if (Model.LocationReview.Candidates.Count == 0) { No location decisions are waiting. Locations are already up to date, or there were no location suggestions ready to import. @FutureStage("Assets") @FutureStage("Relationships") @FutureStage("Knowledge") @FutureStage("Plot Lines & Threads") Back to Review Centre } else { @if (hiddenCandidateCount > 0) { View all @Model.LocationReview.Candidates.Count.ToString("N0") } Create all Link existing matches Ignore all Expand all Collapse all @for (var i = 0; i < locationCandidates.Count; i++) { var candidate = locationCandidates[i]; @candidate.LocationName @candidate.Category ยท @candidate.AppearsInScenes.ToString("N0") scene@(candidate.AppearsInScenes == 1 ? string.Empty : "s") @candidate.Confidence First appearance@Display(candidate.ExampleFirstAppearance) Parent hint@Display(candidate.ParentLocationHint) Existing match@(candidate.ExistingLocationName ?? "None") @if (!string.IsNullOrWhiteSpace(candidate.ExampleContext)) { Scene context @candidate.ExampleContext } @if (candidate.IsExistingMatch) { Possible existing location @candidate.LocationName may already be @candidate.ExistingLocationName. Choose whether to link them or create a separate location. } Decision Create new location Link existing location Alias of another location Ignore Import name Alias/variant target Choose location... @foreach (var target in Model.LocationReview.Candidates.Where(target => !string.Equals(target.Key, candidate.Key, StringComparison.OrdinalIgnoreCase))) { @target.LocationName@(target.IsExistingMatch ? $" -> {target.ExistingLocationName}" : string.Empty) } } @if (hiddenCandidateCount > 0) { @hiddenCandidateCount.ToString("N0") more location decision@(hiddenCandidateCount == 1 ? string.Empty : "s") available after this batch. } Back to Review Centre Save location decisions } @section Scripts { } @functions { private static string Display(string? value) => string.IsNullOrWhiteSpace(value) ? "Not detected" : value; private static Microsoft.AspNetCore.Html.IHtmlContent FutureStage(string label) => new Microsoft.AspNetCore.Html.HtmlString($"{System.Net.WebUtility.HtmlEncode(label)}Available from Review Centre"); }
Phase 3
Review Story Intelligence
Review place suggestions that need a create, link, alias, or ignore decision.
Locations are already up to date, or there were no location suggestions ready to import.
@candidate.ExampleContext
@candidate.LocationName may already be @candidate.ExistingLocationName. Choose whether to link them or create a separate location.