feat: per-pool automatic file sorting
deploy / deploy (push) Successful in 2s

Pools now store a sort setting (sort_key + sort_order). "manual" keeps the
user-arranged order in file_pool.position and allows drag-to-reorder; any
other key (content_datetime, created, original_name) sorts the pool's files
automatically server-side, in which case reordering is rejected. Manual
order is always ascending by position — direction does not apply.

Backend: add the columns (sort_key defaults to 'manual'), generalise the
pool-files keyset cursor to page by the active sort, persist the setting on
create/update, and guard reorder against non-manual pools.

Frontend: a sort dropdown (+ direction toggle) on the pool page that PATCHes
the pool and reloads; drag-to-reorder is disabled unless the pool is manual.

Closes the "automatic sorting in pools" requirement (REQUIREMENTS.md §4.6.5).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-03 08:36:12 +03:00
parent 28f5b5d150
commit 4b6db84afc
9 changed files with 445 additions and 33 deletions
+14
View File
@@ -34,6 +34,8 @@ type poolJSON struct {
CreatorID int16 `json:"creator_id"`
CreatorName string `json:"creator_name"`
IsPublic bool `json:"is_public"`
SortKey string `json:"sort_key"`
SortOrder string `json:"sort_order"`
FileCount int `json:"file_count"`
CreatedAt string `json:"created_at"`
}
@@ -51,6 +53,8 @@ func toPoolJSON(p domain.Pool) poolJSON {
CreatorID: p.CreatorID,
CreatorName: p.CreatorName,
IsPublic: p.IsPublic,
SortKey: p.SortKey,
SortOrder: p.SortOrder,
FileCount: p.FileCount,
CreatedAt: p.CreatedAt.UTC().Format(time.RFC3339),
}
@@ -214,6 +218,16 @@ func (h *PoolHandler) Update(c *gin.Context) {
params.IsPublic = &b
}
}
if v, ok := raw["sort_key"]; ok {
if s, ok := v.(string); ok {
params.SortKey = &s
}
}
if v, ok := raw["sort_order"]; ok {
if s, ok := v.(string); ok {
params.SortOrder = &s
}
}
updated, err := h.poolSvc.Update(c.Request.Context(), id, params)
if err != nil {