Phase 9A cleanup

This commit is contained in:
Nick Beckley 2026-06-12 20:43:19 +01:00
parent 42b5ed371c
commit b2cfcd08fa
6 changed files with 24 additions and 49 deletions

View File

@ -1159,9 +1159,6 @@ public sealed class SceneService(
model.StorageUsage = model.SceneID == 0 ? null : await storage.GetSceneStorageUsageAsync(model.SceneID); model.StorageUsage = model.SceneID == 0 ? null : await storage.GetSceneStorageUsageAsync(model.SceneID);
model.SceneNoteTypeOptions = ChapterService.ToSelectList(noteTypes, x => x.SceneNoteTypeID, x => x.TypeName); model.SceneNoteTypeOptions = ChapterService.ToSelectList(noteTypes, x => x.SceneNoteTypeID, x => x.TypeName);
model.SceneAttachmentTypeOptions = ChapterService.ToSelectList(attachmentTypes, x => x.SceneAttachmentTypeID, x => x.TypeName); model.SceneAttachmentTypeOptions = ChapterService.ToSelectList(attachmentTypes, x => x.SceneAttachmentTypeID, x => x.TypeName);
model.DraftStatusOptions = DraftStatuses()
.Select(x => new SelectListItem(x, x, string.Equals(x, model.Workflow.DraftStatus, StringComparison.OrdinalIgnoreCase)))
.ToList();
model.PlotLineOptions = ToOptionalSelectList(plotLines, x => x.PlotLineID, x => x.PlotLineName); model.PlotLineOptions = ToOptionalSelectList(plotLines, x => x.PlotLineID, x => x.PlotLineName);
model.PlotThreadOptions = ToOptionalSelectList(plotThreads, x => x.PlotThreadID, x => $"{x.PlotLineName}: {x.ThreadTitle}"); model.PlotThreadOptions = ToOptionalSelectList(plotThreads, x => x.PlotThreadID, x => $"{x.PlotLineName}: {x.ThreadTitle}");
model.PlotLineEventOptions = plotLines; model.PlotLineEventOptions = plotLines;
@ -1307,18 +1304,6 @@ public sealed class SceneService(
return model; return model;
} }
internal static IReadOnlyList<string> DraftStatuses() =>
[
"Planned",
"Ready To Draft",
"Drafting",
"Drafted",
"Revising",
"Polishing",
"Complete",
"On Hold"
];
private static IReadOnlyList<SelectListItem> ToOptionalSelectList<T>(IEnumerable<T> rows, Func<T, int> value, Func<T, string> text) private static IReadOnlyList<SelectListItem> ToOptionalSelectList<T>(IEnumerable<T> rows, Func<T, int> value, Func<T, string> text)
=> rows.Select(x => new SelectListItem(text(x), value(x).ToString())).ToList(); => rows.Select(x => new SelectListItem(text(x), value(x).ToString())).ToList();
@ -3153,7 +3138,6 @@ public sealed class WriterWorkspaceService(
ProjectOptions = projectRows.Select(x => new SelectListItem(x.ProjectName, x.ProjectID.ToString(), x.ProjectID == projectId)).ToList(), ProjectOptions = projectRows.Select(x => new SelectListItem(x.ProjectName, x.ProjectID.ToString(), x.ProjectID == projectId)).ToList(),
WriteNext = await GetDashboardScenesAsync(projectIds, "WriteNext"), WriteNext = await GetDashboardScenesAsync(projectIds, "WriteNext"),
ContinueWriting = await GetDashboardScenesAsync(projectIds, "ContinueWriting"), ContinueWriting = await GetDashboardScenesAsync(projectIds, "ContinueWriting"),
NeedsAttention = await GetDashboardScenesAsync(projectIds, "NeedsAttention"),
RevisionQueue = await GetDashboardScenesAsync(projectIds, "RevisionQueue"), RevisionQueue = await GetDashboardScenesAsync(projectIds, "RevisionQueue"),
PolishingQueue = await GetDashboardScenesAsync(projectIds, "PolishingQueue"), PolishingQueue = await GetDashboardScenesAsync(projectIds, "PolishingQueue"),
StoryHealthReminders = await GetDashboardRemindersAsync(projectIds) StoryHealthReminders = await GetDashboardRemindersAsync(projectIds)
@ -3212,21 +3196,29 @@ public sealed class WriterWorkspaceService(
RisksOrConcerns = model.RisksOrConcerns RisksOrConcerns = model.RisksOrConcerns
}); });
public Task SaveSceneWorkflowAsync(SceneWorkflowEditViewModel model) => writerWorkspace.SaveWorkflowAsync(new SceneWorkflow public async Task SaveSceneWorkflowAsync(SceneWorkflowEditViewModel model)
{
var existing = await writerWorkspace.GetWorkflowAsync(model.SceneID);
var priority = model.Priority.HasValue
? Math.Clamp(model.Priority.Value, 1, 10)
: (int?)null;
await writerWorkspace.SaveWorkflowAsync(new SceneWorkflow
{ {
SceneID = model.SceneID, SceneID = model.SceneID,
DraftStatus = model.DraftStatus, DraftStatus = existing.DraftStatus,
EstimatedWordCount = model.EstimatedWordCount, EstimatedWordCount = model.EstimatedWordCount,
ActualWordCount = model.ActualWordCount, ActualWordCount = model.ActualWordCount,
DraftedDate = model.DraftedDate, DraftedDate = model.DraftedDate,
LastWorkedOn = model.LastWorkedOn, LastWorkedOn = model.LastWorkedOn,
ReadyForDraft = model.ReadyForDraft, ReadyForDraft = existing.ReadyForDraft,
ReadyForRevision = model.ReadyForRevision, ReadyForRevision = existing.ReadyForRevision,
ReadyForPolish = model.ReadyForPolish, ReadyForPolish = existing.ReadyForPolish,
IsBlocked = model.IsBlocked, IsBlocked = model.IsBlocked,
BlockedReason = model.BlockedReason, BlockedReason = model.BlockedReason,
Priority = model.Priority Priority = priority
}); });
}
public Task<int> SaveNoteAsync(SceneNoteEditViewModel model) => writerWorkspace.SaveNoteAsync(new SceneNote public Task<int> SaveNoteAsync(SceneNoteEditViewModel model) => writerWorkspace.SaveNoteAsync(new SceneNote
{ {

View File

@ -217,7 +217,6 @@ public sealed class SceneEditViewModel
public SceneAttachmentEditViewModel NewAttachment { get; set; } = new(); public SceneAttachmentEditViewModel NewAttachment { get; set; } = new();
public IReadOnlyList<SelectListItem> SceneNoteTypeOptions { get; set; } = []; public IReadOnlyList<SelectListItem> SceneNoteTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> SceneAttachmentTypeOptions { get; set; } = []; public IReadOnlyList<SelectListItem> SceneAttachmentTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> DraftStatusOptions { get; set; } = [];
public StorageUsage? StorageUsage { get; set; } public StorageUsage? StorageUsage { get; set; }
public int? ReturnProjectID { get; set; } public int? ReturnProjectID { get; set; }
@ -317,7 +316,6 @@ public sealed class WriterDashboardViewModel
public IReadOnlyList<SelectListItem> ProjectOptions { get; set; } = []; public IReadOnlyList<SelectListItem> ProjectOptions { get; set; } = [];
public IReadOnlyList<WriterDashboardScene> WriteNext { get; set; } = []; public IReadOnlyList<WriterDashboardScene> WriteNext { get; set; } = [];
public IReadOnlyList<WriterDashboardScene> ContinueWriting { get; set; } = []; public IReadOnlyList<WriterDashboardScene> ContinueWriting { get; set; } = [];
public IReadOnlyList<WriterDashboardScene> NeedsAttention { get; set; } = [];
public IReadOnlyList<WriterDashboardScene> RevisionQueue { get; set; } = []; public IReadOnlyList<WriterDashboardScene> RevisionQueue { get; set; } = [];
public IReadOnlyList<WriterDashboardScene> PolishingQueue { get; set; } = []; public IReadOnlyList<WriterDashboardScene> PolishingQueue { get; set; } = [];
public IReadOnlyList<StoryBibleAttentionItem> StoryHealthReminders { get; set; } = []; public IReadOnlyList<StoryBibleAttentionItem> StoryHealthReminders { get; set; } = [];

View File

@ -1208,10 +1208,6 @@
<input type="hidden" name="ReturnProjectID" value="@Model.ReturnProjectID" /> <input type="hidden" name="ReturnProjectID" value="@Model.ReturnProjectID" />
<input type="hidden" name="ReturnBookID" value="@Model.ReturnBookID" /> <input type="hidden" name="ReturnBookID" value="@Model.ReturnBookID" />
<div class="row g-2"> <div class="row g-2">
<input type="hidden" name="DraftStatus" value="@Model.Workflow.DraftStatus" />
<input type="hidden" name="ReadyForDraft" value="false" />
<input type="hidden" name="ReadyForRevision" value="false" />
<input type="hidden" name="ReadyForPolish" value="false" />
<div class="col-12"> <div class="col-12">
<label class="form-label" for="Priority">Priority</label> <label class="form-label" for="Priority">Priority</label>
<div class="writer-priority-control"> <div class="writer-priority-control">

View File

@ -77,7 +77,7 @@
<article class="writer-queue-card"> <article class="writer-queue-card">
<div class="writer-queue-title"> <div class="writer-queue-title">
<h3>Scene @scene.SceneNumber: @scene.SceneTitle</h3> <h3>Scene @scene.SceneNumber: @scene.SceneTitle</h3>
<span class="status-pill">@(string.IsNullOrWhiteSpace(scene.RevisionStatusName) ? scene.DraftStatus : scene.RevisionStatusName)</span> <span class="status-pill">@scene.RevisionStatusName</span>
</div> </div>
<div class="story-bible-meta"> <div class="story-bible-meta">
@if (scene.Priority.HasValue) { <span>Priority @scene.Priority</span> } @if (scene.Priority.HasValue) { <span>Priority @scene.Priority</span> }

View File

@ -40,17 +40,6 @@
<partial name="_WriterSceneQueue" model="Model.ContinueWriting" /> <partial name="_WriterSceneQueue" model="Model.ContinueWriting" />
</section> </section>
<section class="writer-dashboard-panel">
<div class="story-bible-section-heading">
<div>
<p class="eyebrow">Practical blockers</p>
<h2>Needs Attention <help-icon key="workspace.practicalBlockers" /></h2>
</div>
<span class="soft-count">@Model.NeedsAttention.Count scenes</span>
</div>
<partial name="_WriterSceneQueue" model="Model.NeedsAttention" />
</section>
<section class="writer-dashboard-panel"> <section class="writer-dashboard-panel">
<div class="story-bible-section-heading"> <div class="story-bible-section-heading">
<div> <div>

View File

@ -15,7 +15,7 @@ else
<span class="eyebrow">@scene.BookTitle / Chapter @scene.ChapterNumber</span> <span class="eyebrow">@scene.BookTitle / Chapter @scene.ChapterNumber</span>
<h3>Scene @scene.SceneNumber: @scene.SceneTitle</h3> <h3>Scene @scene.SceneNumber: @scene.SceneTitle</h3>
</div> </div>
<span class="status-pill">@(string.IsNullOrWhiteSpace(scene.RevisionStatusName) ? scene.DraftStatus : scene.RevisionStatusName)</span> <span class="status-pill">@scene.RevisionStatusName</span>
</div> </div>
@if (!string.IsNullOrWhiteSpace(scene.Summary)) @if (!string.IsNullOrWhiteSpace(scene.Summary))
{ {