Changed it so that tasks can be dragged and reordered, as well as having tasks breathe to leave a space where the task will go when you let go

This commit is contained in:
NPS Agent
2026-05-12 12:31:44 +09:30
parent 84592b8b3b
commit b0fd767c80
9 changed files with 127 additions and 30 deletions
+8 -3
View File
@@ -99,17 +99,21 @@ def delete_user(user_id: str, db: Session = Depends(get_db), current_user: model
@app.get("/tasks", response_model=List[schemas.Task])
def read_tasks(db: Session = Depends(get_db), current_user: models.User = Depends(auth.get_current_user)):
return db.query(models.Task).filter(models.Task.deleted_at == None).all()
return db.query(models.Task).filter(models.Task.deleted_at == None).order_by(models.Task.position.asc()).all()
@app.get("/tasks/deleted", response_model=List[schemas.Task])
def read_deleted_tasks(db: Session = Depends(get_db), current_user: models.User = Depends(auth.get_current_user)):
if current_user.account_type != "admin":
raise HTTPException(status_code=403, detail="Not enough permissions")
return db.query(models.Task).filter(models.Task.deleted_at != None).all()
return db.query(models.Task).filter(models.Task.deleted_at != None).order_by(models.Task.position.asc()).all()
@app.post("/tasks", response_model=schemas.Task)
def create_task(task: schemas.TaskCreate, db: Session = Depends(get_db), current_user: models.User = Depends(auth.get_current_user)):
task_id = task.id or f"t_{uuid.uuid4().hex[:8]}"
# Calculate position (max in column + 1000)
max_pos = db.query(func.max(models.Task.position)).filter(models.Task.assignee_id == task.assignee_id).scalar() or 0.0
db_task = models.Task(
id=task_id,
title=task.title,
@@ -120,7 +124,8 @@ def create_task(task: schemas.TaskCreate, db: Session = Depends(get_db), current
source=task.source,
status=task.status,
due_at=task.due_at,
reminder_at=task.reminder_at
reminder_at=task.reminder_at,
position=max_pos + 1000.0
)
db.add(db_task)
+3 -1
View File
@@ -1,4 +1,4 @@
from sqlalchemy import Column, Integer, String, ForeignKey, Table, DateTime, Enum
from sqlalchemy import Column, Integer, String, ForeignKey, Table, DateTime, Enum, Float
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from .database import Base
@@ -43,6 +43,7 @@ class Task(Base):
due_at = Column(DateTime(timezone=True))
reminder_at = Column(DateTime(timezone=True))
deleted_at = Column(DateTime(timezone=True))
position = Column(Float, default=0.0)
assignee = relationship("User", back_populates="tasks", foreign_keys=[assignee_id])
tags = relationship("Tag", secondary=task_tags, back_populates="tasks")
@@ -90,3 +91,4 @@ class Workspace(Base):
id = Column(String, primary_key=True)
name = Column(String, nullable=False)
timezone = Column(String, nullable=False, default="Pacific/Auckland")
+2
View File
@@ -68,6 +68,7 @@ class TaskBase(BaseModel):
due_at: Optional[datetime] = None
reminder_at: Optional[datetime] = None
deleted_at: Optional[datetime] = None
position: float = 0.0
class TaskCreate(TaskBase):
id: Optional[str] = None
@@ -81,6 +82,7 @@ class TaskUpdate(BaseModel):
status: Optional[str] = None
due_at: Optional[datetime] = None
reminder_at: Optional[datetime] = None
position: Optional[float] = None
class Task(TaskBase):
id: str