diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 5ec309928..1aa75fab0 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -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) } // 字段排序