diff --git a/kernel/api/block_op.go b/kernel/api/block_op.go index 469cfbf36..446dd0f01 100644 --- a/kernel/api/block_op.go +++ b/kernel/api/block_op.go @@ -29,6 +29,126 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func unfoldBlock(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + id := arg["id"].(string) + if util.InvalidIDPattern(id, ret) { + return + } + + bt := treenode.GetBlockTree(id) + if nil == bt { + ret.Code = -1 + ret.Msg = "block tree not found [id=" + id + "]" + return + } + + if bt.Type == "d" { + ret.Code = -1 + ret.Msg = "document can not be unfolded" + return + } + + var transactions []*model.Transaction + if "h" == bt.Type { + transactions = []*model.Transaction{ + { + DoOperations: []*model.Operation{ + { + Action: "unfoldHeading", + ID: id, + }, + }, + }, + } + } else { + data, _ := gulu.JSON.MarshalJSON(map[string]interface{}{"unfold": "1"}) + transactions = []*model.Transaction{ + { + DoOperations: []*model.Operation{ + { + Action: "setAttrs", + ID: id, + Data: string(data), + }, + }, + }, + } + } + + model.PerformTransactions(&transactions) + model.WaitForWritingFiles() + + broadcastTransactions(transactions) +} + +func foldBlock(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + id := arg["id"].(string) + if util.InvalidIDPattern(id, ret) { + return + } + + bt := treenode.GetBlockTree(id) + if nil == bt { + ret.Code = -1 + ret.Msg = "block tree not found [id=" + id + "]" + return + } + + if bt.Type == "d" { + ret.Code = -1 + ret.Msg = "document can not be folded" + return + } + + var transactions []*model.Transaction + if "h" == bt.Type { + transactions = []*model.Transaction{ + { + DoOperations: []*model.Operation{ + { + Action: "foldHeading", + ID: id, + }, + }, + }, + } + } else { + data, _ := gulu.JSON.MarshalJSON(map[string]interface{}{"fold": "1"}) + transactions = []*model.Transaction{ + { + DoOperations: []*model.Operation{ + { + Action: "setAttrs", + ID: id, + Data: string(data), + }, + }, + }, + } + } + + model.PerformTransactions(&transactions) + model.WaitForWritingFiles() + + broadcastTransactions(transactions) +} + func moveBlock(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/api/router.go b/kernel/api/router.go index e3b5ff7df..fa2c50019 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -181,6 +181,8 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/block/updateBlock", model.CheckAuth, model.CheckReadonly, updateBlock) ginServer.Handle("POST", "/api/block/deleteBlock", model.CheckAuth, model.CheckReadonly, deleteBlock) ginServer.Handle("POST", "/api/block/moveBlock", model.CheckAuth, model.CheckReadonly, moveBlock) + ginServer.Handle("POST", "/api/block/foldBlock", model.CheckAuth, model.CheckReadonly, foldBlock) + ginServer.Handle("POST", "/api/block/unfoldBlock", model.CheckAuth, model.CheckReadonly, unfoldBlock) ginServer.Handle("POST", "/api/block/setBlockReminder", model.CheckAuth, model.CheckReadonly, setBlockReminder) ginServer.Handle("POST", "/api/block/getHeadingLevelTransaction", model.CheckAuth, getHeadingLevelTransaction) ginServer.Handle("POST", "/api/block/getHeadingDeleteTransaction", model.CheckAuth, getHeadingDeleteTransaction)