feat(wopi): edit WOPI related settings

This commit is contained in:
HFO4 2023-01-09 19:32:15 +08:00
parent b5d38e3cf7
commit d72688d7fc
6 changed files with 159 additions and 32 deletions

View File

@ -140,8 +140,8 @@
"transitParallelNumDes": "Maximum number of parallel co-processes for transfer tasks.",
"tempFolder": "Temp folder",
"tempFolderDes": "Used to store temporary files generated by tasks such as decompression, compression, etc.",
"textEditMaxSize": "Max size of editable text files",
"textEditMaxSizeDes": "The maximum size of a text file that can be edited online, files beyond this size cannot be edited online.",
"textEditMaxSize": "Max size of editable document files",
"textEditMaxSizeDes": "The maximum size of a document file that can be edited online, files beyond this size cannot be edited online. This setting applies to plain text, code and Office documents (WOPI).",
"failedChunkRetry": "Max chunk error retries",
"failedChunkRetryDes": "Maximum number of retries after a failed chunk, only for server-side uploads or transferring.",
"cacheChunks": "Cache chunk for retries",
@ -260,7 +260,15 @@
"tCaptchaSecretKey": "App Secret Key",
"tCaptchaSecretKeyDes": "You can find it at <0>Captcha Management Page</0>.",
"staticResourceCache": "Public static resources cache",
"staticResourceCacheDes": "Max age of cache for public accessible static resources (e.g. local policy source link, download link)."
"staticResourceCacheDes": "Max age of cache for public accessible static resources (e.g. local policy source link, download link).",
"wopiClient": "WOPI Client",
"wopiClientDes": "Extend Cloudreve's document online preview and editing capabilities by interfacing with online document processing systems that support the WOPI protocol. For more information, please refer to <0>Official Documentation</0>.",
"wopiDocLink": "https://docs.cloudreve.org/v/en/use/wopi",
"enableWopi": "Enable WOPI",
"wopiEndpoint": "WOPI Discovery Endpoint",
"wopiEndpointDes": "Endpoint URL of WOPI Discovery API.",
"wopiSessionTtl": "Edit session TTL (seconds)",
"wopiSessionTtlDes": "The user opens an online editing document session with an expiration date, beyond which the session cannot continue to save new changes."
},
"policy": {
"sharp": "#",

View File

@ -140,8 +140,8 @@
"transitParallelNumDes": "任务队列中转任务传输时,最大并行协程数",
"tempFolder": "临时目录",
"tempFolderDes": "用于存放解压缩、压缩等任务产生的临时文件的目录路径",
"textEditMaxSize": "文本文件在线编辑大小",
"textEditMaxSizeDes": "文文件可在线编辑的最大大小,超出此大小的文件无法在线编辑",
"textEditMaxSize": "文档在线编辑最大尺寸",
"textEditMaxSizeDes": "文文件可在线编辑的最大大小,超出此大小的文件无法在线编辑。此项设置适用于纯文本文件、代码文件、Office 文档 WOPI",
"failedChunkRetry": "分片错误重试",
"failedChunkRetryDes": "分片上传失败后重试的最大次数,只适用于服务端上传或中转",
"cacheChunks": "缓存流式分片文件以用于重试",
@ -260,7 +260,15 @@
"tCaptchaSecretKey": "App Secret Key",
"tCaptchaSecretKeyDes": "<0>图形验证页面</0> 获取到的的 App Secret Key",
"staticResourceCache": "静态公共资源缓存",
"staticResourceCacheDes": "公共可访问的静态资源(如:本机策略直链、文件下载链接)的缓存有效期"
"staticResourceCacheDes": "公共可访问的静态资源(如:本机策略直链、文件下载链接)的缓存有效期",
"wopiClient": "WOPI 客户端",
"wopiClientDes": "通过对接支持 WOPI 协议的在线文档处理系统,扩展 Cloudreve 的文档在线预览和编辑能力。详情请参考 <0>官方文档</0>。",
"wopiDocLink": "https://docs.cloudreve.org/use/wopi",
"enableWopi": "使用 WOPI",
"wopiEndpoint": "WOPI Discovery Endpoint",
"wopiEndpointDes": "WOPI 客户端发现 API 的端点地址",
"wopiSessionTtl": "编辑会话有效期(秒)",
"wopiSessionTtlDes": "用户打开在线编辑文档会话的有效期,超出此期限的会话无法继续保存新更改"
},
"policy": {
"sharp": "#",

View File

@ -140,8 +140,8 @@
"transitParallelNumDes": "任務隊列中轉任務傳輸時,最大並行協程數",
"tempFolder": "臨時目錄",
"tempFolderDes": "用於存放解壓縮、壓縮等任務產生的臨時文件的目錄路徑",
"textEditMaxSize": "文本文件線上編輯大小",
"textEditMaxSizeDes": "文本文件可線上編輯的最大大小,超出此大小的文件無法線編輯",
"textEditMaxSize": "文檔在線編輯最大尺寸",
"textEditMaxSizeDes": "文檔文件可在線編輯的最大大小,超出此大小的文件無法線編輯。此項設置適用於純文本文件、代碼文件、Office 文檔 WOPI",
"failedChunkRetry": "分片錯誤重試",
"failedChunkRetryDes": "分片上傳失敗後重試的最大次數,只適用於服務端上傳或中轉",
"cacheChunks": "快取流式分片文件以用於重試",
@ -260,7 +260,15 @@
"tCaptchaSecretKey": "App Secret Key",
"tCaptchaSecretKeyDes": "<0>圖形驗證頁面</0> 獲取到的的 App Secret Key",
"staticResourceCache": "靜態公共資源快取",
"staticResourceCacheDes": "公共可訪問的靜態資源(如:本機策略直鏈、文件下載連接)的快取有效期"
"staticResourceCacheDes": "公共可訪問的靜態資源(如:本機策略直鏈、文件下載連接)的快取有效期",
"wopiClient": "WOPI 客戶端",
"wopiClientDes": "通過對接支持 WOPI 協議的在線文檔處理系統,擴展 Cloudreve 的文檔在線預覽和編輯能力。詳情請參考 <0>官方文檔</0>。",
"wopiDocLink": "https://docs.cloudreve.org/use/wopi",
"enableWopi": "使用 WOPI",
"wopiEndpoint": "WOPI Discovery Endpoint",
"wopiEndpointDes": "WOPI 客戶端發現 API 的端點地址",
"wopiSessionTtl": "編輯會話有效期(秒)",
"wopiSessionTtlDes": "用戶打開在線編輯文檔會話的有效期,超出此期限的會話無法繼續保存新更改"
},
"policy": {
"sharp": "#",

View File

@ -13,7 +13,8 @@ import SizeInput from "../Common/SizeInput";
import Alert from "@material-ui/lab/Alert";
import FormControlLabel from "@material-ui/core/FormControlLabel";
import Switch from "@material-ui/core/Switch";
import { useTranslation } from "react-i18next";
import { Trans, useTranslation } from "react-i18next";
import Link from "@material-ui/core/Link";
const useStyles = makeStyles((theme) => ({
root: {
@ -53,6 +54,10 @@ export default function ImageSetting() {
thumb_encode_method: "",
thumb_gc_after_gen: "0",
thumb_encode_quality: "",
maxEditSize: "",
wopi_enabled: "0",
wopi_endpoint: "",
wopi_session_timeout: "0",
});
const handleChange = (name) => (event) => {
@ -82,6 +87,17 @@ export default function ImageSetting() {
// eslint-disable-next-line
}, []);
const reload = () => {
API.get("/admin/reload/wopi")
// eslint-disable-next-line @typescript-eslint/no-empty-function
.then(() => {})
.catch((error) => {
ToggleSnackbar("top", "right", error.message, "error");
})
// eslint-disable-next-line @typescript-eslint/no-empty-function
.then(() => {});
};
const submit = (e) => {
e.preventDefault();
setLoading(true);
@ -97,6 +113,7 @@ export default function ImageSetting() {
})
.then(() => {
ToggleSnackbar("top", "right", t("saved"), "success");
reload();
})
.catch((error) => {
ToggleSnackbar("top", "right", error.message, "error");
@ -236,7 +253,7 @@ export default function ImageSetting() {
<div className={classes.formContainer}>
<div className={classes.form}>
<FormControl>
<FormControl fullWidth>
<InputLabel htmlFor="component-helper">
{t("officePreviewService")}
</InputLabel>
@ -261,6 +278,109 @@ export default function ImageSetting() {
</FormHelperText>
</FormControl>
</div>
<div className={classes.form}>
<FormControl>
{options.maxEditSize !== "" && (
<SizeInput
value={options.maxEditSize}
onChange={handleChange("maxEditSize")}
required
min={0}
max={2147483647}
label={t("textEditMaxSize")}
/>
)}
<FormHelperText id="component-helper-text">
{t("textEditMaxSizeDes")}
</FormHelperText>
</FormControl>
</div>
</div>
</div>
<div className={classes.root}>
<Typography variant="h6" gutterBottom>
{t("wopiClient")}
</Typography>
<div className={classes.formContainer}>
<div className={classes.form}>
<Alert severity="info">
<Trans
ns={"dashboard"}
i18nKey={"settings.wopiClientDes"}
components={[
<Link
key={0}
target={"_blank"}
href={t("wopiDocLink")}
/>,
]}
/>
</Alert>
</div>
<div className={classes.form}>
<FormControl fullWidth>
<FormControlLabel
control={
<Switch
checked={
options.wopi_enabled === "1"
}
onChange={handleCheckChange(
"wopi_enabled"
)}
/>
}
label={t("enableWopi")}
/>
</FormControl>
</div>
{options.wopi_enabled === "1" && (
<>
<div className={classes.form}>
<FormControl fullWidth>
<InputLabel htmlFor="component-helper">
{t("wopiEndpoint")}
</InputLabel>
<Input
value={options.wopi_endpoint}
onChange={handleChange(
"wopi_endpoint"
)}
required
/>
<FormHelperText id="component-helper-text">
{t("wopiEndpointDes")}
</FormHelperText>
</FormControl>
</div>
<div className={classes.form}>
<FormControl fullWidth>
<InputLabel htmlFor="component-helper">
{t("wopiSessionTtl")}
</InputLabel>
<Input
inputProps={{ min: 1, step: 1 }}
type={"number"}
value={options.wopi_session_timeout}
onChange={handleChange(
"wopi_session_timeout"
)}
required
/>
<FormHelperText id="component-helper-text">
{t("wopiSessionTtlDes")}
</FormHelperText>
</FormControl>
</div>
</>
)}
</div>
</div>

View File

@ -41,7 +41,6 @@ export default function UploadDownload() {
max_worker_num: "1",
max_parallel_transfer: "1",
temp_path: "",
maxEditSize: "",
chunk_retries: "0",
archive_timeout: "0",
download_timeout: "0",
@ -190,25 +189,6 @@ export default function UploadDownload() {
</FormControl>
</div>
<div className={classes.form}>
<FormControl>
{options.maxEditSize !== "" && (
<SizeInput
value={options.maxEditSize}
onChange={handleChange("maxEditSize")}
required
min={0}
max={2147483647}
label={t("textEditMaxSize")}
/>
)}
<FormHelperText id="component-helper-text">
{t("textEditMaxSizeDes")}
</FormHelperText>
</FormControl>
</div>
<div className={classes.form}>
<FormControl>
<InputLabel htmlFor="component-helper">

View File

@ -23,7 +23,10 @@ i18n.use(ChainedBackend)
escapeValue: false,
},
backend: {
backends: [LocalStorageBackend, Backend],
backends:
process.env.NODE_ENV === "development"
? [Backend]
: [LocalStorageBackend, Backend],
backendOptions: [
{
expirationTime: 7 * 24 * 60 * 60 * 1000, // 7 days