feat: add AutoBackupInterval in SystemSetting (#1989)

Add AutoBackupInterval in SystemSetting page
This commit is contained in:
Athurg Gooth 2023-07-19 21:39:21 +08:00 committed by GitHub
parent 7b5c13b712
commit 336b32004d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 58 additions and 10 deletions

View file

@ -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():

View file

@ -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 == "" {

View file

@ -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">

View file

@ -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",

View file

@ -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"
}
},

View file

@ -13,6 +13,7 @@ export const initialGlobalState = async () => {
allowSignUp: false,
disablePublicMemos: false,
maxUploadSizeMiB: 0,
autoBackupInterval: 0,
additionalStyle: "",
additionalScript: "",
memoDisplayWithUpdatedTs: false,

View file

@ -20,6 +20,7 @@ interface SystemStatus {
allowSignUp: boolean;
disablePublicMemos: boolean;
maxUploadSizeMiB: number;
autoBackupInterval: number;
additionalStyle: string;
additionalScript: string;
customizedProfile: CustomizedProfile;