Browse Source

:art: Database block support specified view https://github.com/siyuan-note/siyuan/issues/10443

Daniel 1 year ago
parent
commit
83dca3f853
4 changed files with 45 additions and 3 deletions
  1. 20 0
      kernel/api/av.go
  2. 1 0
      kernel/api/router.go
  3. 2 1
      kernel/av/av.go
  4. 22 2
      kernel/model/attribute_view.go

+ 20 - 0
kernel/api/av.go

@@ -26,6 +26,26 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
+func setDatabaseBlockView(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	arg, ok := util.JsonArg(c, ret)
+	if !ok {
+		return
+	}
+
+	blockID := arg["id"].(string)
+	viewID := arg["viewID"].(string)
+
+	err := model.SetDatabaseBlockView(blockID, viewID)
+	if nil != err {
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+}
+
 func getAttributeViewPrimaryKeyValues(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)

+ 1 - 0
kernel/api/router.go

@@ -410,6 +410,7 @@ func ServeAPI(ginServer *gin.Engine) {
 	ginServer.Handle("POST", "/api/av/addAttributeViewValues", model.CheckAuth, model.CheckReadonly, addAttributeViewValues)
 	ginServer.Handle("POST", "/api/av/removeAttributeViewValues", model.CheckAuth, model.CheckReadonly, removeAttributeViewValues)
 	ginServer.Handle("POST", "/api/av/getAttributeViewPrimaryKeyValues", model.CheckAuth, model.CheckReadonly, getAttributeViewPrimaryKeyValues)
+	ginServer.Handle("POST", "/api/av/setDatabaseBlockView", model.CheckAuth, model.CheckReadonly, setDatabaseBlockView)
 
 	ginServer.Handle("POST", "/api/ai/chatGPT", model.CheckAuth, chatGPT)
 	ginServer.Handle("POST", "/api/ai/chatGPTWithAction", model.CheckAuth, chatGPTWithAction)

+ 2 - 1
kernel/av/av.go

@@ -524,5 +524,6 @@ var (
 )
 
 const (
-	NodeAttrNameAvs = "custom-avs" // 用于标记块所属的属性视图,逗号分隔 av id
+	NodeAttrNameAvs = "custom-avs"     // 用于标记块所属的属性视图,逗号分隔 av id
+	NodeAttrView    = "custom-av-view" // 用于标记块所属的属性视图视图 view id Database block support specified view https://github.com/siyuan-note/siyuan/issues/10443
 )

+ 22 - 2
kernel/model/attribute_view.go

@@ -38,6 +38,22 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
+func SetDatabaseBlockView(blockID, viewID string) (err error) {
+	node, tree, err := getNodeByBlockID(nil, blockID)
+	if nil != err {
+		return
+	}
+
+	attrs := parse.IAL2Map(node.KramdownIAL)
+	attrs[av.NodeAttrView] = viewID
+	err = setNodeAttrs(node, tree, attrs)
+	if nil != err {
+		logging.LogWarnf("set node [%s] attrs failed: %s", blockID, err)
+		return
+	}
+	return
+}
+
 func GetAttributeViewPrimaryKeyValues(avID string, page, pageSize int) (attributeViewName string, keyValues *av.KeyValues, err error) {
 	waitForSyncingStorages()
 
@@ -564,8 +580,12 @@ func renderAttributeView(attrView *av.AttributeView, viewID string, page, pageSi
 	var view *av.View
 	if "" != viewID {
 		view = attrView.GetView(viewID)
-		if nil != view && viewID != attrView.ViewID {
-			attrView.ViewID = viewID
+		if nil == view {
+			view, _ = attrView.GetCurrentView()
+		}
+
+		if nil != view && view.ID != attrView.ViewID {
+			attrView.ViewID = view.ID
 			if err = av.SaveAttributeView(attrView); nil != err {
 				logging.LogErrorf("save attribute view [%s] failed: %s", attrView.ID, err)
 				return