${window.siyuan.languages.cloudSync}
@@ -362,6 +373,17 @@ ${passwordHTML}
}
});
});
+ const syncModeElement = repos.element.querySelector("#syncMode") as HTMLSelectElement;
+ syncModeElement.addEventListener("change", () => {
+ fetchPost("/api/sync/setSyncMode", {mode: parseInt(syncModeElement.value, 10)}, (response) => {
+ if (response.code === 1) {
+ showMessage(response.msg);
+ syncModeElement.value = "1";
+ } else {
+ window.siyuan.config.sync.mode = parseInt(syncModeElement.value, 10);
+ }
+ });
+ });
const loadingElement = repos.element.querySelector("#reposLoading") as HTMLElement;
loadingElement.style.width = repos.element.clientWidth + "px";
loadingElement.style.height = repos.element.clientHeight + "px";
diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts
index bccb0c32c..672ce2f47 100644
--- a/app/src/types/index.d.ts
+++ b/app/src/types/index.d.ts
@@ -242,6 +242,7 @@ declare interface IConfig {
e2eePasswdMode: number
sync: {
enabled: boolean
+ mode: number
synced: number
stat: string
interval: number
diff --git a/kernel/api/router.go b/kernel/api/router.go
index cb7af192d..04cf706e4 100644
--- a/kernel/api/router.go
+++ b/kernel/api/router.go
@@ -163,6 +163,7 @@ func ServeAPI(ginServer *gin.Engine) {
ginServer.Handle("POST", "/api/backup/removeCloudBackup", model.CheckAuth, model.CheckReadonly, removeCloudBackup)
ginServer.Handle("POST", "/api/sync/setSyncEnable", model.CheckAuth, setSyncEnable)
+ ginServer.Handle("POST", "/api/sync/setSyncMode", model.CheckAuth, setSyncMode)
ginServer.Handle("POST", "/api/sync/setCloudSyncDir", model.CheckAuth, setCloudSyncDir)
ginServer.Handle("POST", "/api/sync/createCloudSyncDir", model.CheckAuth, model.CheckReadonly, createCloudSyncDir)
ginServer.Handle("POST", "/api/sync/removeCloudSyncDir", model.CheckAuth, model.CheckReadonly, removeCloudSyncDir)
diff --git a/kernel/api/sync.go b/kernel/api/sync.go
index 3315b6d44..78e882e5f 100644
--- a/kernel/api/sync.go
+++ b/kernel/api/sync.go
@@ -140,6 +140,25 @@ func setSyncEnable(c *gin.Context) {
}
}
+func setSyncMode(c *gin.Context) {
+ ret := gulu.Ret.NewResult()
+ defer c.JSON(http.StatusOK, ret)
+
+ arg, ok := util.JsonArg(c, ret)
+ if !ok {
+ return
+ }
+
+ mode := int(arg["mode"].(float64))
+ err := model.SetSyncMode(mode)
+ if nil != err {
+ ret.Code = 1
+ ret.Msg = err.Error()
+ ret.Data = map[string]interface{}{"closeTimeout": 5000}
+ return
+ }
+}
+
func setCloudSyncDir(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
diff --git a/kernel/conf/sync.go b/kernel/conf/sync.go
index d98ef46c1..506622258 100644
--- a/kernel/conf/sync.go
+++ b/kernel/conf/sync.go
@@ -25,6 +25,7 @@ import (
type Sync struct {
CloudName string `json:"cloudName"` // 云端同步目录名称
Enabled bool `json:"enabled"` // 是否开启同步
+ Mode int `json:"mode"` // 同步模式,0:未设置(为兼容已有配置,initConf 函数中会转换为 1),1:自动,2:手动 https://github.com/siyuan-note/siyuan/issues/5089
Uploaded int64 `json:"uploaded"` // 最近上传时间
Downloaded int64 `json:"downloaded"` // 最近下载时间
Synced int64 `json:"synced"` // 最近同步时间
@@ -35,6 +36,7 @@ func NewSync() *Sync {
return &Sync{
CloudName: "main",
Enabled: true,
+ Mode: 1,
}
}
diff --git a/kernel/model/conf.go b/kernel/model/conf.go
index 445854665..987af968c 100644
--- a/kernel/model/conf.go
+++ b/kernel/model/conf.go
@@ -214,6 +214,9 @@ func InitConf() {
util.LogErrorf("create sync dir [%s] failed: %s", Conf.Sync.GetSaveDir(), err)
}
}
+ if 0 == Conf.Sync.Mode {
+ Conf.Sync.Mode = 1
+ }
if nil == Conf.Api {
Conf.Api = conf.NewAPI()
diff --git a/kernel/model/sync.go b/kernel/model/sync.go
index 15339f2b0..fbe493455 100644
--- a/kernel/model/sync.go
+++ b/kernel/model/sync.go
@@ -513,6 +513,15 @@ func SetSyncEnable(b bool) (err error) {
return
}
+func SetSyncMode(mode int) (err error) {
+ syncLock.Lock()
+ defer syncLock.Unlock()
+
+ Conf.Sync.Mode = mode
+ Conf.Save()
+ return
+}
+
var syncLock = sync.Mutex{}
func syncDirUpsertWorkspaceData(downloadedFiles []string) (err error) {