允许排序
This commit is contained in:
@@ -37,6 +37,12 @@ namespace TodoList.ViewModels
|
||||
[NotifyPropertyChangedFor(nameof(FullShortcut))]
|
||||
private string shortcutModifiers;
|
||||
|
||||
[ObservableProperty]
|
||||
private SortBy sortBy = SortBy.Priority;
|
||||
|
||||
[ObservableProperty]
|
||||
private Models.SortOrder sortOrder = Models.SortOrder.Descending;
|
||||
|
||||
public string AppVersion => System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "1.0.0";
|
||||
|
||||
public string FullShortcut
|
||||
@@ -90,6 +96,16 @@ namespace TodoList.ViewModels
|
||||
await LoadTasksAsync();
|
||||
}
|
||||
|
||||
async partial void OnSortByChanged(SortBy value)
|
||||
{
|
||||
await LoadTasksAsync();
|
||||
}
|
||||
|
||||
async partial void OnSortOrderChanged(Models.SortOrder value)
|
||||
{
|
||||
await LoadTasksAsync();
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private async Task AddTaskAsync()
|
||||
{
|
||||
@@ -118,12 +134,26 @@ namespace TodoList.ViewModels
|
||||
? allTasks
|
||||
: allTasks.Where(t => !t.IsCompleted).ToList();
|
||||
|
||||
// Sort: Uncompleted first, then by priority (High -> Low), then date
|
||||
var sorted = filtered
|
||||
.OrderBy(t => t.IsCompleted)
|
||||
.ThenByDescending(t => t.Priority)
|
||||
.ThenByDescending(t => t.CreatedAt)
|
||||
.ToList();
|
||||
IOrderedEnumerable<TodoItem> sorted;
|
||||
|
||||
if (SortBy == SortBy.Priority)
|
||||
{
|
||||
sorted = SortOrder == Models.SortOrder.Ascending
|
||||
? filtered.OrderBy(t => t.Priority).ThenBy(t => t.CreatedAt)
|
||||
: filtered.OrderByDescending(t => t.Priority).ThenBy(t => t.CreatedAt);
|
||||
}
|
||||
else if (SortBy == SortBy.CreatedAt)
|
||||
{
|
||||
sorted = SortOrder == Models.SortOrder.Ascending
|
||||
? filtered.OrderBy(t => t.CreatedAt)
|
||||
: filtered.OrderByDescending(t => t.CreatedAt);
|
||||
}
|
||||
else
|
||||
{
|
||||
sorted = SortOrder == Models.SortOrder.Ascending
|
||||
? filtered.OrderBy(t => t.CompletedAt).ThenBy(t => t.CreatedAt)
|
||||
: filtered.OrderByDescending(t => t.CompletedAt).ThenBy(t => t.CreatedAt);
|
||||
}
|
||||
|
||||
Tasks.Clear();
|
||||
foreach (var t in sorted)
|
||||
@@ -136,13 +166,19 @@ namespace TodoList.ViewModels
|
||||
private async Task ToggleCompleteAsync(TodoItem item)
|
||||
{
|
||||
if (item == null) return;
|
||||
// item.IsCompleted is already toggled by UI binding before this command if TwoWay binding
|
||||
// But usually CheckBox command parameter is the item.
|
||||
// Let's assume the binding updates the property.
|
||||
|
||||
item.SyncStatus = SyncStatus.Pending; // Mark as pending sync
|
||||
if (item.IsCompleted)
|
||||
{
|
||||
item.CompletedAt = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
item.CompletedAt = null;
|
||||
}
|
||||
|
||||
item.SyncStatus = SyncStatus.Pending;
|
||||
await _dataService.SaveTaskAsync(item);
|
||||
await LoadTasksAsync(); // Refresh list to apply filter
|
||||
await LoadTasksAsync();
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
|
||||
Reference in New Issue
Block a user