diff --git a/kernel/av/av.go b/kernel/av/av.go index 77bcd4d58..e38af8f1c 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -126,6 +126,34 @@ func ParseAttributeView(avID string) (ret *AttributeView, err error) { return } +func ParseAttributeViewMap(avID string) (ret map[string]interface{}, err error) { + ret = map[string]interface{}{} + avJSONPath := getAttributeViewDataPath(avID) + if !gulu.File.IsExist(avJSONPath) { + av := NewAttributeView(avID) + var data []byte + data, err = gulu.JSON.MarshalJSON(av) + if nil == err { + return + } + + err = gulu.JSON.UnmarshalJSON(data, &ret) + return + } + + data, err := filelock.ReadFile(avJSONPath) + if nil != err { + logging.LogErrorf("read attribute view [%s] failed: %s", avID, err) + return + } + + if err = gulu.JSON.UnmarshalJSON(data, &ret); nil != err { + logging.LogErrorf("unmarshal attribute view [%s] failed: %s", avID, err) + return + } + return +} + func SaveAttributeView(av *AttributeView) (err error) { data, err := gulu.JSON.MarshalIndentJSON(av, "", "\t") if nil != err { diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 850e236ad..7d8ef3413 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -19,13 +19,13 @@ package model import ( "errors" "fmt" + "github.com/jinzhu/copier" "sort" "strings" "github.com/88250/gulu" "github.com/88250/lute/ast" "github.com/88250/lute/parse" - "github.com/jinzhu/copier" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/av" "github.com/siyuan-note/siyuan/kernel/sql" @@ -504,22 +504,23 @@ func setAttributeViewColWidth(width, columnID, avID string) (err error) { func setAttributeView(operation *Operation) (err error) { avID := operation.ID - attrView, err := av.ParseAttributeView(avID) + attrViewMap, err := av.ParseAttributeViewMap(avID) if nil != err { return } - data, err := gulu.JSON.MarshalJSON(operation.Data) + operationData := operation.Data.(map[string]interface{}) + if err = copier.Copy(&attrViewMap, operationData); nil != err { + return + } + + data, err := gulu.JSON.MarshalJSON(attrViewMap) if nil != err { return } - newAttrView := &av.AttributeView{} - if err = gulu.JSON.UnmarshalJSON(data, newAttrView); nil != err { - return - } - - if err = copier.Copy(attrView, newAttrView); nil != err { + attrView := &av.AttributeView{} + if err = gulu.JSON.UnmarshalJSON(data, attrView); nil != err { return }