diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index c93eff5a2..a7e04f2c5 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "3.1.13", + "version": "3.1.14", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/handler/misc.ts b/packages/hydrooj/src/handler/misc.ts index 4cde20d86..8e7fac3ef 100644 --- a/packages/hydrooj/src/handler/misc.ts +++ b/packages/hydrooj/src/handler/misc.ts @@ -115,10 +115,19 @@ export class FSDownloadHandler extends Handler { } } +export class SwitchAccountHandler extends Handler { + @param('uid', Types.Int) + async get(domainId: string, uid: number) { + this.session.uid = uid; + this.back(); + } +} + export async function apply() { Route('switch_language', '/language/:lang', SwitchLanguageHandler); Route('home_files', '/file', FilesHandler, PRIV.PRIV_CREATE_FILE); Route('fs_download', '/file/:uid/:filename', FSDownloadHandler); + Route('switch_account', '/account', SwitchAccountHandler, PRIV.PRIV_EDIT_SYSTEM); } global.Hydro.handler.misc = apply; diff --git a/packages/ui-default/components/navigation/navigation.page.js b/packages/ui-default/components/navigation/navigation.page.js index a1a3eb730..ec1517b33 100644 --- a/packages/ui-default/components/navigation/navigation.page.js +++ b/packages/ui-default/components/navigation/navigation.page.js @@ -1,7 +1,12 @@ import Slideout from 'slideout'; - -import { AutoloadPage } from 'vj/misc/Page'; +import createHint from 'vj/components/hint'; +import tpl from 'vj/utils/tpl'; +import i18n from 'vj/utils/i18n'; import request from 'vj/utils/request'; +import { ActionDialog } from 'vj/components/dialog'; +import Notification from 'vj/components/notification'; +import UserSelectAutoComplete from 'vj/components/autocomplete/UserSelectAutoComplete'; +import { AutoloadPage } from 'vj/misc/Page'; function handleNavLogoutClick(ev) { const $logoutLink = $(ev.currentTarget); @@ -10,11 +15,54 @@ function handleNavLogoutClick(ev) { .then(() => window.location.reload()); ev.preventDefault(); } +function handlerSwitchAccount(ev) { + let userSelector; + const promise = new ActionDialog({ + $body: tpl` +
+
+

${i18n('Select User')}

+
+
+
+ +
+
+
+ `, + onDispatch(action) { + console.log(action, userSelector.value()); + if (action === 'ok' && userSelector.value() === null) { + userSelector.focus(); + return false; + } + return true; + }, + }).open(); + userSelector = UserSelectAutoComplete.getOrConstruct($('[name="switch_account_target"]')); + createHint('Hint::icon::switch_account', $('[name="select_user_text"]')); + promise.then(async (action) => { + if (action !== 'ok') return; + const target = userSelector.value(); + if (!target) return; + try { + await request.get('/account', { uid: target._id }); + window.location.reload(); + } catch (error) { + Notification.error(error.message); + } + }); + ev.preventDefault(); +} const navigationPage = new AutoloadPage('navigationPage', () => { if (!document.getElementById('panel') || !document.getElementById('menu')) return; $(document).on('click', '[name="nav_logout"]', handleNavLogoutClick); + $(document).on('click', '[name="nav_switch_account"]', handlerSwitchAccount); const slideout = new Slideout({ panel: document.getElementById('panel'), diff --git a/packages/ui-default/locales/en.yaml b/packages/ui-default/locales/en.yaml index a48f392e0..cb3ed5383 100644 --- a/packages/ui-default/locales/en.yaml +++ b/packages/ui-default/locales/en.yaml @@ -3,6 +3,7 @@ Can be Extended For: Extension Current Status: Status Handled Requests: Req Hint::icon::difficulty: The difficulty of the problems in Hydro will be calculated by algorithm, depending on current submission, sometimes the difficulty may not so exact. +Hint::icon::switch_account: As a superadmin, you can switch to anyone's account. manage: System Manage no_translation_warn:
This part of content is under translation.
page.problem_detail.sidebar.show_category: Click to Show diff --git a/packages/ui-default/locales/zh.yaml b/packages/ui-default/locales/zh.yaml index 3966095e8..0b879cb18 100644 --- a/packages/ui-default/locales/zh.yaml +++ b/packages/ui-default/locales/zh.yaml @@ -341,6 +341,7 @@ Highlight discussions: 高亮讨论 Highlight: 高亮 Hint: 提示 Hint::icon::difficulty: Hydro 中题目的难度,根据递交数、通过率以及每个递交的递交时间和评测结果,综合计算得出,可能不准确。 +Hint::icon::switch_account: 作为超级管理员,您可以直接切换到其他人的账户。 Hint::icon::testdata: 请参照文档说明 Hint::page::main: 欢迎来到 Hydro! 您可在右上角注册或登录。此类提示仅会显示一次。 Hint::page::problem_detail: 这是题目详情页面。您可点击右侧“进入在线编程模式"开始编写您的代码。 @@ -728,6 +729,7 @@ Submit: 递交 Submitted: 已递交 SuperUser: 超级管理员 Support: 支持 +Switch account: 切换账户 Tags: 标签 tasks_list: 任务列表 Technical Information: 技术信息 diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 2ec5e3fd0..db13e8d46 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.26.7", + "version": "4.26.8", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/templates/partials/nav.html b/packages/ui-default/templates/partials/nav.html index 8b3752e2b..357f08825 100644 --- a/packages/ui-default/templates/partials/nav.html +++ b/packages/ui-default/templates/partials/nav.html @@ -79,6 +79,13 @@ {% endif %} + {% if handler.user.hasPriv(PRIV.PRIV_EDIT_SYSTEM) %} + + {% endif %}