fix auth registration and access management ui

This commit is contained in:
lix-2026
2026-05-22 01:47:40 +08:00
parent fdb20300e9
commit 531e845600
16 changed files with 1316 additions and 410 deletions
+100 -10
View File
@@ -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();