From fa5b2e8fee9d58a6a358b86a69242d1bbd1d15a5 Mon Sep 17 00:00:00 2001 From: undefined Date: Sat, 19 Jun 2021 13:37:07 +0800 Subject: [PATCH] uiL rich media (problem) --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/model/setting.ts | 2 +- .../ui-default/components/media/media.page.js | 27 ++++++++++++++-- packages/ui-default/handler.js | 30 +++++++++++++----- packages/ui-default/package.json | 2 +- packages/ui-default/static/mstile-144x144.png | Bin 1383 -> 0 bytes .../ui-default/templates/layout/html5.html | 2 -- .../templates/partials/problem.html | 2 ++ 8 files changed, 51 insertions(+), 16 deletions(-) delete mode 100644 packages/ui-default/static/mstile-144x144.png create mode 100644 packages/ui-default/templates/partials/problem.html diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 503237f20..b4d331580 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.28.38", + "version": "2.28.39", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/model/setting.ts b/packages/hydrooj/src/model/setting.ts index 0f757a152..25e9c5b9a 100644 --- a/packages/hydrooj/src/model/setting.ts +++ b/packages/hydrooj/src/model/setting.ts @@ -156,7 +156,7 @@ DomainUserSetting( ); SystemSetting( - Setting('setting_file', 'file.endPoint', null, 'text', 'file.endPoint', 'Storage engine endPoint'), + Setting('setting_file', 'file.endPoint', 'http://127.0.0.1:9000', 'text', 'file.endPoint', 'Storage engine endPoint'), Setting('setting_file', 'file.accessKey', null, 'text', 'file.accessKey', 'Storage engine accessKey'), Setting('setting_file', 'file.secretKey', null, 'password', 'file.secretKey', 'Storage engine secret', FLAG_SECRET), Setting('setting_file', 'file.bucket', 'hydro', 'text', 'file.bucket', 'Storage engine bucket'), diff --git a/packages/ui-default/components/media/media.page.js b/packages/ui-default/components/media/media.page.js index cf3f58d57..5dc89a0d8 100644 --- a/packages/ui-default/components/media/media.page.js +++ b/packages/ui-default/components/media/media.page.js @@ -6,12 +6,33 @@ export default new AutoloadPage('media', async () => { const items = []; const resolvers = []; const users = $dom.find('div[data-user]'); - users.get().forEach((ele) => { - items.push({ type: 'user', id: $(ele).text() }); + const resolve = (ele, item) => { + items.push(item); resolvers.push((html) => $(ele).replaceWith($(html))); + }; + users.get().forEach((ele) => resolve(ele, { type: 'user', id: +$(ele).text() })); + $dom.find('.typo').get().forEach((el) => { + $(el).find('a[href]').get().forEach((ele) => { + let target = $(ele).attr('href'); + let { domainId } = UiContext; + if (target.startsWith(UiContext.url_prefix)) { + target.replace(UiContext.url_prefix, ''); + if (!target.startsWith('/')) target = `/${target}`; + } + if (!target.startsWith('/') || target.startsWith('//')) return; + if (target.startsWith('/d/')) { + const [, , domain, ...extra] = target.split('/'); + domainId = domain; + target = `/${extra.join('/')}`; + } + const [, category, data, extra] = target.split('/'); + if (!data) return; + if (category === 'user' && Number.isInteger(+data) && !extra) resolve(ele, { type: 'user', id: +data }); + if (category === 'p' && !extra) resolve(ele, { type: 'problem', id: data, domainId }); + }); }); if (!items.length) return; - const res = await request.post('/media', { items }); + const res = await request.post(`/d/${UiContext.domainId}/media`, { items }); for (let i = 0; i < res.length; i++) resolvers[i](res[i]); } diff --git a/packages/ui-default/handler.js b/packages/ui-default/handler.js index aad7ca6f6..704c0d97b 100644 --- a/packages/ui-default/handler.js +++ b/packages/ui-default/handler.js @@ -1,13 +1,15 @@ +/* eslint-disable no-return-await */ /* eslint-disable camelcase */ const { readdirSync, readFileSync } = require('fs'); const { join } = require('path'); const crypto = require('crypto'); const { tmpdir } = require('os'); const bus = require('hydrooj/dist/service/bus'); +const { PERM } = require('hydrooj/dist/model/builtin'); const markdown = require('./backendlib/markdown'); const { - system, domain, user, setting, + system, domain, user, setting, problem, } = global.Hydro.model; const { Route, Handler, UiContextBase } = global.Hydro.service.server; @@ -119,18 +121,30 @@ class MarkdownHandler extends Handler { } class RichMediaHandler extends Handler { - constructor(args) { - super(args); - this.noCheckPermView = true; + async renderUser(domainId, payload) { + let d = payload.domainId || domainId; + const cur = payload.domainId ? await user.getById(payload.domainId, this.user._id) : this.user; + if (!cur.hasPerm(PERM.PERM_VIEW)) d = domainId; + const udoc = Number.isNaN(+payload.id) ? await user.getByUname(d, payload.id) : await user.getById(d, +payload.id); + return await this.renderHTML('partials/user.html', { udoc }); + } + + async renderProblem(domainId, payload) { + const cur = payload.domainId ? await user.getById(payload.domainId, this.user._id) : this.user; + let pdoc = cur.hasPerm(PERM.PERM_VIEW | PERM.PERM_VIEW_PROBLEM) + ? await problem.get(domainId, payload.data) || problem.default + : problem.default; + if (pdoc.hidden && !cur.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN)) pdoc = problem.default; + return await this.renderHTML('partials/problem.html', { pdoc }); } async post({ domainId, items }) { const res = []; for (const item of items) { - if (item.type === 'user') { - const udoc = Number.isNaN(+item.id) ? await user.getByUname(domainId, item.id) : await user.getById(domainId, +item.id); - res.push(this.renderHTML('partials/user.html', { udoc })); - } else res.push(''); + if (item.domainId && item.domainId === domainId) delete item.domainId; + if (item.type === 'user') res.push(this.renderUser(domainId, item)); + else if (item.type === 'problem') res.push(this.renderProblem(domainId, item)); + else res.push(''); } this.response.body = await Promise.all(res); } diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 58b5f4b5c..a603702a2 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.11.25", + "version": "4.11.26", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/static/mstile-144x144.png b/packages/ui-default/static/mstile-144x144.png deleted file mode 100644 index c6b2101e0fd46c57927514f56e7a8a9c239bf545..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1383 zcmV-t1(^DYP)Px#Bv4FLMNDaN|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0|NsC0|7|JN%K!iX3v^OWQveYoyUp@`TR!2QxXm1%000DMNkl<@b*+BR~O6k9I-h-s6(6jPe07fh-N*QT+gd(lIyh9fLy znSZWW?d~k|=DjyCb0qNL?f1QTKW5f(`0LOU{`$T%@k+cB!&TX_1QNlvC6MSgErG;a zTcBRk5=cC?1sd1_`Ath8aWTfv7qbAUYR*~sQ3ODPtTCtDgFu0)NDH0-L8c--@q`A{ zHsU02e+h%kA}L+dg3Lt92`xyRn}8Y!$V8+>2LbgBKp77KMIX~EB@mF<;)CW

