From 916c00e714cf696e79a341c63cae56a79e11645c Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 21 Aug 2025 09:55:11 +0800 Subject: [PATCH] :art: The database template field supports using other template fields https://github.com/siyuan-note/siyuan/issues/15517 --- kernel/av/av.go | 23 +++++++---------------- kernel/sql/av.go | 18 +++++++++++++----- kernel/sql/av_gallery.go | 2 +- kernel/sql/av_table.go | 2 +- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index e29ac5375..17dcbff4e 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -26,7 +26,6 @@ import ( "github.com/88250/gulu" "github.com/88250/lute/ast" - "github.com/jinzhu/copier" jsoniter "github.com/json-iterator/go" "github.com/siyuan-note/filelock" "github.com/siyuan-note/logging" @@ -35,14 +34,13 @@ import ( // AttributeView 描述了属性视图的结构。 type AttributeView struct { - Spec int `json:"spec"` // 格式版本 - ID string `json:"id"` // 属性视图 ID - Name string `json:"name"` // 属性视图名称 - KeyValues []*KeyValues `json:"keyValues"` // 属性视图属性键值 - OriginalKeyValues []*KeyValues `json:"-"` // 原始属性视图属性键值 - KeyIDs []string `json:"keyIDs"` // 属性视图属性键 ID,用于排序 - ViewID string `json:"viewID"` // 当前视图 ID - Views []*View `json:"views"` // 视图 + Spec int `json:"spec"` // 格式版本 + ID string `json:"id"` // 属性视图 ID + Name string `json:"name"` // 属性视图名称 + KeyValues []*KeyValues `json:"keyValues"` // 属性视图属性键值 + KeyIDs []string `json:"keyIDs"` // 属性视图属性键 ID,用于排序 + ViewID string `json:"viewID"` // 当前视图 ID + Views []*View `json:"views"` // 视图 } // KeyValues 描述了属性视图属性键值列表的结构。 @@ -472,13 +470,6 @@ func ParseAttributeView(avID string) (ret *AttributeView, err error) { return } } - - ret.OriginalKeyValues = []*KeyValues{} - for _, keyValues := range ret.KeyValues { - cloned := &KeyValues{} - copier.CopyWithOption(cloned, keyValues, copier.Option{DeepCopy: true}) - ret.OriginalKeyValues = append(ret.OriginalKeyValues, cloned) - } return } diff --git a/kernel/sql/av.go b/kernel/sql/av.go index 2054acd15..9eaa242de 100644 --- a/kernel/sql/av.go +++ b/kernel/sql/av.go @@ -249,7 +249,7 @@ func RenderTemplateField(ial map[string]string, keyValues []*av.KeyValues, tplCo func generateAttrViewItems(attrView *av.AttributeView, view *av.View) (ret map[string][]*av.KeyValues) { ret = map[string][]*av.KeyValues{} - for _, keyValues := range attrView.OriginalKeyValues { + for _, keyValues := range attrView.KeyValues { for _, val := range keyValues.Values { values := ret[val.BlockID] if nil == values { @@ -533,17 +533,25 @@ func fillAttributeViewTemplateValues(attrView *av.AttributeView, view *av.View, func fillAttributeViewKeyValues(attrView *av.AttributeView, collection av.Collection) { fieldValues := map[string][]*av.Value{} - for _, card := range collection.GetItems() { - for _, val := range card.GetValues() { + for _, item := range collection.GetItems() { + for _, val := range item.GetValues() { keyID := val.KeyID fieldValues[keyID] = append(fieldValues[keyID], val) } } for keyID, values := range fieldValues { keyValues, _ := attrView.GetKeyValues(keyID) - keyValues.Values = nil for _, val := range values { - keyValues.Values = append(keyValues.Values, val) + exist := false + for _, kv := range keyValues.Values { + if kv.ID == val.ID { + exist = true + break + } + } + if !exist { + keyValues.Values = append(keyValues.Values, val) + } } } } diff --git a/kernel/sql/av_gallery.go b/kernel/sql/av_gallery.go index 2a0835858..cf9c6fe9a 100644 --- a/kernel/sql/av_gallery.go +++ b/kernel/sql/av_gallery.go @@ -120,7 +120,7 @@ func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query // 渲染自动生成的字段值,比如关联、汇总、创建时间和更新时间 fillAttributeViewAutoGeneratedValues(attrView, ret, ials, depth, renderedAttrViews) - // 最后单独渲染模板字段,这样模板就可以使用汇总、关联、创建时间和更新时间的值了 + // 最后渲染模板字段,这样模板就可以使用汇总、关联、创建时间和更新时间的值了 renderTemplateErr := fillAttributeViewTemplateValues(attrView, view, ret, ials) if nil != renderTemplateErr { util.PushErrMsg(fmt.Sprintf(util.Langs[util.Lang][44], util.EscapeHTML(renderTemplateErr.Error())), 30000) diff --git a/kernel/sql/av_table.go b/kernel/sql/av_table.go index 138a8832f..a4ec11293 100644 --- a/kernel/sql/av_table.go +++ b/kernel/sql/av_table.go @@ -113,7 +113,7 @@ func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s // 渲染自动生成的字段值,比如关联、汇总、创建时间和更新时间 fillAttributeViewAutoGeneratedValues(attrView, ret, ials, depth, renderedAttrViews) - // 最后单独渲染模板字段,这样模板就可以使用汇总、关联、创建时间和更新时间的值了 + // 最后渲染模板字段,这样模板就可以使用汇总、关联、创建时间和更新时间的值了 renderTemplateErr := fillAttributeViewTemplateValues(attrView, view, ret, ials) if nil != renderTemplateErr { util.PushErrMsg(fmt.Sprintf(util.Langs[util.Lang][44], util.EscapeHTML(renderTemplateErr.Error())), 30000)