From cfe95a510f49a1c246ba313017e16b0eace19325 Mon Sep 17 00:00:00 2001 From: Nick Beckley Date: Sun, 14 Jun 2026 17:18:18 +0100 Subject: [PATCH] Bug fix: Writer Workspace Focus project filter is ignored --- PlotLine/Controllers/WriterController.cs | 2 +- PlotLine/Data/Repositories.cs | 21 ++++++++++++--------- PlotLine/Services/CoreServices.cs | 16 ++++++++-------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/PlotLine/Controllers/WriterController.cs b/PlotLine/Controllers/WriterController.cs index 34d90df..268f9d8 100644 --- a/PlotLine/Controllers/WriterController.cs +++ b/PlotLine/Controllers/WriterController.cs @@ -13,7 +13,7 @@ public sealed class WriterController( public async Task Index(int? projectId) { var model = await writerWorkspace.GetDashboardAsync(projectId); - model.WritingSchedule = await writingSchedule.GetTodayDashboardAsync(); + model.WritingSchedule = await writingSchedule.GetTodayDashboardAsync(projectId); return View(model); } diff --git a/PlotLine/Data/Repositories.cs b/PlotLine/Data/Repositories.cs index 6b684fc..db2226f 100644 --- a/PlotLine/Data/Repositories.cs +++ b/PlotLine/Data/Repositories.cs @@ -289,12 +289,12 @@ public interface IWritingScheduleRepository Task> GetWritingPlansForManagementAsync(int userId); Task> GetSchedulingScenesAsync(int projectId, int? bookId, bool includeBlockedScenes); Task ReplaceScheduleItemsAsync(int writingPlanId, IReadOnlyList items); - Task> GetWritingPlanSummariesByUserAsync(int userId); + Task> GetWritingPlanSummariesByUserAsync(int userId, int? projectId = null); Task> GetSchedulePreviewItemsAsync(int writingPlanId); Task DeleteScheduleItemsByPlanAsync(int writingPlanId); - Task> GetActiveScheduleDashboardItemsAsync(int userId); + Task> GetActiveScheduleDashboardItemsAsync(int userId, int? projectId = null); Task UpdatePlannedScheduleItemStatusForUserAsync(int writingScheduleItemId, int userId, string scheduleStatus, DateTime? completedDateUtc); - Task> GetPlansRequiringRebalanceAsync(int userId, DateTime today); + Task> GetPlansRequiringRebalanceAsync(int userId, DateTime today, int? projectId = null); Task UpdatePlannedScheduleItemDatesAsync(int writingPlanId, IReadOnlyList changes); } @@ -1141,7 +1141,7 @@ public sealed class WritingScheduleRepository(ISqlConnectionFactory connectionFa } } - public async Task> GetWritingPlanSummariesByUserAsync(int userId) + public async Task> GetWritingPlanSummariesByUserAsync(int userId, int? projectId = null) { using var connection = connectionFactory.CreateConnection(); var rows = await connection.QueryAsync( @@ -1159,9 +1159,10 @@ public sealed class WritingScheduleRepository(ISqlConnectionFactory connectionFa INNER JOIN dbo.Projects p ON p.ProjectID = wp.ProjectID LEFT JOIN dbo.Books b ON b.BookID = wp.BookID WHERE wp.UserID = @UserID + AND (@ProjectID IS NULL OR wp.ProjectID = @ProjectID) ORDER BY wp.IsActive DESC, wp.DeadlineDate, wp.PlanName, wp.WritingPlanID; """, - new { UserID = userId }); + new { UserID = userId, ProjectID = projectId }); return rows.ToList(); } @@ -1206,7 +1207,7 @@ public sealed class WritingScheduleRepository(ISqlConnectionFactory connectionFa new { WritingPlanID = writingPlanId }); } - public async Task> GetActiveScheduleDashboardItemsAsync(int userId) + public async Task> GetActiveScheduleDashboardItemsAsync(int userId, int? projectId = null) { using var connection = connectionFactory.CreateConnection(); var rows = await connection.QueryAsync( @@ -1237,9 +1238,10 @@ public sealed class WritingScheduleRepository(ISqlConnectionFactory connectionFa LEFT JOIN dbo.SceneWorkflow sw ON sw.SceneID = s.SceneID WHERE wp.UserID = @UserID AND wp.IsActive = 1 + AND (@ProjectID IS NULL OR wp.ProjectID = @ProjectID) ORDER BY wsi.ScheduledDate, wsi.WritingScheduleItemID; """, - new { UserID = userId }); + new { UserID = userId, ProjectID = projectId }); return rows.ToList(); } @@ -1268,7 +1270,7 @@ public sealed class WritingScheduleRepository(ISqlConnectionFactory connectionFa }); } - public async Task> GetPlansRequiringRebalanceAsync(int userId, DateTime today) + public async Task> GetPlansRequiringRebalanceAsync(int userId, DateTime today, int? projectId = null) { using var connection = connectionFactory.CreateConnection(); var rows = await connection.QueryAsync( @@ -1287,6 +1289,7 @@ public sealed class WritingScheduleRepository(ISqlConnectionFactory connectionFa LEFT JOIN dbo.Books b ON b.BookID = wp.BookID WHERE wp.UserID = @UserID AND wp.IsActive = 1 + AND (@ProjectID IS NULL OR wp.ProjectID = @ProjectID) AND EXISTS ( SELECT 1 @@ -1297,7 +1300,7 @@ public sealed class WritingScheduleRepository(ISqlConnectionFactory connectionFa ) ORDER BY wp.DeadlineDate, wp.PlanName, wp.WritingPlanID; """, - new { UserID = userId, Today = today.Date }); + new { UserID = userId, Today = today.Date, ProjectID = projectId }); return rows.ToList(); } diff --git a/PlotLine/Services/CoreServices.cs b/PlotLine/Services/CoreServices.cs index 0c2c5eb..c39444c 100644 --- a/PlotLine/Services/CoreServices.cs +++ b/PlotLine/Services/CoreServices.cs @@ -283,10 +283,10 @@ public interface IWritingScheduleService Task GetScheduleSetupAsync(int? projectId); Task PopulateScheduleSetupOptionsAsync(WritingScheduleSetupViewModel model); Task CreateScheduleFromSetupAsync(WritingScheduleSetupViewModel model); - Task GetTodayDashboardAsync(); + Task GetTodayDashboardAsync(int? projectId = null); Task MarkScheduleItemCompleteAsync(int writingScheduleItemId); Task SkipScheduleItemAsync(int writingScheduleItemId); - Task> GetPlansRequiringRebalanceAsync(); + Task> GetPlansRequiringRebalanceAsync(int? projectId = null); Task PreviewRebalanceAsync(int writingPlanId); Task ApplyRebalanceAsync(int writingPlanId); } @@ -3671,17 +3671,17 @@ public sealed class WritingScheduleService( } } - public async Task GetTodayDashboardAsync() + public async Task GetTodayDashboardAsync(int? projectId = null) { if (!currentUser.UserId.HasValue) { return new WritingScheduleDashboardViewModel(); } - var plans = await writingSchedule.GetWritingPlanSummariesByUserAsync(currentUser.UserId.Value); + var plans = await writingSchedule.GetWritingPlanSummariesByUserAsync(currentUser.UserId.Value, projectId); var activePlanCount = plans.Count(x => x.IsActive); - var plansRequiringRebalance = await writingSchedule.GetPlansRequiringRebalanceAsync(currentUser.UserId.Value, DateTime.Today); - var items = await writingSchedule.GetActiveScheduleDashboardItemsAsync(currentUser.UserId.Value); + var plansRequiringRebalance = await writingSchedule.GetPlansRequiringRebalanceAsync(currentUser.UserId.Value, DateTime.Today, projectId); + var items = await writingSchedule.GetActiveScheduleDashboardItemsAsync(currentUser.UserId.Value, projectId); var today = DateTime.Today; var plannedItems = items .Where(x => string.Equals(x.ScheduleStatus, "Planned", StringComparison.OrdinalIgnoreCase)) @@ -3743,14 +3743,14 @@ public sealed class WritingScheduleService( return affectedRows > 0; } - public async Task> GetPlansRequiringRebalanceAsync() + public async Task> GetPlansRequiringRebalanceAsync(int? projectId = null) { if (!currentUser.UserId.HasValue) { return []; } - return await writingSchedule.GetPlansRequiringRebalanceAsync(currentUser.UserId.Value, DateTime.Today); + return await writingSchedule.GetPlansRequiringRebalanceAsync(currentUser.UserId.Value, DateTime.Today, projectId); } public async Task PreviewRebalanceAsync(int writingPlanId)