Phase 12D: Continuity Explorer Scene Navigation Integration.

This commit is contained in:
Nick Beckley 2026-06-14 19:56:33 +01:00
parent c7e02870cf
commit 9cc20ea266
3 changed files with 59 additions and 7 deletions

View File

@ -2638,6 +2638,7 @@ public sealed class StoryStateService(
LocationID = latest.LocationID,
CurrentLocation = latest.LocationPath ?? latest.LocationName ?? "Unknown",
State = latest.SceneID == currentSceneId ? "Explicit" : "Inferred",
LastConfirmedSceneID = latest.SceneID,
LastConfirmed = SceneLabel(latest.SceneNumber, latest.SceneTitle)
};
})
@ -2684,6 +2685,7 @@ public sealed class StoryStateService(
LocationID = latest.LocationID,
CurrentHolderOrLocation = latest.Label,
State = latest.SceneID == currentSceneId ? "Explicit" : "Inferred",
LastConfirmedSceneID = latest.SceneID,
LastConfirmed = scenesById.TryGetValue(latest.SceneID, out var scene)
? SceneLabel(scene.SceneNumber, scene.SceneTitle)
: "Unknown"

View File

@ -251,6 +251,7 @@ public sealed class CharacterStoryStateViewModel
public int? LocationID { get; set; }
public string CurrentLocation { get; set; } = "Unknown";
public string State { get; set; } = "Unknown";
public int? LastConfirmedSceneID { get; set; }
public string LastConfirmed { get; set; } = "Never";
}
@ -261,6 +262,7 @@ public sealed class AssetStoryStateViewModel
public int? LocationID { get; set; }
public string CurrentHolderOrLocation { get; set; } = "Unknown";
public string State { get; set; } = "Unknown";
public int? LastConfirmedSceneID { get; set; }
public string LastConfirmed { get; set; } = "Never";
}

View File

@ -181,7 +181,21 @@
<tbody>
@foreach (var row in Model.StoryState.Characters)
{
<tr><td>@row.CharacterName</td><td>@row.CurrentLocation</td><td><span class="badge @StateBadgeClass(row.State)">@row.State</span></td><td>@row.LastConfirmed</td></tr>
<tr>
<td>@row.CharacterName</td>
<td>@row.CurrentLocation</td>
<td><span class="badge @StateBadgeClass(row.State)">@row.State</span></td>
<td>
@if (row.LastConfirmedSceneID.HasValue)
{
<a asp-controller="Timeline" asp-action="Index" asp-route-projectId="@Model.Project.ProjectID" asp-route-selectedSceneId="@row.LastConfirmedSceneID">@row.LastConfirmed</a>
}
else
{
@row.LastConfirmed
}
</td>
</tr>
}
</tbody>
</table>
@ -197,7 +211,21 @@
<tbody>
@foreach (var row in Model.StoryState.Assets)
{
<tr><td>@row.AssetName</td><td>@row.CurrentHolderOrLocation</td><td><span class="badge @StateBadgeClass(row.State)">@row.State</span></td><td>@row.LastConfirmed</td></tr>
<tr>
<td>@row.AssetName</td>
<td>@row.CurrentHolderOrLocation</td>
<td><span class="badge @StateBadgeClass(row.State)">@row.State</span></td>
<td>
@if (row.LastConfirmedSceneID.HasValue)
{
<a asp-controller="Timeline" asp-action="Index" asp-route-projectId="@Model.Project.ProjectID" asp-route-selectedSceneId="@row.LastConfirmedSceneID">@row.LastConfirmed</a>
}
else
{
@row.LastConfirmed
}
</td>
</tr>
}
</tbody>
</table>
@ -271,7 +299,7 @@ else if (Model.Filter.DisplayMode == "Journey")
{
<td>@row.ChapterDisplayName</td>
}
<td>@row.SceneDisplayName</td>
<td><a asp-controller="Timeline" asp-action="Index" asp-route-projectId="@Model.Project.ProjectID" asp-route-selectedSceneId="@row.SceneID">@row.SceneDisplayName</a></td>
<td>@row.Location</td>
</tr>
}
@ -311,7 +339,7 @@ else if (Model.Filter.DisplayMode == "Journey")
{
<td>@row.ChapterDisplayName</td>
}
<td>@row.SceneDisplayName</td>
<td><a asp-controller="Timeline" asp-action="Index" asp-route-projectId="@Model.Project.ProjectID" asp-route-selectedSceneId="@row.SceneID">@row.SceneDisplayName</a></td>
<td>@row.HolderOrLocation</td>
</tr>
}
@ -363,7 +391,7 @@ else
{
<td>@row.ChapterDisplayName</td>
}
<td>@row.SceneDisplayName</td>
<td><a asp-controller="Timeline" asp-action="Index" asp-route-projectId="@Model.Project.ProjectID" asp-route-selectedSceneId="@row.SceneID">@row.SceneDisplayName</a></td>
<td>
@if (!row.Characters.Any())
{
@ -379,7 +407,17 @@ else
<span class="badge @StateBadgeClass(character.StateType)">@character.StateType</span>
@if (!string.IsNullOrWhiteSpace(character.LastConfirmedSceneDisplayName))
{
<small class="text-muted d-block">Last confirmed: @character.LastConfirmedSceneDisplayName</small>
<small class="text-muted d-block">
Last confirmed:
@if (character.LastConfirmedSceneID.HasValue)
{
<a asp-controller="Timeline" asp-action="Index" asp-route-projectId="@Model.Project.ProjectID" asp-route-selectedSceneId="@character.LastConfirmedSceneID">@character.LastConfirmedSceneDisplayName</a>
}
else
{
@character.LastConfirmedSceneDisplayName
}
</small>
}
</div>
}
@ -405,7 +443,17 @@ else
}
@if (!string.IsNullOrWhiteSpace(asset.LastConfirmedSceneDisplayName))
{
<small class="text-muted d-block">Last confirmed: @asset.LastConfirmedSceneDisplayName</small>
<small class="text-muted d-block">
Last confirmed:
@if (asset.LastConfirmedSceneID.HasValue)
{
<a asp-controller="Timeline" asp-action="Index" asp-route-projectId="@Model.Project.ProjectID" asp-route-selectedSceneId="@asset.LastConfirmedSceneID">@asset.LastConfirmedSceneDisplayName</a>
}
else
{
@asset.LastConfirmedSceneDisplayName
}
</small>
}
</div>
}