mirror of
https://github.com/usememos/memos.git
synced 2024-09-20 22:46:16 +08:00
feat: add AutoBackupInterval in SystemSetting (#1989)
Add AutoBackupInterval in SystemSetting page
This commit is contained in:
parent
7b5c13b712
commit
336b32004d
|
@ -23,6 +23,8 @@ type SystemStatus struct {
|
|||
DisablePublicMemos bool `json:"disablePublicMemos"`
|
||||
// Max upload size.
|
||||
MaxUploadSizeMiB int `json:"maxUploadSizeMiB"`
|
||||
// Auto Backup Interval.
|
||||
AutoBackupInterval int `json:"autoBackupInterval"`
|
||||
// Additional style.
|
||||
AdditionalStyle string `json:"additionalStyle"`
|
||||
// Additional script.
|
||||
|
@ -50,6 +52,7 @@ func (s *APIV1Service) registerSystemRoutes(g *echo.Group) {
|
|||
AllowSignUp: false,
|
||||
DisablePublicMemos: false,
|
||||
MaxUploadSizeMiB: 32,
|
||||
AutoBackupInterval: 0,
|
||||
AdditionalStyle: "",
|
||||
AdditionalScript: "",
|
||||
CustomizedProfile: CustomizedProfile{
|
||||
|
@ -103,6 +106,8 @@ func (s *APIV1Service) registerSystemRoutes(g *echo.Group) {
|
|||
systemStatus.DisablePublicMemos = baseValue.(bool)
|
||||
case SystemSettingMaxUploadSizeMiBName.String():
|
||||
systemStatus.MaxUploadSizeMiB = int(baseValue.(float64))
|
||||
case SystemSettingAutoBackupIntervalName.String():
|
||||
systemStatus.AutoBackupInterval = int(baseValue.(float64))
|
||||
case SystemSettingAdditionalStyleName.String():
|
||||
systemStatus.AdditionalStyle = baseValue.(string)
|
||||
case SystemSettingAdditionalScriptName.String():
|
||||
|
|
|
@ -4,7 +4,6 @@ import (
|
|||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
|
@ -143,18 +142,12 @@ func (upsert UpsertSystemSettingRequest) Validate() error {
|
|||
return fmt.Errorf(systemSettingUnmarshalError, settingName)
|
||||
}
|
||||
case SystemSettingAutoBackupIntervalName:
|
||||
var value string
|
||||
var value int
|
||||
if err := json.Unmarshal([]byte(upsert.Value), &value); err != nil {
|
||||
return fmt.Errorf(systemSettingUnmarshalError, settingName)
|
||||
}
|
||||
if value != "" {
|
||||
v, err := strconv.Atoi(value)
|
||||
if err != nil {
|
||||
return fmt.Errorf(systemSettingUnmarshalError, settingName)
|
||||
}
|
||||
if v < 0 {
|
||||
return fmt.Errorf("backup interval should > 0")
|
||||
}
|
||||
if value < 0 {
|
||||
return fmt.Errorf("must be positive")
|
||||
}
|
||||
case SystemSettingTelegramBotTokenName:
|
||||
if upsert.Value == "" {
|
||||
|
|
|
@ -17,6 +17,7 @@ interface State {
|
|||
additionalStyle: string;
|
||||
additionalScript: string;
|
||||
maxUploadSizeMiB: number;
|
||||
autoBackupInterval: number;
|
||||
memoDisplayWithUpdatedTs: boolean;
|
||||
}
|
||||
|
||||
|
@ -31,6 +32,7 @@ const SystemSection = () => {
|
|||
additionalScript: systemStatus.additionalScript,
|
||||
disablePublicMemos: systemStatus.disablePublicMemos,
|
||||
maxUploadSizeMiB: systemStatus.maxUploadSizeMiB,
|
||||
autoBackupInterval: systemStatus.autoBackupInterval,
|
||||
memoDisplayWithUpdatedTs: systemStatus.memoDisplayWithUpdatedTs,
|
||||
});
|
||||
const [telegramBotToken, setTelegramBotToken] = useState<string>("");
|
||||
|
@ -57,6 +59,7 @@ const SystemSection = () => {
|
|||
additionalScript: systemStatus.additionalScript,
|
||||
disablePublicMemos: systemStatus.disablePublicMemos,
|
||||
maxUploadSizeMiB: systemStatus.maxUploadSizeMiB,
|
||||
autoBackupInterval: systemStatus.autoBackupInterval,
|
||||
memoDisplayWithUpdatedTs: systemStatus.memoDisplayWithUpdatedTs,
|
||||
});
|
||||
}, [systemStatus]);
|
||||
|
@ -194,6 +197,30 @@ const SystemSection = () => {
|
|||
event.target.select();
|
||||
};
|
||||
|
||||
const handleAutoBackupIntervalChanged = async (event: React.FocusEvent<HTMLInputElement>) => {
|
||||
// fixes cursor skipping position on mobile
|
||||
event.target.selectionEnd = event.target.value.length;
|
||||
|
||||
let num = parseInt(event.target.value);
|
||||
if (Number.isNaN(num)) {
|
||||
num = 0;
|
||||
}
|
||||
setState({
|
||||
...state,
|
||||
autoBackupInterval: num,
|
||||
});
|
||||
event.target.value = num.toString();
|
||||
globalStore.setSystemStatus({ autoBackupInterval: num });
|
||||
await api.upsertSystemSetting({
|
||||
name: "auto-backup-interval",
|
||||
value: JSON.stringify(num),
|
||||
});
|
||||
};
|
||||
|
||||
const handleAutoBackupIntervalFocus = (event: React.FocusEvent<HTMLInputElement>) => {
|
||||
event.target.select();
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="section-container system-section-container">
|
||||
<p className="title-text">{t("common.basic")}</p>
|
||||
|
@ -239,6 +266,23 @@ const SystemSection = () => {
|
|||
onChange={handleMaxUploadSizeChanged}
|
||||
/>
|
||||
</div>
|
||||
<div className="form-label">
|
||||
<div className="flex flex-row items-center">
|
||||
<span className="text-sm mr-1">{t("setting.system-section.auto-backup-interval")}</span>
|
||||
<Tooltip title={t("setting.system-section.auto-backup-interval-hint")} placement="top">
|
||||
<Icon.HelpCircle className="w-4 h-auto" />
|
||||
</Tooltip>
|
||||
</div>
|
||||
<Input
|
||||
className="w-16"
|
||||
sx={{
|
||||
fontFamily: "monospace",
|
||||
}}
|
||||
defaultValue={state.autoBackupInterval}
|
||||
onFocus={handleAutoBackupIntervalFocus}
|
||||
onChange={handleAutoBackupIntervalChanged}
|
||||
/>
|
||||
</div>
|
||||
<Divider className="!mt-3 !my-4" />
|
||||
<div className="form-label">
|
||||
<div className="flex flex-row items-center">
|
||||
|
|
|
@ -260,6 +260,8 @@
|
|||
"disable-public-memos": "Disable public memos",
|
||||
"max-upload-size": "Maximum upload size (MiB)",
|
||||
"max-upload-size-hint": "Recommended value is 32 MiB.",
|
||||
"auto-backup-interval": "Auto backup interval (seconds)",
|
||||
"auto-backup-interval-hint": "Set 0 to disable auto backup. Reboot is required after changing this value.",
|
||||
"additional-style": "Additional style",
|
||||
"additional-script": "Additional script",
|
||||
"additional-style-placeholder": "Additional CSS code",
|
||||
|
|
|
@ -435,6 +435,8 @@
|
|||
"server-name": "服务名称",
|
||||
"max-upload-size-hint": "建议值为 32 MiB。",
|
||||
"max-upload-size": "最大上传大小 (MiB)",
|
||||
"auto-backup-interval": "自动备份间隔(单位:秒)",
|
||||
"auto-backup-interval-hint": "设置为0禁止自动备份,重启后生效",
|
||||
"display-with-updated-time": "Display with updated time"
|
||||
}
|
||||
},
|
||||
|
|
|
@ -13,6 +13,7 @@ export const initialGlobalState = async () => {
|
|||
allowSignUp: false,
|
||||
disablePublicMemos: false,
|
||||
maxUploadSizeMiB: 0,
|
||||
autoBackupInterval: 0,
|
||||
additionalStyle: "",
|
||||
additionalScript: "",
|
||||
memoDisplayWithUpdatedTs: false,
|
||||
|
|
1
web/src/types/modules/system.d.ts
vendored
1
web/src/types/modules/system.d.ts
vendored
|
@ -20,6 +20,7 @@ interface SystemStatus {
|
|||
allowSignUp: boolean;
|
||||
disablePublicMemos: boolean;
|
||||
maxUploadSizeMiB: number;
|
||||
autoBackupInterval: number;
|
||||
additionalStyle: string;
|
||||
additionalScript: string;
|
||||
customizedProfile: CustomizedProfile;
|
||||
|
|
Loading…
Reference in a new issue