fix auth registration and access management ui
This commit is contained in:
@@ -1222,6 +1222,11 @@ const SIDEBAR_TREE_JS: &str = r##"
|
||||
});
|
||||
}
|
||||
|
||||
function closeProfileDialog() {
|
||||
var existing = document.querySelector('[data-testid="mnote-profile-dialog"]');
|
||||
if (existing && existing.parentElement) existing.parentElement.removeChild(existing);
|
||||
}
|
||||
|
||||
function accountMenuFallbackSession() {
|
||||
var body = document.body instanceof HTMLElement ? document.body : null;
|
||||
var actorId = body ? String(body.getAttribute('data-mnote-actor-id') || '').trim() : '';
|
||||
@@ -1242,8 +1247,24 @@ const SIDEBAR_TREE_JS: &str = r##"
|
||||
var typeNode = menu.querySelector('[data-account-info="actor-type"]');
|
||||
if (nameNode) nameNode.textContent = session.name || session.userId || '当前用户';
|
||||
if (emailNode) emailNode.textContent = session.email || '未提供邮箱';
|
||||
if (idNode) idNode.textContent = session.userId || 'anonymous';
|
||||
if (idNode) {
|
||||
idNode.textContent = session.userId || 'anonymous';
|
||||
idNode.setAttribute('title', session.userId || 'anonymous');
|
||||
}
|
||||
if (typeNode) typeNode.textContent = session.actorType || session.authMode || 'unknown';
|
||||
var copyButton = menu.querySelector('[data-account-copy-user-id]');
|
||||
if (copyButton instanceof HTMLElement) {
|
||||
copyButton.dataset.copyValue = session.userId || 'anonymous';
|
||||
copyButton.setAttribute('title', '复制用户 ID');
|
||||
}
|
||||
}
|
||||
|
||||
function sessionIsAdmin(session) {
|
||||
return String(session && session.actorType || '').trim() === 'admin';
|
||||
}
|
||||
|
||||
function accessPolicyHrefForSession(session) {
|
||||
return sessionIsAdmin(session) ? '/admin/access-policy' : '/user/access-policy';
|
||||
}
|
||||
|
||||
async function loadAccountInfo(menu) {
|
||||
@@ -1261,6 +1282,70 @@ const SIDEBAR_TREE_JS: &str = r##"
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchAccountSession() {
|
||||
try {
|
||||
var response = await fetch('/api/auth/session', {
|
||||
method: 'GET',
|
||||
headers: { 'accept': 'application/json' },
|
||||
credentials: 'include'
|
||||
});
|
||||
var payload = await response.json().catch(function() { return null; });
|
||||
if (!response.ok || !payload) throw new Error('session_failed_' + response.status);
|
||||
return payload;
|
||||
} catch (_) {
|
||||
return accountMenuFallbackSession();
|
||||
}
|
||||
}
|
||||
|
||||
function openProfileDialog(session) {
|
||||
closeProfileDialog();
|
||||
closeAccountMenu();
|
||||
var dialog = document.createElement('div');
|
||||
dialog.className = 'mnote-profile-dialog';
|
||||
dialog.setAttribute('data-testid', 'mnote-profile-dialog');
|
||||
dialog.setAttribute('role', 'dialog');
|
||||
dialog.setAttribute('aria-modal', 'true');
|
||||
dialog.setAttribute('aria-labelledby', 'mnote-profile-dialog-title');
|
||||
var userId = escapeHtml(session.userId || 'anonymous');
|
||||
dialog.innerHTML =
|
||||
'<div class="mnote-profile-dialog__backdrop" data-profile-dialog-close></div>' +
|
||||
'<section class="mnote-profile-dialog__panel">' +
|
||||
'<header class="mnote-profile-dialog__header">' +
|
||||
'<div>' +
|
||||
'<div class="mnote-profile-dialog__eyebrow">个人信息</div>' +
|
||||
'<h2 id="mnote-profile-dialog-title">个人信息</h2>' +
|
||||
'</div>' +
|
||||
'<button type="button" class="mnote-profile-dialog__close" data-profile-dialog-close aria-label="关闭"><span class="material-symbols-outlined" data-icon="close" aria-hidden="true"></span></button>' +
|
||||
'</header>' +
|
||||
'<div class="mnote-profile-dialog__identity">' +
|
||||
'<div class="mnote-profile-dialog__avatar">' + escapeHtml(String(session.name || session.email || session.userId || '用').slice(0, 1).toUpperCase()) + '</div>' +
|
||||
'<div><strong>' + escapeHtml(session.name || session.userId || '当前用户') + '</strong><span>' + escapeHtml(session.email || '未提供邮箱') + '</span></div>' +
|
||||
'</div>' +
|
||||
'<dl class="mnote-profile-dialog__list">' +
|
||||
'<div><dt>用户名</dt><dd>' + escapeHtml(session.name || '未设置') + '</dd></div>' +
|
||||
'<div><dt>邮箱</dt><dd>' + escapeHtml(session.email || '未提供邮箱') + '</dd></div>' +
|
||||
'<div><dt>用户 ID</dt><dd><code title="' + userId + '">' + userId + '</code><button type="button" data-profile-copy-user-id data-copy-value="' + userId + '"><span class="material-symbols-outlined" data-icon="content_copy" aria-hidden="true"></span></button></dd></div>' +
|
||||
'<div><dt>身份</dt><dd>' + escapeHtml(session.actorType || session.authMode || 'unknown') + '</dd></div>' +
|
||||
'</dl>' +
|
||||
'</section>';
|
||||
dialog.querySelectorAll('[data-profile-dialog-close]').forEach(function(button) {
|
||||
button.addEventListener('click', function(event) {
|
||||
event.preventDefault();
|
||||
closeProfileDialog();
|
||||
});
|
||||
});
|
||||
var copyButton = dialog.querySelector('[data-profile-copy-user-id]');
|
||||
if (copyButton) {
|
||||
copyButton.addEventListener('click', function(event) {
|
||||
event.preventDefault();
|
||||
void copyTreeContextValue(copyButton.getAttribute('data-copy-value') || '', 'profile-user-id');
|
||||
});
|
||||
}
|
||||
document.body.appendChild(dialog);
|
||||
var closeButton = dialog.querySelector('.mnote-profile-dialog__close');
|
||||
if (closeButton instanceof HTMLElement) closeButton.focus();
|
||||
}
|
||||
|
||||
async function signOutAccount(trigger) {
|
||||
setCommandPending(trigger, true);
|
||||
try {
|
||||
@@ -1296,16 +1381,22 @@ const SIDEBAR_TREE_JS: &str = r##"
|
||||
menu.setAttribute('data-testid', 'mnote-account-menu');
|
||||
menu.setAttribute('role', 'menu');
|
||||
menu.innerHTML =
|
||||
'<div class="mnote-account-menu__profile" role="group" aria-label="个人信息">' +
|
||||
'<div class="mnote-account-menu__title">个人设置</div>' +
|
||||
'<div class="mnote-account-menu__name" data-account-info="name">正在读取...</div>' +
|
||||
'<div class="mnote-account-menu__row"><span>邮箱</span><strong data-account-info="email">正在读取...</strong></div>' +
|
||||
'<div class="mnote-account-menu__row"><span>用户 ID</span><strong data-account-info="user-id">正在读取...</strong></div>' +
|
||||
'<div class="mnote-account-menu__row"><span>身份</span><strong data-account-info="actor-type">正在读取...</strong></div>' +
|
||||
'</div>' +
|
||||
'<div class="mnote-account-menu__separator" aria-hidden="true"></div>' +
|
||||
'<button type="button" class="mnote-workspace-source-menu__item mnote-account-menu__item" data-testid="mnote-account-profile" role="menuitem"><span class="material-symbols-outlined" data-icon="account_circle" aria-hidden="true"></span><span>个人信息</span></button>' +
|
||||
'<a class="mnote-workspace-source-menu__item mnote-account-menu__item" data-testid="mnote-account-access-policy" role="menuitem" href="/user/access-policy"><span class="material-symbols-outlined" data-icon="admin_panel_settings" aria-hidden="true"></span><span>授权管理</span></a>' +
|
||||
'<button type="button" class="mnote-workspace-source-menu__item mnote-account-menu__logout" data-testid="mnote-account-sign-out" role="menuitem">退出登录</button>' +
|
||||
'<div class="mnote-account-menu__error" data-account-error hidden></div>';
|
||||
var sessionPromise = fetchAccountSession();
|
||||
var profileButton = menu.querySelector('[data-testid="mnote-account-profile"]');
|
||||
if (profileButton) {
|
||||
profileButton.addEventListener('click', function(event) {
|
||||
event.preventDefault();
|
||||
sessionPromise.then(openProfileDialog);
|
||||
});
|
||||
}
|
||||
var accessPolicyLink = menu.querySelector('[data-testid="mnote-account-access-policy"]');
|
||||
sessionPromise.then(function(session) {
|
||||
if (accessPolicyLink instanceof HTMLElement) accessPolicyLink.setAttribute('href', accessPolicyHrefForSession(session));
|
||||
});
|
||||
var signOutButton = menu.querySelector('[data-testid="mnote-account-sign-out"]');
|
||||
if (signOutButton) {
|
||||
signOutButton.addEventListener('click', function(event) {
|
||||
@@ -1315,7 +1406,6 @@ const SIDEBAR_TREE_JS: &str = r##"
|
||||
}
|
||||
var host = trigger.closest('[data-testid="wolai-sidebar-quick-actions"]') || trigger.parentElement;
|
||||
if (host) host.appendChild(menu);
|
||||
void loadAccountInfo(menu);
|
||||
}
|
||||
|
||||
autoOpenRecentLocalRootOnHome();
|
||||
|
||||
Reference in New Issue
Block a user