diff --git a/app/modules/project/router.py b/app/modules/project/router.py index 43ca4cd..d19bb6c 100644 --- a/app/modules/project/router.py +++ b/app/modules/project/router.py @@ -750,6 +750,7 @@ async def api_assignable_users(request: Request) -> JSONResponse: "email": u["email"], "name": u.get("name") or u["email"].split("@")[0], "id": u["email"].split("@")[0], + "avatar": u.get("picture") or "", } for u in user_store.list_all() if has_module(u, "project") diff --git a/app/modules/project/templates/project/inbox.html b/app/modules/project/templates/project/inbox.html index 92a9728..8b9281f 100644 --- a/app/modules/project/templates/project/inbox.html +++ b/app/modules/project/templates/project/inbox.html @@ -45,5 +45,5 @@ {% endif %} - + {% endblock %} diff --git a/app/modules/project/templates/project/index.html b/app/modules/project/templates/project/index.html index 8245c94..0e17b32 100644 --- a/app/modules/project/templates/project/index.html +++ b/app/modules/project/templates/project/index.html @@ -393,5 +393,5 @@ - + {% endblock %} diff --git a/app/modules/project/templates/project/project.html b/app/modules/project/templates/project/project.html index 066b0a4..68c5be2 100644 --- a/app/modules/project/templates/project/project.html +++ b/app/modules/project/templates/project/project.html @@ -461,5 +461,5 @@ - + {% endblock %} diff --git a/app/static/project.js b/app/static/project.js index 1522d8a..ff5d25d 100644 --- a/app/static/project.js +++ b/app/static/project.js @@ -114,6 +114,21 @@ return mm + "/" + dd + "(" + wd + ")"; } + // 멤버 선택 후보 카드(아이콘 위 / 이름 가운데 / 체크박스 아래) — 새 프로젝트 + // 모달(홈·프로젝트 페이지)과 멤버 배정 모달 3곳이 전부 이 함수 하나를 쓴다. + // /api/assignable-users 응답의 avatar 필드를 그대로 쓰므로 페이지별 + // avatars 맵(홈 페이지엔 없음)에 기대지 않는다. + function memberPickHtml(u) { + const icon = u.avatar + ? '' + : 'account_circle'; + return '"; + } + // ── 색상 팔레트 렌더 ─────────────────────────────────────── function renderColorPalette(container, onPick, initial) { const colors = window.PJ_COLORS || ["#4573d2"]; @@ -477,10 +492,9 @@ try { const res = await api("GET", "/project/api/assignable-users"); const users = res.users || []; - membersBox.innerHTML = users.length ? users.map(function (u) { - return '"; - }).join("") : "배정 가능한 직원이 없습니다."; + membersBox.innerHTML = users.length + ? users.map(memberPickHtml).join("") + : "배정 가능한 직원이 없습니다."; } catch (e) { membersBox.innerHTML = "불러오기 실패"; } @@ -2503,10 +2517,9 @@ try { const res = await api("GET", "/project/api/assignable-users"); const users = res.users || []; - newProjMembersBox.innerHTML = users.length ? users.map(function (u) { - return '"; - }).join("") : "배정 가능한 직원이 없습니다."; + newProjMembersBox.innerHTML = users.length + ? users.map(memberPickHtml).join("") + : "배정 가능한 직원이 없습니다."; } catch (e) { newProjMembersBox.innerHTML = "불러오기 실패"; } @@ -2632,13 +2645,9 @@ const res = await api("GET", "/project/api/assignable-users"); const existing = new Set(members.map(function (m) { return m.user_email; })); const candidates = res.users.filter(function (u) { return !existing.has(u.email); }); - box.innerHTML = candidates.length ? candidates.map(function (u) { - return '"; - }).join("") : "배정 가능한 직원이 없습니다(권한 미부여 또는 전원 배정됨)"; + box.innerHTML = candidates.length + ? candidates.map(memberPickHtml).join("") + : "배정 가능한 직원이 없습니다(권한 미부여 또는 전원 배정됨)"; } catch (e) { box.innerHTML = "불러오기 실패: " + escapeHtml(e.message) + ""; }