mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-16 14:40:12 +01:00
🐛 The rollup field in the attribute panel is calculated incorrectly https://github.com/siyuan-note/siyuan/issues/16346
Signed-off-by: Daniel <845765@qq.com>
This commit is contained in:
parent
092c9829fc
commit
34a01e456f
1 changed files with 9 additions and 162 deletions
|
|
@ -1636,6 +1636,14 @@ func GetBlockAttributeViewKeys(nodeID string) (ret []*BlockAttributeViewKeys) {
|
|||
}
|
||||
|
||||
itemID := blockVal.BlockID
|
||||
view, err := getRenderAttributeViewView(attrView, "", nodeID)
|
||||
if nil != err {
|
||||
continue
|
||||
}
|
||||
|
||||
// 渲染填充 attrView.KeyValues
|
||||
sql.RenderView(attrView, view, "")
|
||||
|
||||
var keyValues []*av.KeyValues
|
||||
for _, kv := range attrView.KeyValues {
|
||||
if av.KeyTypeLineNumber == kv.Key.Type {
|
||||
|
|
@ -1651,168 +1659,7 @@ func GetBlockAttributeViewKeys(nodeID string) (ret []*BlockAttributeViewKeys) {
|
|||
}
|
||||
}
|
||||
|
||||
switch kValues.Key.Type {
|
||||
case av.KeyTypeRollup:
|
||||
kValues.Values = append(kValues.Values, &av.Value{ID: ast.NewNodeID(), KeyID: kValues.Key.ID, BlockID: itemID, Type: av.KeyTypeRollup, Rollup: &av.ValueRollup{Contents: []*av.Value{}}})
|
||||
case av.KeyTypeTemplate:
|
||||
kValues.Values = append(kValues.Values, &av.Value{ID: ast.NewNodeID(), KeyID: kValues.Key.ID, BlockID: itemID, Type: av.KeyTypeTemplate, Template: &av.ValueTemplate{Content: ""}})
|
||||
case av.KeyTypeCreated:
|
||||
kValues.Values = append(kValues.Values, &av.Value{ID: ast.NewNodeID(), KeyID: kValues.Key.ID, BlockID: itemID, Type: av.KeyTypeCreated})
|
||||
case av.KeyTypeUpdated:
|
||||
kValues.Values = append(kValues.Values, &av.Value{ID: ast.NewNodeID(), KeyID: kValues.Key.ID, BlockID: itemID, Type: av.KeyTypeUpdated})
|
||||
case av.KeyTypeNumber:
|
||||
for _, v := range kValues.Values {
|
||||
if nil != v.Number {
|
||||
v.Number.Format = kValues.Key.NumberFormat
|
||||
v.Number.FormatNumber()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if 0 < len(kValues.Values) {
|
||||
for _, v := range kValues.Values {
|
||||
sql.FillAttributeViewNilValue(v, v.Type)
|
||||
}
|
||||
keyValues = append(keyValues, kValues)
|
||||
} else {
|
||||
// 如果没有值,那么就补一个默认值
|
||||
kValues.Values = append(kValues.Values, av.GetAttributeViewDefaultValue(itemID[:14]+ast.NewNodeID()[14:], kv.Key.ID, itemID, kv.Key.Type, false))
|
||||
keyValues = append(keyValues, kValues)
|
||||
}
|
||||
}
|
||||
|
||||
// 渲染主键、创建时间、更新时间
|
||||
for _, kv := range keyValues {
|
||||
switch kv.Key.Type {
|
||||
case av.KeyTypeBlock: // 对于主键可能需要填充静态锚文本 Database-bound block primary key supports setting static anchor text https://github.com/siyuan-note/siyuan/issues/10049
|
||||
if nil != kv.Values[0].Block {
|
||||
ial := sql.GetBlockAttrs(nodeID)
|
||||
if v := ial[av.NodeAttrViewStaticText+"-"+attrView.ID]; "" != v {
|
||||
kv.Values[0].Block.Content = v
|
||||
}
|
||||
}
|
||||
case av.KeyTypeCreated:
|
||||
isNotTime := false
|
||||
if nil != kv.Key && nil != kv.Key.Created {
|
||||
isNotTime = !kv.Key.Created.IncludeTime
|
||||
}
|
||||
|
||||
createdStr := nodeID[:len("20060102150405")]
|
||||
created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
|
||||
if nil == parseErr {
|
||||
kv.Values[0].Created = av.NewFormattedValueCreated(created.UnixMilli(), 0, av.CreatedFormatNone, isNotTime)
|
||||
kv.Values[0].Created.IsNotEmpty = true
|
||||
} else {
|
||||
logging.LogWarnf("parse created [%s] failed: %s", createdStr, parseErr)
|
||||
kv.Values[0].Created = av.NewFormattedValueCreated(time.Now().UnixMilli(), 0, av.CreatedFormatNone, isNotTime)
|
||||
}
|
||||
case av.KeyTypeUpdated:
|
||||
isNotTime := false
|
||||
if nil != kv.Key && nil != kv.Key.Updated {
|
||||
isNotTime = !kv.Key.Updated.IncludeTime
|
||||
}
|
||||
|
||||
ial := sql.GetBlockAttrs(nodeID)
|
||||
updatedStr := ial["updated"]
|
||||
updated, parseErr := time.ParseInLocation("20060102150405", updatedStr, time.Local)
|
||||
if nil == parseErr {
|
||||
kv.Values[0].Updated = av.NewFormattedValueUpdated(updated.UnixMilli(), 0, av.UpdatedFormatNone, isNotTime)
|
||||
kv.Values[0].Updated.IsNotEmpty = true
|
||||
} else {
|
||||
logging.LogWarnf("parse updated [%s] failed: %s", updatedStr, parseErr)
|
||||
kv.Values[0].Updated = av.NewFormattedValueUpdated(time.Now().UnixMilli(), 0, av.UpdatedFormatNone, isNotTime)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 渲染关联和汇总
|
||||
rollupFurtherCollections := sql.GetFurtherCollections(attrView, cachedAttrViews)
|
||||
for _, kv := range keyValues {
|
||||
switch kv.Key.Type {
|
||||
case av.KeyTypeRollup:
|
||||
if nil == kv.Key.Rollup {
|
||||
break
|
||||
}
|
||||
|
||||
relKey, _ := attrView.GetKey(kv.Key.Rollup.RelationKeyID)
|
||||
if nil == relKey {
|
||||
break
|
||||
}
|
||||
|
||||
relVal := attrView.GetValue(kv.Key.Rollup.RelationKeyID, kv.Values[0].BlockID)
|
||||
if nil != relVal && nil != relVal.Relation {
|
||||
destAv := cachedAttrViews[relKey.Relation.AvID]
|
||||
if nil == destAv {
|
||||
destAv, _ = av.ParseAttributeView(relKey.Relation.AvID)
|
||||
if nil == destAv {
|
||||
break
|
||||
}
|
||||
cachedAttrViews[relKey.Relation.AvID] = destAv
|
||||
}
|
||||
|
||||
destKey, _ := destAv.GetKey(kv.Key.Rollup.KeyID)
|
||||
if nil != destKey {
|
||||
furtherCollection := rollupFurtherCollections[kv.Key.ID]
|
||||
kv.Values[0].Rollup.BuildContents(keyValues, destKey, relVal, kv.Key.Rollup.Calc, furtherCollection)
|
||||
}
|
||||
}
|
||||
case av.KeyTypeRelation:
|
||||
if nil == kv.Key.Relation {
|
||||
break
|
||||
}
|
||||
|
||||
destAv := cachedAttrViews[kv.Key.Relation.AvID]
|
||||
if nil == destAv {
|
||||
destAv, _ = av.ParseAttributeView(kv.Key.Relation.AvID)
|
||||
if nil == destAv {
|
||||
break
|
||||
}
|
||||
|
||||
cachedAttrViews[kv.Key.Relation.AvID] = destAv
|
||||
}
|
||||
|
||||
blocks := map[string]*av.Value{}
|
||||
for _, blockValue := range destAv.GetBlockKeyValues().Values {
|
||||
blocks[blockValue.BlockID] = blockValue
|
||||
}
|
||||
kv.Values[0].Relation.Contents = nil // 先清空 https://github.com/siyuan-note/siyuan/issues/10670
|
||||
for _, bID := range kv.Values[0].Relation.BlockIDs {
|
||||
kv.Values[0].Relation.Contents = append(kv.Values[0].Relation.Contents, blocks[bID])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 渲染模板
|
||||
templateKeys, _ := sql.GetTemplateKeysByResolutionOrder(attrView)
|
||||
var renderTemplateErr error
|
||||
for _, templateKey := range templateKeys {
|
||||
for _, kv := range keyValues {
|
||||
if kv.Key.ID != templateKey.ID || 1 > len(kv.Values) {
|
||||
continue
|
||||
}
|
||||
|
||||
var ial map[string]string
|
||||
block := av.GetKeyBlockValue(keyValues)
|
||||
if nil != block && !block.IsDetached {
|
||||
ial = sql.GetBlockAttrs(block.BlockID)
|
||||
}
|
||||
if nil == ial {
|
||||
ial = map[string]string{}
|
||||
}
|
||||
if nil == kv.Values[0].Template {
|
||||
kv.Values[0] = av.GetAttributeViewDefaultValue(kv.Values[0].ID, kv.Key.ID, nodeID, kv.Key.Type, false)
|
||||
}
|
||||
|
||||
var renderErr error
|
||||
kv.Values[0].Template.Content, renderErr = sql.RenderTemplateField(ial, keyValues, kv.Key.Template)
|
||||
if nil != renderErr {
|
||||
renderTemplateErr = fmt.Errorf("database [%s] template field [%s] rendering failed: %s", getAttrViewName(attrView), kv.Key.Name, renderErr)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if nil != renderTemplateErr {
|
||||
util.PushErrMsg(fmt.Sprintf(Conf.Language(44), util.EscapeHTML(renderTemplateErr.Error())), 30000)
|
||||
keyValues = append(keyValues, kValues)
|
||||
}
|
||||
|
||||
// 字段排序
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue