PlotDirector/PlotLine/Views/Onboarding/StoryIntelligence.cshtml

106 lines
4.8 KiB
Plaintext

@model StoryIntelligenceOverviewViewModel
@{
ViewData["Title"] = "Ready to analyse manuscript";
}
<section class="onboarding-shell" aria-labelledby="story-intelligence-title">
<div class="onboarding-panel onboarding-analysis-panel">
<partial name="_OnboardingJourneyHeader" model="@(new OnboardingJourneyHeaderViewModel { CurrentStep = Model.WizardCurrentStep, TotalSteps = Model.WizardTotalSteps })" />
<div class="onboarding-copy">
<p class="eyebrow">Step @Model.WizardCurrentStep of @Model.WizardTotalSteps</p>
<h1 id="story-intelligence-title">Ready to Analyse Manuscript <help-icon key="storyIntelligence.overview" /></h1>
<p>Review the approved manuscript scope before setting final story and portrait context.</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>
}
@if (Model.ExistingBatchID.HasValue)
{
<section class="onboarding-story-card">
<h2>Analysis has already started <help-icon key="storyIntelligence.analysisStarted" /></h2>
<p>You can return to progress or open the Review Centre when analysis is ready.</p>
<div class="onboarding-actions">
<a class="btn btn-primary" asp-controller="Books" asp-action="Details" asp-route-id="@Model.BookID">Return to book</a>
<form asp-action="ScanManuscript" method="post">
<button class="btn btn-outline-secondary" type="submit">Scan manuscript again</button>
</form>
</div>
</section>
}
else
{
<div class="onboarding-story-facts">
<div>
<span>Chapters</span>
<strong>@Model.ApprovedChapterCount</strong>
<p>Approved chapters from your manuscript review.</p>
</div>
<div>
<span>Words</span>
<strong>@Model.ApprovedWordCount.ToString("N0")</strong>
<p>Chapter text ready for analysis.</p>
</div>
<div>
<span>Estimated time</span>
<strong>@EstimateDuration(Model.ApprovedWordCount)</strong>
<p>The analysis runs in the background, so you can leave this page and return later.</p>
</div>
<div>
<span>Review</span>
<strong>You approve creation</strong>
<p>After analysis, unresolved character identities are handled first, then optional review categories are available later.</p>
</div>
</div>
@if (!string.IsNullOrWhiteSpace(Model.Message))
{
<section class="onboarding-form-section onboarding-form-section--quiet">
<p>@Model.Message</p>
@if (Model.MissingChapterTextCount > 0)
{
<p class="text-danger">@Model.MissingChapterTextCount chapter(s) do not include scanned text. Scan the manuscript again before analysing.</p>
}
</section>
}
<div class="onboarding-analysis-flow">
<div><span>1</span><strong>Analyse chapters</strong></div>
<div><span>2</span><strong>Analyse canonical scenes</strong></div>
<div><span>3</span><strong>Resolve characters</strong></div>
<div><span>4</span><strong>Open Review Centre</strong></div>
</div>
<div class="onboarding-actions">
<a class="btn btn-outline-secondary" asp-action="ScanReview" asp-route-previewId="@Model.PreviewID">Back to scan review</a>
<a class="btn btn-primary @(Model.CanStart ? string.Empty : "disabled")" asp-action="StoryIntelligenceContext" aria-disabled="@(!Model.CanStart)">Next</a>
</div>
<div class="onboarding-actions onboarding-actions--secondary">
<form asp-action="SkipStoryIntelligence" method="post">
<button class="btn btn-outline-secondary" type="submit">Skip for now</button>
</form>
</div>
}
</div>
</section>
@functions {
private static string EstimateDuration(int wordCount)
{
if (wordCount <= 0)
{
return "A few minutes";
}
var minutes = Math.Clamp((int)Math.Ceiling(wordCount / 3000m) * 2, 2, 30);
return minutes <= 2 ? "About 2 minutes" : $"About {minutes:N0} minutes";
}
}