Disable TOTP
Enter master password to disable two-step verification.
'
- + (state.totpDisableError?'
'+esc(state.totpDisableError)+'
':'')
- + '
'
+ + '
Disable TOTP
Enter master password to disable two-step verification.
'
+ + (state.totpDisableError?'
'+esc(state.totpDisableError)+'
':'')
+ + '
'
+ '
';
}
function renderHelpTab(){
return ''
- + '
Upstream Sync
- Track upstream with a fork and scheduled sync workflow (recommended).
- Before merge: compare API routes, migration files, and auth logic changes.
- After merge: run local dev migration tests, then deploy Worker after validation.
'
- + '
Common Errors
- 401 Unauthorized: token expired or revoked, login again.
- 403 Account disabled: admin must unban user in User Management.
- 403 Invite invalid: invite expired/used/revoked, create a new invite.
- 429 Too many requests: wait retry seconds and avoid burst writes.
'
- + '
Troubleshooting
- Login OK but encrypted values shown: verify profile key and KDF settings are consistent.
- TOTP fails repeatedly: sync device time and re-scan QR using latest secret.
- Password change failed: ensure current password is correct and new password has at least 12 chars.
- Sync conflicts: refresh vault and retry one operation at a time.
';
+ + '
Help & Support
'
+ + '
Upstream Sync
- Track upstream with a fork and scheduled sync workflow (recommended).
- Before merge: compare API routes, migration files, and auth logic changes.
- After merge: run local dev migration tests, then deploy Worker after validation.
'
+ + '
Common Errors
- 401 Unauthorized: token expired or revoked, login again.
- 403 Account disabled: admin must unban user in User Management.
- 403 Invite invalid: invite expired/used/revoked, create a new invite.
- 429 Too many requests: wait retry seconds and avoid burst writes.
'
+ + '
Troubleshooting
- Login OK but encrypted values shown: verify profile key and KDF settings are consistent.
- TOTP fails repeatedly: sync device time and re-scan QR using latest secret.
- Password change failed: ensure current password is correct and new password has at least 12 chars.
- Sync conflicts: refresh vault and retry one operation at a time.
';
}
function renderAdminTab(){
var usersRows='';
for(var i=0;i
'+esc(u.email)+' | '+esc(u.name||'')+' | '+esc(u.role)+' | '+esc(u.status)+' | '
- + (canAct?'':'')
+ usersRows += ' | | '+esc(u.email)+' | '+esc(u.name||'')+' | '+esc(u.role)+' | '+esc(u.status)+' | '
+ + (canAct?'':'')
+ (canAct?' ':'')
+ ' |
';
}
- if(!usersRows) usersRows='| No users. |
';
+ if(!usersRows) usersRows='| No users found. |
';
var inviteRows='';
for(var j=0;j'+esc(inv.code)+' | '+esc(inv.status)+' | '+esc(inv.expiresAt)+' | '
- + ''
+ inviteRows += ' | '+esc(inv.code)+' | '+esc(inv.status)+' | '+esc(inv.expiresAt)+' | '
+ + ''
+ (inv.status==='active'?' ':'')
+ ' |
';
}
- if(!inviteRows) inviteRows='| No invites. |
';
+ if(!inviteRows) inviteRows='| No invites found. |
';
return ''
+ renderMsg()
- + ''
- + 'Users
| Email | Name | Role | Status | Action |
'+usersRows+'
'
- + 'Invites
| Code | Status | Expires At | Action |
'+inviteRows+'
';
+ + ''
+ + '
User Management
'
+ + ''
+ + ''
+ + ''
+ + 'Users
| Email | Name | Role | Status | Action |
'+usersRows+'
'
+ + 'Invites
| Code | Status | Expires At | Action |
'+inviteRows+'
';
}
function renderApp(){
@@ -534,18 +626,20 @@ function renderWebClientHTML(): string {
return ''
+ ''
+ ' '
+ + (showFolders?('
'):'')
+ '
'+content+''
+ '
'+renderTotpDisableModal()+'
';
}
function render(){
- if(state.phase==='loading'){ app.innerHTML=''; return; }
+ if(state.phase==='loading'){ app.innerHTML=''; return; }
if(state.phase==='register'){ app.innerHTML=renderRegisterScreen(); return; }
if(state.phase==='login'){ app.innerHTML=renderLoginScreen(); return; }
app.innerHTML=renderApp();