mirror of
https://github.com/multica-ai/multica.git
synced 2026-07-05 13:29:44 +02:00
* feat: add pin to sidebar for issues and projects
Add per-user pinning of issues and projects to the sidebar for quick access.
- New `pinned_item` table with per-user, per-workspace scoping
- REST API: GET/POST /api/pins, DELETE /api/pins/{type}/{id}, PUT /api/pins/reorder
- Sidebar "Pinned" section between Personal and Workspace nav (hidden when empty)
- Pin/unpin actions in issue and project detail dropdown menus
- Optimistic mutations with WebSocket invalidation for real-time sync
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add drag-and-drop reordering and visible pin buttons
- Sidebar pinned items now support drag-and-drop reordering via @dnd-kit
- Add visible pin/unpin icon button in issue and project detail headers
- Add useReorderPins mutation with optimistic updates
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: remove drag handle and fix page refresh after reorder
- Remove GripVertical drag handle — whole item is now draggable, aligning
with other sidebar elements
- Prevent link navigation after drag using wasDragged ref
- Remove onSettled invalidation from reorder mutation to prevent
unnecessary refetch after optimistic update
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
27 lines
815 B
SQL
27 lines
815 B
SQL
-- name: ListPinnedItems :many
|
|
SELECT * FROM pinned_item
|
|
WHERE workspace_id = $1 AND user_id = $2
|
|
ORDER BY position ASC, created_at ASC;
|
|
|
|
-- name: CreatePinnedItem :one
|
|
INSERT INTO pinned_item (workspace_id, user_id, item_type, item_id, position)
|
|
VALUES ($1, $2, $3, $4, $5)
|
|
RETURNING *;
|
|
|
|
-- name: DeletePinnedItem :exec
|
|
DELETE FROM pinned_item
|
|
WHERE workspace_id = $1 AND user_id = $2 AND item_type = $3 AND item_id = $4;
|
|
|
|
-- name: UpdatePinnedItemPosition :exec
|
|
UPDATE pinned_item SET position = $1
|
|
WHERE id = $2 AND workspace_id = $3 AND user_id = $4;
|
|
|
|
-- name: GetMaxPinnedItemPosition :one
|
|
SELECT COALESCE(MAX(position), 0)::float8 AS max_position
|
|
FROM pinned_item
|
|
WHERE workspace_id = $1 AND user_id = $2;
|
|
|
|
-- name: DeletePinnedItemsByItem :exec
|
|
DELETE FROM pinned_item
|
|
WHERE item_type = $1 AND item_id = $2;
|