diff --git a/kernel/api/av.go b/kernel/api/av.go index 5e9b68385..4323a5b80 100644 --- a/kernel/api/av.go +++ b/kernel/api/av.go @@ -62,3 +62,17 @@ func renderAttributeView(c *gin.Context) { "view": view, } } + +func getAttributeViewKeys(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) + blockAttributeViewKeys := model.GetBlockAttributeViewKeys(id) + ret.Data = blockAttributeViewKeys +} diff --git a/kernel/api/router.go b/kernel/api/router.go index ada345855..8ebb5568d 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -359,6 +359,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("GET", "/snippets/*filepath", serveSnippets) ginServer.Handle("POST", "/api/av/renderAttributeView", model.CheckAuth, renderAttributeView) + ginServer.Handle("POST", "/api/av/getAttributeViewKeys", model.CheckAuth, getAttributeViewKeys) ginServer.Handle("POST", "/api/ai/chatGPT", model.CheckAuth, model.CheckReadonly, chatGPT) ginServer.Handle("POST", "/api/ai/chatGPTWithAction", model.CheckAuth, model.CheckReadonly, chatGPTWithAction) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 40fe32d96..ff587ae33 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -30,6 +30,62 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +type BlockAttributeViewKeys struct { + AvID string `json:"avID"` + AvName string `json:"avName"` + KeyValues []*av.KeyValues `json:"keyValues"` +} + +func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) { + waitForSyncingStorages() + + ret = []*BlockAttributeViewKeys{} + attrs := GetBlockAttrs(blockID) + avs := attrs[NodeAttrNameAvs] + if "" == avs { + return + } + + avIDs := strings.Split(avs, ",") + for _, avID := range avIDs { + attrView, err := av.ParseAttributeView(avID) + if nil != err { + logging.LogErrorf("parse attribute view [%s] failed: %s", avID, err) + return + } + + if 1 > len(attrView.Views) { + err = av.ErrViewNotFound + return + } + + var keyValues []*av.KeyValues + for _, kv := range attrView.KeyValues { + if av.KeyTypeBlock == kv.Key.Type { + continue + } + + kValues := &av.KeyValues{Key: kv.Key} + for _, v := range kv.Values { + if v.BlockID == blockID { + kValues.Values = append(kValues.Values, v) + } + } + + if 0 < len(kValues.Values) { + keyValues = append(keyValues, kValues) + } + } + + ret = append(ret, &BlockAttributeViewKeys{ + AvID: avID, + AvName: attrView.Name, + KeyValues: keyValues, + }) + } + return +} + func RenderAttributeView(avID string) (viewable av.Viewable, attrView *av.AttributeView, err error) { waitForSyncingStorages()