improve Frontend

This commit is contained in:
Mika Kuns
2026-04-22 17:09:00 +02:00
parent 7de5510735
commit a4e313dbad
12 changed files with 437 additions and 12 deletions

View File

@@ -75,6 +75,7 @@ public sealed partial class TasksIslandViewModel : ViewModelBase
var all = await db.Tasks
.Include(t => t.List)
.Include(t => t.Worktree)
.OrderBy(t => t.SortOrder).ThenBy(t => t.CreatedAt)
.ToListAsync(ct);
ct.ThrowIfCancellationRequested();
@@ -149,23 +150,83 @@ public sealed partial class TasksIslandViewModel : ViewModelBase
{
if (string.IsNullOrWhiteSpace(NewTaskTitle) || _currentList?.Kind != ListKind.User) return;
var listId = _currentList.Id["user:".Length..];
await using var db = await _dbFactory.CreateDbContextAsync();
var maxSort = await db.Tasks
.Where(t => t.ListId == listId)
.Select(t => (int?)t.SortOrder)
.MaxAsync();
var entity = new TaskEntity
{
Id = Guid.NewGuid().ToString("N"),
ListId = listId,
Title = NewTaskTitle.Trim(),
CreatedAt = DateTime.UtcNow,
SortOrder = (maxSort ?? -1) + 1,
};
await using var db = await _dbFactory.CreateDbContextAsync();
db.Tasks.Add(entity);
await db.SaveChangesAsync();
var row = TaskRowViewModel.FromEntity(entity);
Items.Insert(0, row);
Items.Add(row);
Regroup();
NewTaskTitle = "";
UpdateSubtitle();
}
public bool CanReorder => _currentList?.Kind == ListKind.User;
public void ClearDropHints()
{
foreach (var r in Items)
{
r.DropHintAbove = false;
r.DropHintBelow = false;
}
}
public void SetDropHint(TaskRowViewModel target, bool placeBelow)
{
foreach (var r in Items)
{
var isTarget = ReferenceEquals(r, target);
r.DropHintAbove = isTarget && !placeBelow;
r.DropHintBelow = isTarget && placeBelow;
}
}
public async Task ReorderAsync(TaskRowViewModel source, TaskRowViewModel target, bool placeBelow)
{
if (!CanReorder || _currentList is null) return;
if (source.IsRunning || target.IsRunning) return;
if (ReferenceEquals(source, target)) return;
var srcIdx = Items.IndexOf(source);
var tgtIdx = Items.IndexOf(target);
if (srcIdx < 0 || tgtIdx < 0) return;
Items.RemoveAt(srcIdx);
var newTgtIdx = Items.IndexOf(target);
var insertIdx = placeBelow ? newTgtIdx + 1 : newTgtIdx;
if (insertIdx < 0 || insertIdx > Items.Count) insertIdx = Items.Count;
Items.Insert(insertIdx, source);
var listId = _currentList.Id["user:".Length..];
var orderedIds = Items.Select(i => i.Id).ToList();
await using var db = await _dbFactory.CreateDbContextAsync();
var idSet = orderedIds.ToHashSet();
var entities = await db.Tasks
.Where(t => t.ListId == listId && idSet.Contains(t.Id))
.ToListAsync();
for (int i = 0; i < orderedIds.Count; i++)
{
var e = entities.FirstOrDefault(x => x.Id == orderedIds[i]);
if (e is not null) e.SortOrder = i;
}
await db.SaveChangesAsync();
Regroup();
}
[RelayCommand]
private async Task ToggleDoneAsync(TaskRowViewModel row)
{