fix(project): 프로젝트 순서변경 라우트 충돌 수정 + 세션편집 제목/드래그 손잡이 표시

- PUT /api/projects/order 가 /api/projects/{project_id} 뒤에 등록돼 있어
  "order" 가 project_id(int) 파싱 실패로 422 나던 버그 수정(라우트 등록 순서
  변경 — 경로 매칭은 등록 순서라 path param 뒤에 두면 리터럴 경로가 항상
  가려진다). 홈 카드/좌측 프로젝트 트리 드래그 재정렬 둘 다 이 버그였음.
- 세션 편집 팝업 제목에 세션 이름 표시
- 좌측 프로젝트 트리에 드래그 가능 손잡이(⣿) 표시(관리자, hover 시 노출)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-17 12:02:29 +09:00
parent 003d29d349
commit 6922679f51
6 changed files with 34 additions and 23 deletions
+3
View File
@@ -229,6 +229,9 @@
.pj-tree-acts .pj-icon-btn { width: 22px; height: 22px; font-size: 14px; }
.pj-tree-li[draggable="true"] { cursor: grab; }
.pj-tree-li.is-dragging { opacity: .45; }
/* 드래그 가능 손잡이 — 평소엔 흐리게 숨겨두고 행에 마우스 올리면 보인다 */
.pj-tree-handle { flex: 0 0 auto; width: 14px; text-align: center; color: #c2c6cc; font-size: 12px; cursor: grab; opacity: 0; transition: opacity .12s; }
.pj-tree-row:hover .pj-tree-handle { opacity: 1; }
/* 구글 머티리얼 심볼 아이콘(담당자) */
.material-symbols-outlined { font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24; line-height: 1; vertical-align: middle; }
+4 -1
View File
@@ -1865,7 +1865,7 @@
if (stageModal) wireModalClose(stageModal);
function openStageModal(stage) {
if (!stageModal) return;
el("pj-stage-modal-title").textContent = stage ? "세션 편집" : "새 세션";
el("pj-stage-modal-title").textContent = stage ? "\"" + stage.name + "\" 세션 편집" : "새 세션";
el("pj-stg-id").value = stage ? stage.id : "";
el("pj-stg-name").value = stage ? stage.name : "";
getStageColor = renderColorPalette(
@@ -3037,8 +3037,11 @@
"</span>";
}
const initial = escapeHtml((p.name || "?").trim().charAt(0).toUpperCase() || "?");
// 드래그로 순서 변경 가능함을 알려주는 손잡이(⣿) — 관리자에게만 보인다.
const handle = isAdmin ? '<span class="pj-tree-handle" title="드래그로 순서 변경">⣿</span>' : "";
return '<li class="pj-tree-li"' + (isAdmin ? ' draggable="true"' : "") + ' data-id="' + p.id + '"><div class="pj-tree-row ' +
(p.id === projectId ? "is-active" : "") + '">' +
handle +
'<a class="pj-tree-link" href="/project/p/' + p.id + '">' +
'<span class="pj-tree-avatar" style="background:' + (p.color || "#4573d2") + '">' + initial + "</span>" +
'<span class="pj-tree-name">' + escapeHtml(p.name) + "</span></a>" + acts + "</div></li>";