From ce8071b88364e999aaccfda8b90588a71d593bdb Mon Sep 17 00:00:00 2001 From: Matayas Durr Date: Wed, 15 Apr 2026 13:02:34 -0500 Subject: [PATCH 1/8] Refactor AdminAssignTask and extract manual task form --- .../Pages/Assignments/AdminAssignTask.razor | 455 +++++++----------- .../Pages/Assignments/ManualTaskForm.razor | 117 +++++ .../Pages/Assignments/TaskFormModel.cs | 31 ++ 3 files changed, 318 insertions(+), 285 deletions(-) create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/ManualTaskForm.razor create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/TaskFormModel.cs diff --git a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor index 65c78e8..11c2af4 100644 --- a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor +++ b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor @@ -3,10 +3,12 @@ @using CulinaryCommand.Data.Entities @using CulinaryCommand.Services @using CulinaryCommand.Data.Enums; +@using WorkTaskStatus = CulinaryCommand.Data.Enums.TaskStatus @using CulinaryCommand.Services.UserContextSpace @using CulinaryCommandApp.Recipe.Services; @using CulinaryCommandApp.Recipe.Services.Interfaces; @using CulinaryCommandApp.Recipe.Entities; +@using CulinaryCommandApp.Components.Pages.Assignments @using CulinaryCommand.Data.Models @inject IUserContextService UserCtx @inject NavigationManager Nav @@ -37,17 +39,17 @@ else if (!allowed) else {
- @if (!string.IsNullOrWhiteSpace(createTemplateSuccess)) + @if (!string.IsNullOrWhiteSpace(pageSuccess)) {
- @createTemplateSuccess + @pageSuccess
} - @if (!string.IsNullOrWhiteSpace(createTemplateError)) + @if (!string.IsNullOrWhiteSpace(pageError)) {
- @createTemplateError + @pageError
}
@@ -258,106 +260,13 @@ else
-
- - Create Task Manually - Team: @teamMembers.Count - - -
- - - - -
- - - - - -
- -
- - -
- -
-
- - - @foreach (var station in stationOptions) - { - - } - -
- -
- - - @foreach (var p in priorityOptions) - { - - } - -
-
- - @if (newTask.TaskType == WorkTaskKind.PrepFromRecipe) - { -
- - - - @foreach (var r in recipes) - { - - } - -
- -
-
- - -
-
- - -
-
- } - -
-
- - - - @foreach (var user in teamMembers) - { - - } - -
- -
- - -
-
- -
- - -
- - -
-
-
+
@@ -496,7 +405,7 @@ else }
- @if (task.Status == "Pending") + @if (task.Status == WorkTaskStatus.Pending) { } - @if (task.Status != "Completed") + @if (task.Status != WorkTaskStatus.Completed) { + +
+ + +@code { + [Parameter] public TaskFormModel Model { get; set; } = default!; + [Parameter] public List TeamMembers { get; set; } = new(); + [Parameter] public List Recipes { get; set; } = new(); + [Parameter] public List StationOptions { get; set; } = new(); + [Parameter] public List PriorityOptions { get; set; } = new(); + [Parameter] public EventCallback OnSubmit { get; set; } + + private Task HandleSubmit() => OnSubmit.InvokeAsync(); +} diff --git a/CulinaryCommandApp/Components/Pages/Assignments/TaskFormModel.cs b/CulinaryCommandApp/Components/Pages/Assignments/TaskFormModel.cs new file mode 100644 index 0000000..7ef30df --- /dev/null +++ b/CulinaryCommandApp/Components/Pages/Assignments/TaskFormModel.cs @@ -0,0 +1,31 @@ +using System.ComponentModel.DataAnnotations; +using CulinaryCommand.Data.Enums; + +namespace CulinaryCommandApp.Components.Pages.Assignments; + +public class TaskFormModel +{ + [Required, StringLength(128)] + public string Name { get; set; } = string.Empty; + + [Required] + public string Station { get; set; } = "Prep"; + + [Required] + public string Priority { get; set; } = "Normal"; + + public int? UserId { get; set; } + + [Required] + public DateTime? DueDate { get; set; } = DateTime.Today; + + [StringLength(512)] + public string? Notes { get; set; } = string.Empty; + + public WorkTaskKind TaskType { get; set; } = WorkTaskKind.Generic; + + public int? Par { get; set; } + public int? Count { get; set; } + + public int? RecipeId { get; set; } +} From 867a313b02d4f4e1bf61c89438adcad01a2712f1 Mon Sep 17 00:00:00 2001 From: Matayas Durr Date: Wed, 15 Apr 2026 13:13:34 -0500 Subject: [PATCH 2/8] Extract quick assign panel from AdminAssignTask --- .../Pages/Assignments/AdminAssignTask.razor | 77 ++----------- .../Pages/Assignments/QuickAssignPanel.razor | 104 ++++++++++++++++++ 2 files changed, 116 insertions(+), 65 deletions(-) create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/QuickAssignPanel.razor diff --git a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor index 11c2af4..7e13a9b 100644 --- a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor +++ b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor @@ -277,71 +277,18 @@ else @if (SelectedTemplates.Any()) { -
-
-
-
-
Quick Assign
-
- @SelectedTemplates.Count task@(SelectedTemplates.Count == 1 ? "" : "s") selected -
-
- - -
- -
-
- @foreach (var template in SelectedTemplates) - { - - @template.Name - - } -
-
- -
-
- - - - @foreach (var user in teamMembers) - { - - } - -
- -
- - -
- -
- - - - @foreach (var p in priorityOptions) - { - - } - -
-
- -
- - -
-
-
+ } diff --git a/CulinaryCommandApp/Components/Pages/Assignments/QuickAssignPanel.razor b/CulinaryCommandApp/Components/Pages/Assignments/QuickAssignPanel.razor new file mode 100644 index 0000000..2d712c7 --- /dev/null +++ b/CulinaryCommandApp/Components/Pages/Assignments/QuickAssignPanel.razor @@ -0,0 +1,104 @@ +@using CulinaryCommand.Data.Entities +@using Microsoft.AspNetCore.Components.Forms + +
+
+
+
+
Quick Assign
+
+ @SelectedTemplates.Count task@(SelectedTemplates.Count == 1 ? "" : "s") selected +
+
+ + +
+ +
+
+ @foreach (var template in SelectedTemplates) + { + + @template.Name + + } +
+
+ +
+
+ + + + @foreach (var user in TeamMembers) + { + + } + +
+ +
+ + +
+ +
+ + + + @foreach (var priority in PriorityOptions) + { + + } + +
+
+ +
+ + +
+
+
+ +@code { + [Parameter] public List SelectedTemplates { get; set; } = new(); + [Parameter] public List TeamMembers { get; set; } = new(); + [Parameter] public List PriorityOptions { get; set; } = new(); + [Parameter] public int? AssignedUserId { get; set; } + [Parameter] public EventCallback AssignedUserIdChanged { get; set; } + [Parameter] public DateTime DueDate { get; set; } + [Parameter] public EventCallback DueDateChanged { get; set; } + [Parameter] public string Priority { get; set; } = "Keep Original"; + [Parameter] public EventCallback PriorityChanged { get; set; } + [Parameter] public EventCallback OnAssign { get; set; } + [Parameter] public EventCallback OnClear { get; set; } + + private int? AssignedUserIdValue + { + get => AssignedUserId; + set => _ = AssignedUserIdChanged.InvokeAsync(value); + } + + private DateTime DueDateValue + { + get => DueDate; + set => _ = DueDateChanged.InvokeAsync(value); + } + + private string PriorityValue + { + get => Priority; + set => _ = PriorityChanged.InvokeAsync(value); + } + + private Task HandleAssign() => OnAssign.InvokeAsync(); + + private Task HandleClear() => OnClear.InvokeAsync(); +} From 506ac6c2e1a7f4d7eec199a372ccbd53379c8cb8 Mon Sep 17 00:00:00 2001 From: Matayas Durr Date: Wed, 15 Apr 2026 13:19:35 -0500 Subject: [PATCH 3/8] Extract task library panel from AdminAssignTask --- .../Pages/Assignments/AdminAssignTask.razor | 102 ++------------- .../Pages/Assignments/TaskLibraryPanel.razor | 120 ++++++++++++++++++ 2 files changed, 131 insertions(+), 91 deletions(-) create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/TaskLibraryPanel.razor diff --git a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor index 7e13a9b..684e795 100644 --- a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor +++ b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor @@ -167,97 +167,17 @@ else -
-
-
-
-
Task Library
-
Select one or more reusable tasks
-
- -
- @taskTemplates.Count - -
-
- -
- - -
- - @if (selectedTemplateIds.Any()) - { -
- @selectedTemplateIds.Count task@(selectedTemplateIds.Count == 1 ? "" : "s") selected -
- } - -
- @if (!FilteredTaskTemplates.Any()) - { -
No task templates found.
- } - else - { - @foreach (var template in FilteredTaskTemplates) - { - var isSelected = selectedTemplateIds.Contains(template.Id); - -
-
-
- - -
-
@template.Name
-
@template.Station
- - @if (!string.IsNullOrWhiteSpace(template.Notes)) - { -
@template.Notes
- } - -
- @template.Priority - - @if (template.DefaultEstimatedMinutes.HasValue) - { - - @template.DefaultEstimatedMinutes min - - } -
-
-
- - - - -
- -
- } - } -
-
-
+ +
+
+
+
Task Library
+
Select one or more reusable tasks
+
+ +
+ @TemplateCount + +
+
+ +
+ + +
+ + @if (SelectedTemplateIds.Any()) + { +
+ @SelectedTemplateIds.Count task@(SelectedTemplateIds.Count == 1 ? "" : "s") selected +
+ } + +
+ @if (!Templates.Any()) + { +
No task templates found.
+ } + else + { + @foreach (var template in Templates) + { + var isSelected = SelectedTemplateIds.Contains(template.Id); + +
+
+
+ + +
+
@template.Name
+
@template.Station
+ + @if (!string.IsNullOrWhiteSpace(template.Notes)) + { +
@template.Notes
+ } + +
+ @template.Priority + + @if (template.DefaultEstimatedMinutes.HasValue) + { + + @template.DefaultEstimatedMinutes min + + } +
+
+
+ +
+ + +
+
+
+ } + } +
+
+ + +@code { + [Parameter] public List Templates { get; set; } = new(); + [Parameter] public int TemplateCount { get; set; } + [Parameter] public string SearchTerm { get; set; } = string.Empty; + [Parameter] public EventCallback SearchTermChanged { get; set; } + [Parameter] public IReadOnlyCollection SelectedTemplateIds { get; set; } = Array.Empty(); + [Parameter] public Func PriorityBadgeClass { get; set; } = default!; + [Parameter] public EventCallback OnToggleSelection { get; set; } + [Parameter] public EventCallback OnCreateTemplate { get; set; } + [Parameter] public EventCallback OnEditTemplate { get; set; } + [Parameter] public EventCallback OnArchiveTemplate { get; set; } + + private string SearchTermValue + { + get => SearchTerm; + set => _ = SearchTermChanged.InvokeAsync(value); + } + + private Task HandleToggleSelection(int templateId) => OnToggleSelection.InvokeAsync(templateId); + + private Task HandleCreateTemplate() => OnCreateTemplate.InvokeAsync(); + + private Task HandleEditTemplate(TaskTemplate template) => OnEditTemplate.InvokeAsync(template); + + private Task HandleArchiveTemplate(int templateId) => OnArchiveTemplate.InvokeAsync(templateId); +} From 96a1570f17b55324acb4618feb00cb54ddb9313e Mon Sep 17 00:00:00 2001 From: Matayas Durr Date: Wed, 15 Apr 2026 13:23:52 -0500 Subject: [PATCH 4/8] Extract task lists panel from AdminAssignTask --- .../Pages/Assignments/AdminAssignTask.razor | 89 ++------------ .../Pages/Assignments/TaskListsPanel.razor | 109 ++++++++++++++++++ 2 files changed, 119 insertions(+), 79 deletions(-) create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/TaskListsPanel.razor diff --git a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor index 684e795..3673815 100644 --- a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor +++ b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor @@ -86,85 +86,16 @@ else
-
-
-
-
-
Task Lists
-
Reusable groups like Dish Closing or Morning Prep
-
- -
- @taskLists.Count - -
-
- -
- - -
- -
- @if (!FilteredTaskLists.Any()) - { -
No task lists found.
- } - else - { - @foreach (var list in FilteredTaskLists) - { -
-
-
-
@list.Name
- - @if (!string.IsNullOrWhiteSpace(list.Description)) - { -
@list.Description
- } - - - @(list.Items?.Count ?? 0) task@((list.Items?.Count ?? 0) == 1 ? "" : "s") - -
- -
- - - - - - - -
-
-
- } - } -
-
-
+ +
+
+
+
Task Lists
+
Reusable groups like Dish Closing or Morning Prep
+
+ +
+ @TaskListCount + +
+
+ +
+ + +
+ +
+ @if (!TaskLists.Any()) + { +
No task lists found.
+ } + else + { + @foreach (var list in TaskLists) + { +
+
+
+
@list.Name
+ + @if (!string.IsNullOrWhiteSpace(list.Description)) + { +
@list.Description
+ } + + + @(list.Items?.Count ?? 0) task@((list.Items?.Count ?? 0) == 1 ? "" : "s") + +
+ +
+ + + + + + + +
+
+
+ } + } +
+
+
+ +@code { + [Parameter] public List TaskLists { get; set; } = new(); + [Parameter] public int TaskListCount { get; set; } + [Parameter] public string SearchTerm { get; set; } = string.Empty; + [Parameter] public EventCallback SearchTermChanged { get; set; } + [Parameter] public EventCallback OnAssignList { get; set; } + [Parameter] public EventCallback OnCreateTaskList { get; set; } + [Parameter] public EventCallback OnEditTaskList { get; set; } + [Parameter] public EventCallback OnManageTemplates { get; set; } + [Parameter] public EventCallback OnArchiveTaskList { get; set; } + + private string SearchTermValue + { + get => SearchTerm; + set => _ = SearchTermChanged.InvokeAsync(value); + } + + private Task HandleAssignList(int taskListId) => OnAssignList.InvokeAsync(taskListId); + + private Task HandleCreateTaskList() => OnCreateTaskList.InvokeAsync(); + + private Task HandleEditTaskList(TaskList taskList) => OnEditTaskList.InvokeAsync(taskList); + + private Task HandleManageTemplates(TaskList taskList) => OnManageTemplates.InvokeAsync(taskList); + + private Task HandleArchiveTaskList(int taskListId) => OnArchiveTaskList.InvokeAsync(taskListId); +} From 05ff280cb85f2dfc985193a22fe731b3e03c3a73 Mon Sep 17 00:00:00 2001 From: Matayas Durr Date: Wed, 15 Apr 2026 14:12:54 -0500 Subject: [PATCH 5/8] Extract task board panel from AdminAssignTask --- .../Pages/Assignments/AdminAssignTask.razor | 112 ++-------------- .../Pages/Assignments/TaskBoardPanel.razor | 126 ++++++++++++++++++ .../Pages/Assignments/TaskLibraryPanel.razor | 12 +- .../Pages/Assignments/TaskListsPanel.razor | 12 +- 4 files changed, 150 insertions(+), 112 deletions(-) create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/TaskBoardPanel.razor diff --git a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor index 3673815..7321077 100644 --- a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor +++ b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor @@ -89,8 +89,7 @@ else } - -
-
-
-
Kitchen Task Board
-
Track pending, active, and completed work
-
- -
-
- - -
-
-
-
- - -
- @foreach (var status in statusBuckets) - { -
-
-
-
-
@status
- - @TasksByStatus(status).Count() - -
- -
- @if (!TasksByStatus(status).Any()) - { -
- No tasks in this column. -
- } - else - { - @foreach (var task in TasksByStatus(status)) - { -
-
- @task.Priority -
- -
@task.Name
-
@task.Station
-
@FormatAssignee(task.UserId)
-
Due @task.DueDate.ToString("MMM d")
- - @if (!string.IsNullOrWhiteSpace(task.Notes)) - { -
@task.Notes
- } - -
- @if (task.Status == WorkTaskStatus.Pending) - { - - } - - @if (task.Status != WorkTaskStatus.Completed) - { - - } - - - - -
-
- } - } -
-
-
-
- } -
+ diff --git a/CulinaryCommandApp/Components/Pages/Assignments/TaskBoardPanel.razor b/CulinaryCommandApp/Components/Pages/Assignments/TaskBoardPanel.razor new file mode 100644 index 0000000..f0ac2ae --- /dev/null +++ b/CulinaryCommandApp/Components/Pages/Assignments/TaskBoardPanel.razor @@ -0,0 +1,126 @@ +@using CulinaryCommand.Data.Entities +@using WorkTaskStatus = CulinaryCommand.Data.Enums.TaskStatus + +
+
+
+
Kitchen Task Board
+
Track pending, active, and completed work
+
+ +
+
+ + +
+
+
+
+ +
+ @foreach (var status in StatusBuckets) + { + var tasks = TasksByStatus(status).ToList(); + +
+
+
+
+
@status
+ + @tasks.Count + +
+ +
+ @if (!tasks.Any()) + { +
+ No tasks in this column. +
+ } + else + { + @foreach (var task in tasks) + { +
+
+ @task.Priority +
+ +
@task.Name
+
@task.Station
+
@FormatAssignee(task.UserId)
+
Due @task.DueDate.ToString("MMM d")
+ + @if (!string.IsNullOrWhiteSpace(task.Notes)) + { +
@task.Notes
+ } + +
+ @if (task.Status == WorkTaskStatus.Pending) + { + + } + + @if (task.Status != WorkTaskStatus.Completed) + { + + } + + + + +
+
+ } + } +
+
+
+
+ } +
+ +@code { + [Parameter] public string BoardSearch { get; set; } = string.Empty; + [Parameter] public EventCallback BoardSearchChanged { get; set; } + [Parameter] public List StatusBuckets { get; set; } = new(); + [Parameter] public Func> TasksByStatus { get; set; } = default!; + [Parameter] public Func PriorityBadgeClass { get; set; } = default!; + [Parameter] public Func FormatAssignee { get; set; } = default!; + [Parameter] public EventCallback OnMarkInProgress { get; set; } + [Parameter] public EventCallback OnMarkComplete { get; set; } + [Parameter] public EventCallback OnBumpTask { get; set; } + [Parameter] public EventCallback OnDeleteTask { get; set; } + + private string BoardSearchValue + { + get => BoardSearch; + set => _ = BoardSearchChanged.InvokeAsync(value); + } + + private Task HandleMarkInProgress(int taskId) => OnMarkInProgress.InvokeAsync(taskId); + + private Task HandleMarkComplete(int taskId) => OnMarkComplete.InvokeAsync(taskId); + + private Task HandleBumpTask(int taskId) => OnBumpTask.InvokeAsync(taskId); + + private Task HandleDeleteTask(int taskId) => OnDeleteTask.InvokeAsync(taskId); +} diff --git a/CulinaryCommandApp/Components/Pages/Assignments/TaskLibraryPanel.razor b/CulinaryCommandApp/Components/Pages/Assignments/TaskLibraryPanel.razor index 0468fde..ea96d4d 100644 --- a/CulinaryCommandApp/Components/Pages/Assignments/TaskLibraryPanel.razor +++ b/CulinaryCommandApp/Components/Pages/Assignments/TaskLibraryPanel.razor @@ -20,7 +20,7 @@ @@ -95,8 +95,8 @@ @code { [Parameter] public List Templates { get; set; } = new(); [Parameter] public int TemplateCount { get; set; } - [Parameter] public string SearchTerm { get; set; } = string.Empty; - [Parameter] public EventCallback SearchTermChanged { get; set; } + [Parameter] public string TaskLibrarySearch { get; set; } = string.Empty; + [Parameter] public EventCallback TaskLibrarySearchChanged { get; set; } [Parameter] public IReadOnlyCollection SelectedTemplateIds { get; set; } = Array.Empty(); [Parameter] public Func PriorityBadgeClass { get; set; } = default!; [Parameter] public EventCallback OnToggleSelection { get; set; } @@ -104,10 +104,10 @@ [Parameter] public EventCallback OnEditTemplate { get; set; } [Parameter] public EventCallback OnArchiveTemplate { get; set; } - private string SearchTermValue + private string TaskLibrarySearchValue { - get => SearchTerm; - set => _ = SearchTermChanged.InvokeAsync(value); + get => TaskLibrarySearch; + set => _ = TaskLibrarySearchChanged.InvokeAsync(value); } private Task HandleToggleSelection(int templateId) => OnToggleSelection.InvokeAsync(templateId); diff --git a/CulinaryCommandApp/Components/Pages/Assignments/TaskListsPanel.razor b/CulinaryCommandApp/Components/Pages/Assignments/TaskListsPanel.razor index 5ddd93f..dd9b22f 100644 --- a/CulinaryCommandApp/Components/Pages/Assignments/TaskListsPanel.razor +++ b/CulinaryCommandApp/Components/Pages/Assignments/TaskListsPanel.razor @@ -20,7 +20,7 @@ @@ -83,18 +83,18 @@ @code { [Parameter] public List TaskLists { get; set; } = new(); [Parameter] public int TaskListCount { get; set; } - [Parameter] public string SearchTerm { get; set; } = string.Empty; - [Parameter] public EventCallback SearchTermChanged { get; set; } + [Parameter] public string TaskListSearch { get; set; } = string.Empty; + [Parameter] public EventCallback TaskListSearchChanged { get; set; } [Parameter] public EventCallback OnAssignList { get; set; } [Parameter] public EventCallback OnCreateTaskList { get; set; } [Parameter] public EventCallback OnEditTaskList { get; set; } [Parameter] public EventCallback OnManageTemplates { get; set; } [Parameter] public EventCallback OnArchiveTaskList { get; set; } - private string SearchTermValue + private string TaskListSearchValue { - get => SearchTerm; - set => _ = SearchTermChanged.InvokeAsync(value); + get => TaskListSearch; + set => _ = TaskListSearchChanged.InvokeAsync(value); } private Task HandleAssignList(int taskListId) => OnAssignList.InvokeAsync(taskListId); From 6907c50f2047b0bfd1dac46b0899ac10a853aaee Mon Sep 17 00:00:00 2001 From: Matayas Durr Date: Wed, 15 Apr 2026 14:22:23 -0500 Subject: [PATCH 6/8] Clean up AdminAssignTask after panel extraction --- .../Pages/Assignments/AdminAssignTask.razor | 50 +++++++++---------- .../Pages/Assignments/TaskBoardPanel.razor | 20 ++++---- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor index 7321077..254ee3a 100644 --- a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor +++ b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor @@ -5,7 +5,6 @@ @using CulinaryCommand.Data.Enums; @using WorkTaskStatus = CulinaryCommand.Data.Enums.TaskStatus @using CulinaryCommand.Services.UserContextSpace -@using CulinaryCommandApp.Recipe.Services; @using CulinaryCommandApp.Recipe.Services.Interfaces; @using CulinaryCommandApp.Recipe.Entities; @using CulinaryCommandApp.Components.Pages.Assignments @@ -13,7 +12,6 @@ @inject IUserContextService UserCtx @inject NavigationManager Nav @inject ILocationService LocationService -@inject IUserService UserService @inject LocationState LocationState @inject ITaskAssignmentService TaskService @inject IRecipeService RecipeService @@ -40,18 +38,18 @@ else {
@if (!string.IsNullOrWhiteSpace(pageSuccess)) - { -
- @pageSuccess -
- } + { +
+ @pageSuccess +
+ } - @if (!string.IsNullOrWhiteSpace(pageError)) - { -
- @pageError -
- } + @if (!string.IsNullOrWhiteSpace(pageError)) + { +
+ @pageError +
+ }
Kitchen Operations
@@ -102,7 +100,7 @@ else TemplateCount="taskTemplates.Count" @bind-TaskLibrarySearch="taskLibrarySearch" SelectedTemplateIds="selectedTemplateIds" - PriorityBadgeClass="PriorityBadge" + PriorityBadgeClass="GetPriorityBadgeClass" OnToggleSelection="ToggleTemplateSelection" OnCreateTemplate="OpenCreateTemplateModal" OnEditTemplate="OpenEditTemplateModal" @@ -142,10 +140,10 @@ else assignments = new(); private TaskFormModel newTask = new(); private int? selectedLocationId; - private string searchTerm = string.Empty; + private string taskBoardSearch = string.Empty; private List recipes = new(); private List taskTemplates = new(); private List taskLists = new(); @@ -736,13 +734,13 @@ else private bool FilterBySearch(Tasks task) { - if (string.IsNullOrWhiteSpace(searchTerm)) + if (string.IsNullOrWhiteSpace(taskBoardSearch)) return true; - var term = searchTerm.Trim().ToLowerInvariant(); - return task.Name.ToLowerInvariant().Contains(term) - || task.Station.ToLowerInvariant().Contains(term) - || FormatAssignee(task.UserId).ToLowerInvariant().Contains(term); + var term = taskBoardSearch.Trim().ToLowerInvariant(); + return (task.Name ?? string.Empty).ToLowerInvariant().Contains(term) + || (task.Station ?? string.Empty).ToLowerInvariant().Contains(term) + || FormatAssigneeName(task.UserId).ToLowerInvariant().Contains(term); } private async Task MoveToStatus(int id, string status) @@ -810,7 +808,7 @@ else private List SelectedTemplates => taskTemplates.Where(t => selectedTemplateIds.Contains(t.Id)).ToList(); - private string FormatAssignee(int? id) + private string FormatAssigneeName(int? id) { if (!id.HasValue) return "Unassigned"; @@ -818,7 +816,7 @@ else return teamMembers.FirstOrDefault(u => u.Id == id.Value)?.Name ?? "Unassigned"; } - private string PriorityBadge(string priority) => priority switch + private string GetPriorityBadgeClass(string priority) => priority switch { "Critical" => "badge bg-danger", "High" => "badge bg-warning text-dark", diff --git a/CulinaryCommandApp/Components/Pages/Assignments/TaskBoardPanel.razor b/CulinaryCommandApp/Components/Pages/Assignments/TaskBoardPanel.razor index f0ac2ae..98af6ee 100644 --- a/CulinaryCommandApp/Components/Pages/Assignments/TaskBoardPanel.razor +++ b/CulinaryCommandApp/Components/Pages/Assignments/TaskBoardPanel.razor @@ -13,7 +13,7 @@
@@ -23,7 +23,7 @@
@foreach (var status in StatusBuckets) { - var tasks = TasksByStatus(status).ToList(); + var tasks = TasksForStatus(status).ToList();
@@ -53,7 +53,7 @@
@task.Name
@task.Station
-
@FormatAssignee(task.UserId)
+
@AssigneeLabel(task.UserId)
Due @task.DueDate.ToString("MMM d")
@if (!string.IsNullOrWhiteSpace(task.Notes)) @@ -99,21 +99,21 @@
@code { - [Parameter] public string BoardSearch { get; set; } = string.Empty; - [Parameter] public EventCallback BoardSearchChanged { get; set; } + [Parameter] public string TaskBoardSearch { get; set; } = string.Empty; + [Parameter] public EventCallback TaskBoardSearchChanged { get; set; } [Parameter] public List StatusBuckets { get; set; } = new(); - [Parameter] public Func> TasksByStatus { get; set; } = default!; + [Parameter] public Func> TasksForStatus { get; set; } = default!; [Parameter] public Func PriorityBadgeClass { get; set; } = default!; - [Parameter] public Func FormatAssignee { get; set; } = default!; + [Parameter] public Func AssigneeLabel { get; set; } = default!; [Parameter] public EventCallback OnMarkInProgress { get; set; } [Parameter] public EventCallback OnMarkComplete { get; set; } [Parameter] public EventCallback OnBumpTask { get; set; } [Parameter] public EventCallback OnDeleteTask { get; set; } - private string BoardSearchValue + private string TaskBoardSearchValue { - get => BoardSearch; - set => _ = BoardSearchChanged.InvokeAsync(value); + get => TaskBoardSearch; + set => _ = TaskBoardSearchChanged.InvokeAsync(value); } private Task HandleMarkInProgress(int taskId) => OnMarkInProgress.InvokeAsync(taskId); From d159a94cc10d265474e2c16e06964c2860ef3494 Mon Sep 17 00:00:00 2001 From: Matayas Durr Date: Wed, 15 Apr 2026 15:44:48 -0500 Subject: [PATCH 7/8] Polish AdminAssignTask styling and align with inventory UI --- .../Pages/Assignments/AdminAssignTask.razor | 23 +------- .../Assignments/AdminAssignTask.razor.css | 52 +++++++++++++++++++ 2 files changed, 53 insertions(+), 22 deletions(-) create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor.css diff --git a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor index 254ee3a..cf5e1ec 100644 --- a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor +++ b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor @@ -51,7 +51,7 @@ else
}
-
+
Kitchen Operations

Task Assignment

Manage task lists, assign library tasks fast, and track progress in one place.

@@ -848,24 +848,3 @@ else return await JS.InvokeAsync("confirm", message); } } - - diff --git a/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor.css b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor.css new file mode 100644 index 0000000..54205fd --- /dev/null +++ b/CulinaryCommandApp/Components/Pages/Assignments/AdminAssignTask.razor.css @@ -0,0 +1,52 @@ +.assign-task-page { + --assign-green: #009A3B; + --assign-green-dark: #007a2f; + --assign-green-soft: #2ca259; +} + +.assign-task-page .page-heading { + border-left: 4px solid var(--assign-green-soft); + padding-left: 1rem; +} + +.assign-task-page ::deep .card { + border-radius: 1.1rem; + border: 1px solid #e9ecef; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.04); +} + +.assign-task-page ::deep .form-control, +.assign-task-page ::deep .form-select, +.assign-task-page ::deep .input-group-text, +.assign-task-page ::deep .btn { + border-radius: 0.9rem; +} + +.assign-task-page ::deep .btn-success, +.assign-task-page ::deep .btn-primary { + background-color: var(--assign-green); + border-color: var(--assign-green); +} + +.assign-task-page ::deep .btn-success:hover, +.assign-task-page ::deep .btn-primary:hover, +.assign-task-page ::deep .btn-success:focus, +.assign-task-page ::deep .btn-primary:focus { + background-color: var(--assign-green-dark); + border-color: var(--assign-green-dark); +} + +.assign-task-page ::deep .badge { + font-weight: 600; + border-radius: 999px; +} + +.assign-task-page ::deep .bg-success, +.assign-task-page ::deep .text-bg-success { + background-color: var(--assign-green) !important; + color: #ffffff !important; +} + +.assign-task-page ::deep details summary::-webkit-details-marker { + display: none; +} From 443dd395cc5af02a917577d6ec4545626c32d101 Mon Sep 17 00:00:00 2001 From: Matayas Durr Date: Wed, 15 Apr 2026 19:24:12 -0500 Subject: [PATCH 8/8] Polish task assignment and my tasks workflows --- .../Components/Custom/PrepTasksPanel.razor | 87 ++++- .../Custom/PrepTasksPanel.razor.css | 360 +++++++++++------- .../Components/Layout/NavMenu.razor | 25 +- .../Pages/Assignments/AdminAssignTask.razor | 32 +- .../Assignments/AdminAssignTask.razor.css | 5 +- .../Assignments/CreateTaskListModal.razor | 121 +++++- .../Assignments/CreateTaskListModal.razor.css | 75 ++++ .../Assignments/CreateTaskTemplateModal.razor | 68 +++- .../CreateTaskTemplateModal.razor.css | 35 ++ .../Assignments/EditTaskTemplateModal.razor | 68 +++- .../EditTaskTemplateModal.razor.css | 35 ++ .../ManageTaskListTemplatesModal.razor | 163 +++++--- .../ManageTaskListTemplatesModal.razor.css | 72 ++++ .../Pages/Assignments/ManualTaskForm.razor | 41 +- .../Pages/Assignments/MyTasks.razor | 44 ++- .../Pages/Assignments/MyTasks.razor.css | 21 + .../Pages/Assignments/TaskBoardPanel.razor | 42 +- .../Assignments/TaskBoardPanel.razor.css | 23 ++ .../Pages/Assignments/TaskFormModel.cs | 25 +- .../Pages/Assignments/TaskLibraryPanel.razor | 35 +- .../Assignments/TaskLibraryPanel.razor.css | 23 ++ .../Pages/Assignments/TaskListsPanel.razor | 55 ++- .../Assignments/TaskListsPanel.razor.css | 23 ++ .../Data/Models/CreateTaskListRequest.cs | 4 +- .../Data/Models/CreateTaskTemplateRequest.cs | 27 +- .../Data/Models/UpdateTaskTemplateRequest.cs | 27 +- .../Services/TaskLibraryService.cs | 103 ++++- 27 files changed, 1280 insertions(+), 359 deletions(-) create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/CreateTaskListModal.razor.css create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/CreateTaskTemplateModal.razor.css create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/EditTaskTemplateModal.razor.css create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/ManageTaskListTemplatesModal.razor.css create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/MyTasks.razor.css create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/TaskBoardPanel.razor.css create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/TaskLibraryPanel.razor.css create mode 100644 CulinaryCommandApp/Components/Pages/Assignments/TaskListsPanel.razor.css diff --git a/CulinaryCommandApp/Components/Custom/PrepTasksPanel.razor b/CulinaryCommandApp/Components/Custom/PrepTasksPanel.razor index 7480fff..6216723 100644 --- a/CulinaryCommandApp/Components/Custom/PrepTasksPanel.razor +++ b/CulinaryCommandApp/Components/Custom/PrepTasksPanel.razor @@ -1,10 +1,16 @@ @namespace CulinaryCommand.Components.Custom @using CulinaryCommand.Data.Entities +@using CulinaryCommand.Data.Enums @using Microsoft.AspNetCore.Components -
+
-

Today's Prep Tasks

+
+ +

Today’s Task List

+

Review assigned work, expand general task notes, and complete prep with recipe context where needed.

+
+ @Tasks.Count
@if (Tasks is null || Tasks.Count == 0) @@ -26,29 +32,55 @@
-
- @DisplayTitle(t) +
+
+ @DisplayTitle(t) +
+ + @(IsPrepTask(t) ? "Recipe Prep" : "General") +
-
- Par: @(t.Par?.ToString() ?? "-") - Count: @(t.Count?.ToString() ?? "-") - Prep: @t.Prep + @if (IsPrepTask(t)) + { +
+ Par: @(t.Par?.ToString() ?? "0") + Count: @(t.Count?.ToString() ?? "0") + Prep: @t.Prep +
+ } + +
+ @if (ShouldShowRecipeDetails(t)) + { + + } + + @if (!IsPrepTask(t) && !string.IsNullOrWhiteSpace(t.Notes)) + { + + }
- @if (t.Recipe is not null) + @if (!IsPrepTask(t) && IsExpanded(t.Id) && !string.IsNullOrWhiteSpace(t.Notes)) { - +
+ @t.Notes +
}
- @t.DueDate.ToString("MMM d · h:mm tt") + @FormatAssignedDate(t)
-