feat(project): 담당자는 아이디만 표기 + 구글 머티리얼 아이콘
담당자 표시를 이메일 아이디(@ 앞)로 통일. 아바타를 letter 원형에서 구글 Material Symbols account_circle 아이콘으로 교체(멤버 목록·보드 카드· 모달 선택지·리스트 뷰). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -67,8 +67,11 @@
|
||||
.pj-sub-dot { width: 8px; height: 8px; border-radius: 50%; }
|
||||
.pj-member-name { font-size: 13px; flex: 1; }
|
||||
|
||||
.pj-avatar { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; background: #d6e0f5; color: #2b4a85; font-size: 11px; font-weight: 700; flex: 0 0 auto; }
|
||||
.pj-avatar-sm { width: 20px; height: 20px; font-size: 10px; }
|
||||
/* 구글 머티리얼 심볼 아이콘(담당자) */
|
||||
.material-symbols-outlined { font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24; line-height: 1; vertical-align: middle; }
|
||||
.pj-gicon { font-size: 24px; color: #5f6368; flex: 0 0 auto; }
|
||||
.pj-gicon-sm { font-size: 20px; }
|
||||
.pj-assignee { display: inline-flex; align-items: center; gap: 3px; font-size: 12px; color: #5f6368; }
|
||||
|
||||
/* ── 툴바 + 탭 ── */
|
||||
.pj-toolbar { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }
|
||||
|
||||
@@ -204,7 +204,10 @@
|
||||
(t.priority && t.priority !== "normal"
|
||||
? '<span class="pj-pri pj-pri-' + t.priority + '">' + (priorityLabels[t.priority] || t.priority) + "</span>"
|
||||
: "") +
|
||||
(t.assignee_email ? '<span class="pj-avatar pj-avatar-sm">' + escapeHtml((t.assignee_name || t.assignee_email)[0].toUpperCase()) + "</span>" : "") +
|
||||
(t.assignee_email
|
||||
? '<span class="pj-assignee"><span class="material-symbols-outlined pj-gicon pj-gicon-sm">account_circle</span>' +
|
||||
escapeHtml(idOf(t.assignee_email)) + "</span>"
|
||||
: "") +
|
||||
(t.due_date ? '<span class="pj-card-due">' + t.due_date + "</span>" : "") +
|
||||
"</div>";
|
||||
card.addEventListener("click", function () { if (canManage) openTaskModal(t); });
|
||||
@@ -244,7 +247,7 @@
|
||||
if (t.completed_at) tr.className = "is-done";
|
||||
tr.innerHTML =
|
||||
"<td>" + escapeHtml(t.title) + "</td>" +
|
||||
"<td>" + escapeHtml(t.assignee_name || t.assignee_email || "-") + "</td>" +
|
||||
"<td>" + (t.assignee_email ? escapeHtml(idOf(t.assignee_email)) : "-") + "</td>" +
|
||||
"<td>" + escapeHtml(t.stage_name || "-") + "</td>" +
|
||||
"<td>" + (priorityLabels[t.priority] || t.priority || "-") + "</td>" +
|
||||
"<td>" + (t.start_date || "-") + "</td>" +
|
||||
@@ -367,6 +370,10 @@
|
||||
wireCalendar();
|
||||
}
|
||||
|
||||
function idOf(email) {
|
||||
return String(email == null ? "" : email).split("@")[0];
|
||||
}
|
||||
|
||||
function escapeHtml(s) {
|
||||
return String(s == null ? "" : s)
|
||||
.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")
|
||||
|
||||
Reference in New Issue
Block a user