diff --git a/packages/onlyoffice/frontend/office.page.ts b/packages/onlyoffice/frontend/office.page.ts index 9ca481af2..e5e2aada4 100644 --- a/packages/onlyoffice/frontend/office.page.ts +++ b/packages/onlyoffice/frontend/office.page.ts @@ -35,9 +35,9 @@ const loader = (mode) => async (element) => { const getEles = (types: string[]) => types.flatMap((type) => $(`div[data-${type}]`).get()); addPage(new AutoloadPage('onlyoffice', async () => { - const all = getEles(['doc', 'docx', 'cell', 'xls', 'xlsx', 'slide', 'ppt', 'pptx']); + const all = getEles(['doc', 'docx', 'cell', 'xls', 'xlsx', 'slide', 'ppt', 'pptx', 'pdf']); if (all.length) await load(); - getEles(['doc', 'docx']).forEach(loader('word')); + getEles(['doc', 'docx', 'pdf']).forEach(loader('word')); getEles(['cell', 'xls', 'xlsx']).forEach(loader('cell')); getEles(['slide', 'ppt', 'pptx']).forEach(loader('slide')); })); diff --git a/packages/onlyoffice/index.ts b/packages/onlyoffice/index.ts index 5e7d04d89..621a853a2 100644 --- a/packages/onlyoffice/index.ts +++ b/packages/onlyoffice/index.ts @@ -1,4 +1,5 @@ import { sign } from 'jsonwebtoken'; +import { } from '@hydrooj/ui-default/backendlib/markdown-it-media'; import { Context, Handler, SystemModel, UiContextBase, } from 'hydrooj'; @@ -15,6 +16,7 @@ class OnlyofficeJWTHandler extends Handler { async get({ url }) { const path = new URL(url).pathname; + const allowDownload = !!SystemModel.get('onlyoffice.allowDownload'); const payload = { document: { fileType: path.split('.').pop(), @@ -23,19 +25,19 @@ class OnlyofficeJWTHandler extends Handler { url, permissions: { comment: false, - copy: true, - download: true, + copy: allowDownload, + download: allowDownload, edit: false, fillForms: false, modifyContentControl: false, modifyFilter: false, - print: true, + print: allowDownload, protect: false, review: false, }, }, editorConfig: { - lang: this.user.viewLang.includes('_') ? this.user.viewLang.split('_')[0] : this.user.viewLang, + lang: this.user.viewLang?.includes('_') ? this.user.viewLang.split('_')[0] : this.user.viewLang || 'zh', mode: 'view', user: { group: 'Hydro', @@ -73,4 +75,11 @@ export function apply(ctx: Context) { }); }); ctx.Route('onlyoffice-jwt', '/onlyoffice-jwt', OnlyofficeJWTHandler); + if (SystemModel.get('onlyoffice.pdf')) { + ctx.provideModule('richmedia', 'pdf', { + get(service, src, md) { + return `
${md.utils.escapeHtml(src)}
`; + }, + }); + } } diff --git a/packages/onlyoffice/setting.yaml b/packages/onlyoffice/setting.yaml index 42bb9d557..9ca0b5d66 100644 --- a/packages/onlyoffice/setting.yaml +++ b/packages/onlyoffice/setting.yaml @@ -7,4 +7,9 @@ jwtsecret: type: text name: jwtsecret desc: JWT Secret - default: secret \ No newline at end of file + default: secret +pdf: + type: boolean + name: pdf + desc: Handle pdf documents + default: false diff --git a/packages/ui-default/backendlib/markdown-it-media.ts b/packages/ui-default/backendlib/markdown-it-media.ts index eba2430f5..98fcf68aa 100644 --- a/packages/ui-default/backendlib/markdown-it-media.ts +++ b/packages/ui-default/backendlib/markdown-it-media.ts @@ -83,7 +83,7 @@ function resourceUrl(service: string, src: string, url: string) { declare module 'hydrooj' { interface ModuleInterfaces { richmedia: { - get: (src: string) => string | null; + get: (service: string, src: string, md: MarkdownIt) => string | null; } } } @@ -94,7 +94,7 @@ export function Media(md: MarkdownIt) { let src = md.utils.escapeHtml(tokens[idx].attrGet('src')); const service = md.utils.escapeHtml(tokens[idx].attrGet('service')).toLowerCase(); if (Hydro.module.richmedia?.[service]) { - const result = Hydro.module.richmedia[service].get(src); + const result = Hydro.module.richmedia[service].get(service, src, md); if (result) return result; } if (service === 'pdf') { diff --git a/packages/ui-default/components/notification/index.ts b/packages/ui-default/components/notification/index.ts index f1ad49f2b..bb74fb19a 100644 --- a/packages/ui-default/components/notification/index.ts +++ b/packages/ui-default/components/notification/index.ts @@ -1,18 +1,18 @@ -import { Intent, Position, Toaster } from '@blueprintjs/core'; +import { Intent, OverlayToaster, Position } from '@blueprintjs/core'; import $ from 'jquery'; import { tpl, zIndexManager } from 'vj/utils/base'; const ToasterContainer = document.createElement('div'); ToasterContainer.style.position = 'fixed'; ToasterContainer.style.bottom = '0px'; +ToasterContainer.style.width = '100%'; ToasterContainer.style.zIndex = '9999'; document.body.append(ToasterContainer); -export const AppToaster = Toaster.create({ - className: 'recipe-toaster', - position: Position.LEFT_BOTTOM, - usePortal: true, -} as any, ToasterContainer); +const AppToaster = OverlayToaster.createAsync( + { position: Position.BOTTOM_LEFT, usePortal: false }, + { container: ToasterContainer }, +); interface NotificationOptions { avatar?: string; @@ -65,20 +65,20 @@ export default class Notification { setTimeout(() => this.$n.remove(), 200); } - static success(message: string, duration?: number) { - return AppToaster.show({ message, timeout: duration, intent: Intent.SUCCESS }); + static async success(message: string, duration?: number) { + return (await AppToaster).show({ message, timeout: duration, intent: Intent.SUCCESS }); } - static info(message: string, duration?: number) { - return AppToaster.show({ message, timeout: duration, intent: Intent.PRIMARY }); + static async info(message: string, duration?: number) { + return (await AppToaster).show({ message, timeout: duration, intent: Intent.PRIMARY }); } - static warn(message: string, duration?: number) { - return AppToaster.show({ message, timeout: duration, intent: Intent.WARNING }); + static async warn(message: string, duration?: number) { + return (await AppToaster).show({ message, timeout: duration, intent: Intent.WARNING }); } - static error(message: string, duration?: number) { - return AppToaster.show({ message, timeout: duration, intent: Intent.DANGER }); + static async error(message: string, duration?: number) { + return (await AppToaster).show({ message, timeout: duration, intent: Intent.DANGER }); } } diff --git a/packages/ui-default/misc/typography.styl b/packages/ui-default/misc/typography.styl index 659a3d7ec..03e804089 100644 --- a/packages/ui-default/misc/typography.styl +++ b/packages/ui-default/misc/typography.styl @@ -261,7 +261,7 @@ small, figcaption .typo word-wrap() - overflow: auto + overflow: auto hidden; .typo a, .typo .link, .typo-a &, &:visited, &:active, &:hover