Files
Tasks.Module/Components/Pages/TaskListPage.razor
T
2026-08-07 02:17:32 +03:00

263 lines
8.8 KiB
Plaintext

@page "/tasks/taskssheet/{tasksSheetId}"
@using Tasks.Module.Models
@using Tasks.Module.Services
@inject IFolderService FolderService
@inject ITodoService TodoService
@inject IDialogService Dialog
<div class="min-h-screen bg-gradient-to-br from-slate-50 to-slate-100">
<div class="max-w-4xl mx-auto py-8 px-4">
@* Header *@
<div class="mb-8">
<MudButton StartIcon="@Icons.Material.Filled.ArrowBack" Href="/tasks" Color="Color.Default" Class="mb-4">
Back to Tasks
</MudButton>
<h1 class="text-3xl font-bold text-slate-800">@_tasksSheetName</h1>
<p class="text-slate-500 mt-1">Manage tasks in this sheet</p>
</div>
@* Quick Add Input *@
<div class="bg-white rounded-2xl shadow-lg p-4 mb-6">
<div class="flex items-center gap-3">
<div class="flex-shrink-0 w-10 h-10 bg-indigo-100 rounded-full flex items-center justify-center">
<MudIcon Icon="@Icons.Material.Filled.Add" Color="Color.Primary" Size="Size.Small" />
</div>
<MudTextField T="string"
@bind-Value:get="quickAddTitle"
@bind-Value:set="(v) => { quickAddTitle = v; StateHasChanged(); }"
Placeholder="Add a task... (press Enter)"
DisableUnderLine="true"
Class="flex-grow"
Adornment="Adornment.None"
OnKeyDown="HandleQuickAdd" />
<MudButton Variant="Variant.Filled"
Color="Color.Primary"
OnClick="QuickAddTask"
Class="rounded-xl">
Add
</MudButton>
<MudButton Variant="Variant.Outlined"
Color="Color.Primary"
StartIcon="@Icons.Material.Filled.Add"
OnClick="OpenCreateDialog"
Class="rounded-xl">
Add Task
</MudButton>
</div>
</div>
@* Tasks List *@
@if (_loading)
{
<div class="flex justify-center py-12">
<MudProgressLinear Color="Color.Primary" Indeterminate="true" />
</div>
}
else if (!_tasksSheetFound)
{
<div class="bg-white rounded-2xl shadow-lg p-12 text-center">
<h3 class="text-lg font-semibold text-slate-700">Tasks sheet not found</h3>
<MudButton Href="/tasks" Color="Color.Primary" Class="mt-4">Go to Tasks</MudButton>
</div>
}
else
{
<div class="space-y-3">
@foreach (var task in _tasks)
{
<TaskCard Task="task"
OnToggle="ToggleTask"
OnDelete="DeleteTask"
OnUpdate="OpenUpdateDialog"
OnAddChild="OpenAddChildDialog"
CollapsedTasks="collapsedTasks"
ToggleCollapse="ToggleCollapse" />
}
</div>
}
</div>
</div>
@code {
[Parameter] public string tasksSheetId { get; set; } = string.Empty;
private string _tasksSheetName = string.Empty;
private bool _loading = true;
private bool _tasksSheetFound = false;
private CreateTodoItemDto editTask = new();
private string currentTaskId = string.Empty;
private string quickAddTitle = string.Empty;
private HashSet<string> collapsedTasks = new();
private List<TodoItemDto> _tasks = new();
private string _lastTasksSheetId = string.Empty;
protected override async Task OnInitializedAsync()
{
await LoadTasksSheet();
}
protected override async Task OnParametersSetAsync()
{
if (tasksSheetId != _lastTasksSheetId)
{
_lastTasksSheetId = tasksSheetId;
collapsedTasks.Clear();
await LoadTasksSheet();
}
}
private async Task LoadTasksSheet()
{
_loading = true;
try
{
var tasksSheet = await FolderService.GetTasksSheetByIdAsync(tasksSheetId);
if (tasksSheet != null)
{
_tasksSheetName = tasksSheet.Title;
_tasks = tasksSheet.Tasks;
_tasksSheetFound = true;
}
else
{
_tasksSheetFound = false;
}
}
finally
{
_loading = false;
}
}
private async Task HandleQuickAdd(KeyboardEventArgs e)
{
if (e.Key == "Enter" && !string.IsNullOrWhiteSpace(quickAddTitle))
{
await QuickAddTask();
}
}
private async Task QuickAddTask()
{
if (string.IsNullOrWhiteSpace(quickAddTitle))
return;
var newTask = new CreateTodoItemDto
{
Title = quickAddTitle.Trim(),
Priority = 0,
ParentId = null
};
await FolderService.AddTaskToTasksSheetAsync(tasksSheetId, newTask);
quickAddTitle = string.Empty;
await LoadTasksSheet();
}
private void ToggleCollapse(string taskId)
{
if (collapsedTasks.Contains(taskId))
collapsedTasks.Remove(taskId);
else
collapsedTasks.Add(taskId);
}
private async Task ToggleTask(string id)
{
await FolderService.ToggleTaskInTasksSheetAsync(id);
await LoadTasksSheet();
}
private async Task DeleteTask(string id)
{
await FolderService.DeleteTaskInTasksSheetAsync(id);
await LoadTasksSheet();
}
private async Task OpenCreateDialog()
{
editTask = new CreateTodoItemDto();
var parameters = new DialogParameters<CreateTaskDialog>
{
{ x => x.Task, editTask },
{ x => x.IsUpdate, false }
};
var options = new DialogOptions { CloseOnEscapeKey = true, MaxWidth = MaxWidth.Small, FullWidth = true };
var dialog = await Dialog.ShowAsync<CreateTaskDialog>("Create Task", parameters, options);
var result = await dialog.Result;
if (result is { Canceled: false })
{
await FolderService.AddTaskToTasksSheetAsync(tasksSheetId, editTask);
await LoadTasksSheet();
}
}
private async Task OpenAddChildDialog(TodoItemDto parentTask)
{
editTask = new CreateTodoItemDto { ParentId = parentTask.Id };
var parameters = new DialogParameters<CreateTaskDialog>
{
{ x => x.Task, editTask },
{ x => x.IsUpdate, false },
{ x => x.IsChild, true },
{ x => x.ParentTitle, parentTask.Title }
};
var options = new DialogOptions { CloseOnEscapeKey = true, MaxWidth = MaxWidth.Small, FullWidth = true };
var dialog = await Dialog.ShowAsync<CreateTaskDialog>("Add Sub-task", parameters, options);
var result = await dialog.Result;
if (result is { Canceled: false })
{
await LoadTasksSheet();
}
}
private async Task OpenUpdateDialog(TodoItemDto task)
{
currentTaskId = task.Id;
editTask = new CreateTodoItemDto
{
Title = task.Title,
Description = task.Description,
Priority = task.Priority,
DueDate = task.DueDate,
ParentId = task.ParentId,
CategoryId = task.CategoryId,
TagIds = task.TagIds.ToList(),
FileId = task.FileId
};
var parameters = new DialogParameters<CreateTaskDialog>
{
{ x => x.Task, editTask },
{ x => x.IsUpdate, true }
};
var options = new DialogOptions { CloseOnEscapeKey = true, MaxWidth = MaxWidth.Small, FullWidth = true };
var dialog = await Dialog.ShowAsync<CreateTaskDialog>("Update Task", parameters, options);
var result = await dialog.Result;
if (result is { Canceled: false })
{
await TodoService.UpdateTodoAsync(new UpdateTodoItemDto
{
Id = currentTaskId,
Title = editTask.Title,
Description = editTask.Description,
Priority = editTask.Priority,
DueDate = editTask.DueDate,
IsCompleted = task.IsCompleted,
ParentId = editTask.ParentId,
CategoryId = editTask.CategoryId,
TagIds = editTask.TagIds,
FileId = editTask.FileId
});
await LoadTasksSheet();
}
}
}