Bz6 zQBdD39Q7c+NdLl758{iI6F7)1(g^{&F$zZn)GeBXBLeb2n}j0*5=$oGh=Hmm;fR5{ ztO^hndM$`2(tS8$AW)?ID7_$P&?dlH9?f_y21qTF`DJA@cNie0m&hzDn>pz*KuVcB zP+gD`98eo_&=MGqIA}zq1`wx5EKs~m-tW$Vrl-O{@iLhM=wUb#pfg`Gc`V_3VC`<4M!3b`Px;@Y#D$eUpG`=x(1-g*Da+`$>B(YLXl<^ zGtL{ zQw3emp#gB12gn^c5P+x65(4<_@eI+PTe-$rMGvuFPB1!e;F|DJ^@&5mDX-tvY zU_+oY8xiROXmk;gJcibok|ok=sol&V8{o!)Dw#$iEJ(s!^MDRVbZ}pAlILER*o`gXhtx0(1z2aIK{{X%Ge_I)azl0n6XX z24!kEsH@j9s5^X#M4<0kUI0TK;x_F!&tgL^9!0lHXZuD|Gvkt=xJbRa<`{r}w0OI} z10LM5K=P*CsOt_mX!pzW*81`2QN z<1D2Jd~QFIk7XE1b%4Cl}NuB3bF1Iwd_|7{s}`dsw46 z1BOA#-!zAF;hOlu;9PO8q38z-J~23X+G7FdO8WL((F%tay2s*N+u_X89M+ZnBCSua z&WNAWHIlQz;LPsUY;dLz>BnMlrcbYH7C5tCUotS_L)}L98FG%<_bTZ6MROQ!$B@Ih z?WG$bamKqfc1aHNI&9t&hZ5;E`wlbX+2Nof`6e8sUG(1=y;Gr`CjIAT?`G&kGUe#T z7h{e_q%k;PFYI5MbD)XJzZ!!Bh!l*)QF}dByMbP<8nhem+B0qw813F994B#L)+R6- zn%<;u_T^vRmBGp1HJsh`guhbf|KKl&WVGnq`nZVz0038dR9JLUVRs;Ka&Km7Y-J#H zd2nSQX>fF7004NL