사용자 정보 팝오버 추가
This commit is contained in:
@@ -6,6 +6,7 @@ const loginForm = document.getElementById("login-form");
|
|||||||
const loginMessage = document.getElementById("login-message");
|
const loginMessage = document.getElementById("login-message");
|
||||||
const logoutBtn = document.getElementById("logout-btn");
|
const logoutBtn = document.getElementById("logout-btn");
|
||||||
const userBadge = document.getElementById("user-badge");
|
const userBadge = document.getElementById("user-badge");
|
||||||
|
const userPopover = document.getElementById("user-popover");
|
||||||
const currentViewTitle = document.getElementById("current-view-title");
|
const currentViewTitle = document.getElementById("current-view-title");
|
||||||
const navButtons = Array.from(document.querySelectorAll(".header-center [data-view]"));
|
const navButtons = Array.from(document.querySelectorAll(".header-center [data-view]"));
|
||||||
const organizationFrame = document.getElementById("organization-frame");
|
const organizationFrame = document.getElementById("organization-frame");
|
||||||
@@ -37,6 +38,14 @@ function clearSession() {
|
|||||||
sessionStorage.removeItem(sessionKey);
|
sessionStorage.removeItem(sessionKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function hideUserPopover() {
|
||||||
|
userPopover?.classList.add("hidden");
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleUserPopover() {
|
||||||
|
userPopover?.classList.toggle("hidden");
|
||||||
|
}
|
||||||
|
|
||||||
function setActiveView(view) {
|
function setActiveView(view) {
|
||||||
const previousView = currentView;
|
const previousView = currentView;
|
||||||
currentView = view in viewLabels ? view : "organization";
|
currentView = view in viewLabels ? view : "organization";
|
||||||
@@ -71,8 +80,29 @@ function renderAuth() {
|
|||||||
dashboardPanel.classList.toggle("hidden", !authenticated);
|
dashboardPanel.classList.toggle("hidden", !authenticated);
|
||||||
if (authenticated) {
|
if (authenticated) {
|
||||||
const displayName = session.user.display_name || "접속자";
|
const displayName = session.user.display_name || "접속자";
|
||||||
userBadge.innerHTML = `<span class="user-chip-icon">◎</span><span class="user-chip-text"><strong>${displayName}</strong><em>-</em></span>`;
|
const rank = "-";
|
||||||
|
userBadge.innerHTML = `<span class="user-chip-icon">◎</span><span class="user-chip-text"><strong>${displayName}</strong><em>${rank}</em></span>`;
|
||||||
userBadge.title = `${displayName} / -`;
|
userBadge.title = `${displayName} / -`;
|
||||||
|
if (userPopover) {
|
||||||
|
userPopover.innerHTML = `
|
||||||
|
<div class="user-popover-row">
|
||||||
|
<span class="user-popover-label">이름</span>
|
||||||
|
<strong>${displayName}</strong>
|
||||||
|
</div>
|
||||||
|
<div class="user-popover-row">
|
||||||
|
<span class="user-popover-label">직급</span>
|
||||||
|
<span>${rank}</span>
|
||||||
|
</div>
|
||||||
|
<div class="user-popover-row">
|
||||||
|
<span class="user-popover-label">권한</span>
|
||||||
|
<span>${session.user.role || "-"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="user-popover-row">
|
||||||
|
<span class="user-popover-label">아이디</span>
|
||||||
|
<span>${session.user.username || "-"}</span>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,15 +130,28 @@ if (loginForm) {
|
|||||||
if (logoutBtn) {
|
if (logoutBtn) {
|
||||||
logoutBtn.addEventListener("click", () => {
|
logoutBtn.addEventListener("click", () => {
|
||||||
clearSession();
|
clearSession();
|
||||||
|
hideUserPopover();
|
||||||
renderAuth();
|
renderAuth();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (userBadge) {
|
||||||
|
userBadge.addEventListener("click", (event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
toggleUserPopover();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
navButtons.forEach((button) => {
|
navButtons.forEach((button) => {
|
||||||
button.addEventListener("click", () => {
|
button.addEventListener("click", () => {
|
||||||
|
hideUserPopover();
|
||||||
setActiveView(button.dataset.view || "organization");
|
setActiveView(button.dataset.view || "organization");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document.addEventListener("click", () => {
|
||||||
|
hideUserPopover();
|
||||||
|
});
|
||||||
|
|
||||||
setActiveView(currentView);
|
setActiveView(currentView);
|
||||||
renderAuth();
|
renderAuth();
|
||||||
|
|||||||
@@ -51,6 +51,7 @@
|
|||||||
|
|
||||||
<div class="header-actions">
|
<div class="header-actions">
|
||||||
<button id="user-badge" class="ghost-button ghost-button-soft user-chip" type="button"></button>
|
<button id="user-badge" class="ghost-button ghost-button-soft user-chip" type="button"></button>
|
||||||
|
<div id="user-popover" class="user-popover hidden"></div>
|
||||||
<button id="logout-btn" class="ghost-button icon-button" type="button" title="로그아웃" aria-label="로그아웃">
|
<button id="logout-btn" class="ghost-button icon-button" type="button" title="로그아웃" aria-label="로그아웃">
|
||||||
<svg viewBox="0 0 24 24" aria-hidden="true">
|
<svg viewBox="0 0 24 24" aria-hidden="true">
|
||||||
<path d="M15 3h-4a2 2 0 0 0-2 2v3" />
|
<path d="M15 3h-4a2 2 0 0 0-2 2v3" />
|
||||||
|
|||||||
@@ -230,6 +230,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 6px;
|
gap: 6px;
|
||||||
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ghost-button {
|
.ghost-button {
|
||||||
@@ -252,6 +253,7 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-chip-icon {
|
.user-chip-icon {
|
||||||
@@ -305,6 +307,39 @@
|
|||||||
stroke-linejoin: round;
|
stroke-linejoin: round;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.user-popover {
|
||||||
|
position: absolute;
|
||||||
|
top: calc(100% + 10px);
|
||||||
|
right: 42px;
|
||||||
|
min-width: 220px;
|
||||||
|
padding: 14px;
|
||||||
|
border: 1px solid #dbe2ea;
|
||||||
|
border-radius: 16px;
|
||||||
|
background: rgba(255, 255, 255, 0.96);
|
||||||
|
box-shadow: 0 18px 36px rgba(15, 23, 42, 0.14);
|
||||||
|
backdrop-filter: blur(12px);
|
||||||
|
z-index: 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-popover-row {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
gap: 16px;
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 6px 0;
|
||||||
|
color: var(--color-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-popover-row + .user-popover-row {
|
||||||
|
border-top: 1px solid #eef2f7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-popover-label {
|
||||||
|
color: var(--color-text-muted);
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
.dashboard-main {
|
.dashboard-main {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-height: calc(100vh - 68px);
|
min-height: calc(100vh - 68px);
|
||||||
|
|||||||
Reference in New Issue
Block a user