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.SceneNoteTypeOptions = ChapterService.ToSelectList(noteTypes, x => x.SceneNoteTypeID, 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.PlotThreadOptions = ToOptionalSelectList(plotThreads, x => x.PlotThreadID, x => $"{x.PlotLineName}: {x.ThreadTitle}");
model.PlotLineEventOptions = plotLines;
@ -1307,18 +1304,6 @@ public sealed class SceneService(
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)
=> 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(),
WriteNext = await GetDashboardScenesAsync(projectIds, "WriteNext"),
ContinueWriting = await GetDashboardScenesAsync(projectIds, "ContinueWriting"),
NeedsAttention = await GetDashboardScenesAsync(projectIds, "NeedsAttention"),
RevisionQueue = await GetDashboardScenesAsync(projectIds, "RevisionQueue"),
PolishingQueue = await GetDashboardScenesAsync(projectIds, "PolishingQueue"),
StoryHealthReminders = await GetDashboardRemindersAsync(projectIds)
@ -3212,21 +3196,29 @@ public sealed class WriterWorkspaceService(
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,
DraftStatus = model.DraftStatus,
DraftStatus = existing.DraftStatus,
EstimatedWordCount = model.EstimatedWordCount,
ActualWordCount = model.ActualWordCount,
DraftedDate = model.DraftedDate,
LastWorkedOn = model.LastWorkedOn,
ReadyForDraft = model.ReadyForDraft,
ReadyForRevision = model.ReadyForRevision,
ReadyForPolish = model.ReadyForPolish,
ReadyForDraft = existing.ReadyForDraft,
ReadyForRevision = existing.ReadyForRevision,
ReadyForPolish = existing.ReadyForPolish,
IsBlocked = model.IsBlocked,
BlockedReason = model.BlockedReason,
Priority = model.Priority
Priority = priority
});
}
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 IReadOnlyList<SelectListItem> SceneNoteTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> SceneAttachmentTypeOptions { get; set; } = [];
public IReadOnlyList<SelectListItem> DraftStatusOptions { get; set; } = [];
public StorageUsage? StorageUsage { get; set; }
public int? ReturnProjectID { get; set; }
@ -317,7 +316,6 @@ public sealed class WriterDashboardViewModel
public IReadOnlyList<SelectListItem> ProjectOptions { get; set; } = [];
public IReadOnlyList<WriterDashboardScene> WriteNext { get; set; } = [];
public IReadOnlyList<WriterDashboardScene> ContinueWriting { get; set; } = [];
public IReadOnlyList<WriterDashboardScene> NeedsAttention { get; set; } = [];
public IReadOnlyList<WriterDashboardScene> RevisionQueue { get; set; } = [];
public IReadOnlyList<WriterDashboardScene> PolishingQueue { 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="ReturnBookID" value="@Model.ReturnBookID" />
<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">
<label class="form-label" for="Priority">Priority</label>
<div class="writer-priority-control">

View File

@ -77,7 +77,7 @@
<article class="writer-queue-card">
<div class="writer-queue-title">
<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 class="story-bible-meta">
@if (scene.Priority.HasValue) { <span>Priority @scene.Priority</span> }

View File

@ -40,17 +40,6 @@
<partial name="_WriterSceneQueue" model="Model.ContinueWriting" />
</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">
<div class="story-bible-section-heading">
<div>

View File

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