158 lines
10 KiB
Plaintext
158 lines
10 KiB
Plaintext
@model StoryIntelligenceProgressViewModel
|
|
@{
|
|
ViewData["Title"] = "Review Plot Lines & Threads";
|
|
}
|
|
|
|
<section class="onboarding-shell" aria-labelledby="story-narrative-title">
|
|
<div class="onboarding-panel onboarding-review-panel story-review-page">
|
|
<partial name="_StoryIntelligencePipelineHeader" model="@(new StoryIntelligencePipelineHeaderViewModel { CurrentStage = "Review Plot Lines & Threads" })" />
|
|
<div class="onboarding-copy story-review-heading">
|
|
<p class="eyebrow">Phase 3</p>
|
|
<p class="story-review-heading__phase">Review Story Intelligence</p>
|
|
<h1 id="story-narrative-title">Review Plot Lines & Threads</h1>
|
|
<p>Review recurring narrative arcs and thread candidates from the discovered hierarchy.</p>
|
|
</div>
|
|
|
|
@if (TempData["OnboardingStoryIntelligenceError"] is string error)
|
|
{
|
|
<div class="alert alert-danger">@error</div>
|
|
}
|
|
@if (TempData["OnboardingStoryIntelligenceMessage"] is string message)
|
|
{
|
|
<div class="alert alert-success">@message</div>
|
|
}
|
|
|
|
<partial name="_StoryIntelligencePipelineSummary" model="Model.PipelineDashboard" />
|
|
|
|
@if (Model.NarrativeReview.Candidates.Count == 0)
|
|
{
|
|
<div class="story-review-note">
|
|
<strong>No Plot Line or Thread candidates are waiting.</strong>
|
|
<p class="mb-0">PlotDirector did not find recurring narrative candidates that require approval, or this review has already been completed.</p>
|
|
</div>
|
|
<form asp-action="ImportStoryIntelligenceNarrative" method="post" class="onboarding-actions" data-story-review-form>
|
|
<input type="hidden" name="BatchID" value="@Model.BatchID" />
|
|
<a class="btn btn-outline-secondary" asp-action="StoryIntelligenceReviewCentre" asp-route-batchId="@Model.BatchID">Back to Review Centre</a>
|
|
<button class="btn btn-primary" type="submit" data-busy-label="Saving plot lines...">Mark reviewed</button>
|
|
</form>
|
|
}
|
|
else
|
|
{
|
|
<form asp-action="ImportStoryIntelligenceNarrative" method="post" data-story-review-form>
|
|
<input type="hidden" name="BatchID" value="@Model.BatchID" />
|
|
<div class="story-character-card-grid">
|
|
@for (var i = 0; i < Model.NarrativeReview.Candidates.Count; i++)
|
|
{
|
|
var candidate = Model.NarrativeReview.Candidates[i];
|
|
<details class="story-character-card" open>
|
|
<summary>
|
|
<span>
|
|
<strong>@candidate.ProposedTitle</strong>
|
|
<small>@candidate.CandidateType @(!string.IsNullOrWhiteSpace(candidate.Category) ? $"- {candidate.Category}" : string.Empty)</small>
|
|
</span>
|
|
<em>@candidate.Confidence</em>
|
|
</summary>
|
|
<input type="hidden" name="Candidates[@i].NarrativeCandidateID" value="@candidate.NarrativeCandidateID" />
|
|
<input type="hidden" name="Candidates[@i].CandidateType" value="@candidate.CandidateType" />
|
|
<div class="story-character-card__body">
|
|
<div>
|
|
<label>Title</label>
|
|
<input class="form-control" name="Candidates[@i].Title" value="@candidate.ProposedTitle" maxlength="200" />
|
|
</div>
|
|
<div>
|
|
<label>Description</label>
|
|
<textarea class="form-control" name="Candidates[@i].Description" rows="3">@candidate.ProposedDescription</textarea>
|
|
</div>
|
|
@if (string.Equals(candidate.CandidateType, StoryIntelligenceNarrativeCandidateTypes.Thread, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
@if (!string.IsNullOrWhiteSpace(candidate.ParentCandidateTitle))
|
|
{
|
|
<p class="text-muted">Proposed parent: @candidate.ParentCandidateTitle</p>
|
|
}
|
|
<div>
|
|
<label>Existing related Plot Line</label>
|
|
<select class="form-select" name="Candidates[@i].RelatedPlotLineID">
|
|
<option value="">Choose Plot Line</option>
|
|
@foreach (var option in Model.NarrativeReview.PlotLineOptions)
|
|
{
|
|
<option value="@option.Value" selected="@(candidate.RelatedPlotLineID?.ToString() == option.Value)">@option.Text</option>
|
|
}
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<label>Proposed parent Plot Line</label>
|
|
<select class="form-select" name="Candidates[@i].ParentNarrativeCandidateID">
|
|
<option value="">No proposed parent</option>
|
|
@foreach (var option in Model.NarrativeReview.CandidatePlotLineOptions)
|
|
{
|
|
<option value="@option.Value" selected="@(candidate.ParentNarrativeCandidateID?.ToString() == option.Value)">@option.Text</option>
|
|
}
|
|
</select>
|
|
</div>
|
|
}
|
|
<fieldset>
|
|
<legend>Decision</legend>
|
|
<label><input type="radio" name="Candidates[@i].Action" value="@StoryIntelligenceNarrativeReviewActions.AcceptNew" checked="@(candidate.DefaultAction == StoryIntelligenceNarrativeReviewActions.AcceptNew)" /> Accept new</label>
|
|
<label><input type="radio" name="Candidates[@i].Action" value="@StoryIntelligenceNarrativeReviewActions.MergeExisting" checked="@(candidate.DefaultAction == StoryIntelligenceNarrativeReviewActions.MergeExisting)" /> Merge with existing</label>
|
|
<label><input type="radio" name="Candidates[@i].Action" value="@StoryIntelligenceNarrativeReviewActions.MergeCandidate" /> Merge with candidate</label>
|
|
<label><input type="radio" name="Candidates[@i].Action" value="@StoryIntelligenceNarrativeReviewActions.Reject" /> Reject</label>
|
|
</fieldset>
|
|
<div>
|
|
<label>Existing Plot Line for merge</label>
|
|
<select class="form-select" name="Candidates[@i].ExistingPlotLineID">
|
|
<option value="">Choose existing Plot Line</option>
|
|
@foreach (var option in Model.NarrativeReview.PlotLineOptions)
|
|
{
|
|
<option value="@option.Value" selected="@(candidate.ExistingPlotLineID?.ToString() == option.Value)">@option.Text</option>
|
|
}
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<label>Candidate for merge</label>
|
|
<select class="form-select" name="Candidates[@i].MergeTargetNarrativeCandidateID">
|
|
<option value="">Choose proposed candidate</option>
|
|
@foreach (var option in Model.NarrativeReview.Candidates.Where(item => item.NarrativeCandidateID != candidate.NarrativeCandidateID && string.Equals(item.CandidateType, candidate.CandidateType, StringComparison.OrdinalIgnoreCase)).Select(item => new SelectListItem(item.ProposedTitle, item.NarrativeCandidateID.ToString())))
|
|
{
|
|
<option value="@option.Value">@option.Text</option>
|
|
}
|
|
</select>
|
|
</div>
|
|
@if (candidate.ChildThreads.Count > 0)
|
|
{
|
|
<div class="story-review-note">
|
|
<strong>Suggested child Threads</strong>
|
|
<ul>
|
|
@foreach (var child in candidate.ChildThreads)
|
|
{
|
|
<li>@child.ProposedTitle</li>
|
|
}
|
|
</ul>
|
|
</div>
|
|
}
|
|
<div class="story-review-note">
|
|
<strong>Supporting scenes</strong>
|
|
<ul>
|
|
@foreach (var evidence in candidate.Evidence)
|
|
{
|
|
<li><strong>@evidence.SceneLabel</strong>: @(string.IsNullOrWhiteSpace(evidence.Evidence) ? evidence.ContributionType : evidence.Evidence)</li>
|
|
}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</details>
|
|
}
|
|
</div>
|
|
|
|
<div class="onboarding-actions">
|
|
<a class="btn btn-outline-secondary" asp-action="StoryIntelligenceReviewCentre" asp-route-batchId="@Model.BatchID">Back to Review Centre</a>
|
|
<button class="btn btn-primary" type="submit" data-busy-label="Saving plot lines...">Save Plot Lines & Threads</button>
|
|
</div>
|
|
</form>
|
|
}
|
|
</div>
|
|
</section>
|
|
|
|
@section Scripts {
|
|
<script src="~/js/story-review-actions.js" asp-append-version="true"></script>
|
|
}
|